# stm32教程 **Repository Path**: Canrad/stm32-tutorial ## Basic Information - **Project Name**: stm32教程 - **Description**: STM32教程,持续更新 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-05-19 - **Last Updated**: 2024-05-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 如何学习单片机 以STM32为例 ## 前言 我第一次学习stm32的时候是在大二上的时候,那时候电赛延期,我们11月份比赛,当时结果很不理想,当时的实验室老师为了筛选有实力的人就进行了实验室内PK,题目就是基于stm32独立完成一辆小车。我当时用了十几天的时间将stm32的一些基础外设调通并造出小车。此后我也参加了一些比赛,使用stm32变得更加频繁。除此之外我也教了一些学弟如何学习stm32,在和他们沟通的同时也会思考关于stm32学习的方法。之后,我就结合我直接学习和学弟的学习,大概找到了一套学习stm32的方法,也适用于其他单片机的学习。 ## 前置学习 在学习stm32和其他单片机之前,需要至少具备这些知识: 1. 一定的C语言能力,基本的用法应该精通(*结构体和指针*都得会,C语言的*位操作*)。最好有写一个小项目的经验(100+行以上最起码,对新手来说算是合格)。 2. 一些基础电路知识,至少到时候接线别乱接(之前有学弟发光二极管两端直接正负极的,发光二极管直接炸了) 3. 数电知识,*二进制运算形式*(与,或,非,异或这些,最重要)及一些数字电路模型(基本触发器等,了解为主)。 4. 少许数学知识和算法,有的时候写程序会用到 如果暂时不画或设计板子,这些知识就够了。 ## 如何开始 如果上面这些知识都具备了,那么就可以开始学习了。 首先我们要做两件事情: 1. 买板子 2. 搭环境 这些要是做完了,那就跳到[下一步](#开始学起来了) 还没开始的,我接下来会分别介绍。 ### 买板子 首先要学习stm32,需要一块板子,如果借不到板子,就得自己买一块板子。 新手不要买搭载国产stm32芯片的板子,容易踩坑。 最小系统板是一个选择,淘宝上30不到一块,再配个面包板,常用元器件实验室有。(还是有待商榷,还是要看实验室元器件到底够不够) 推荐[stm32f411ceu6最小系统板](https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17867322830.11.7cb43779DkaGg2&id=594670660262)性能强 或者买[stm32f103c8t6最小系统板](https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17867322830.29.7cb43779DkaGg2&id=690610421233&mt=)也可,比较经典 ~~如果实验室元器件不够用,那就买一块大板子,大板子最好去大厂家买,比如*正点原子*和*野火*两家卖板子的商家,都可以考虑(个人偏向于正点原子),但不要买他们家的最小系统板,纯纯的溢价,虽然大板子也溢价。~~ 买个锤子大板子,纯纯的溢价,加上用不着几个外设,不建议买新的,不如闲鱼(写到一半再去看淘宝后被厂家的设计气晕)。不如买最小系统板,元器件缺啥买啥,比赛也用得到。 除了板子,再买一个调试器也是有必要的,推荐使用DAP调试器,开源且泛用性强。 推荐[DAP调试器](https://item.taobao.com/item.htm?spm=a1z0k.7386009.0.0.413937deyqD9pl&id=586425846353&_u=d202a6h25ib0b4),这是一个开源调试器,还自带串口转USB,非常之方便,我自己也用。 ### 搭环境 然后是搭开发环境环节,现在主流开发的stm32开发库有标准库和HAL库两种,我觉得直接学HAL库问题也不大,而且好上手,不容易劝退。 开发环境推荐使用keil5+vscode+cubemx(网上有配置教程,疑难杂症找学长,配置得心态爆炸找学长),iar不建议使用,没keil好用。*新手不建议花里胡哨,确实有不少其他办法*。先脚踏实地,把代码写出来且会用,才是最基本的。 ## 开始学起来了 环境配好了,板子也有了。接下来就开始学了。 当时我学习stm32的时候是带着造一辆小车的任务学的,循序渐进,这样学习的方向和动力都有。一个大任务可以拆成几个小任务,每个小任务都用一种元器件驱动,比如点亮一盏灯,识别一个开关的状态,这两个小任务所要用到的知识都不一样,点亮一盏灯需要用到GPIO的输入功能,而识别一个开关的状态需要用到GPIO的输出功能。我一步步地达到这些小功能,最后慢慢实现一个大的功能。最后实现目标的时候,学的也差不多了。 我推荐的学习任务:自动巡线避障小车 目标:在巡线模式下可以让小车行驶沿着黑线行驶,并且可以自主避障。也可以通过蓝牙控制小车移动,当做一个遥控车。更多的功能可以自由发挥,比如加装OLED屏幕显示工作状态。或者加装陀螺仪模块显示其角度状态。或者加装一个180度舵机,可以检测两边是否也有障碍物。 需要的元器件及功能: 1. LED:显示其工作状态 2. 按键:控制其启动 3. 蓝牙模块:手动控制小车并获取小车状态 4. 电机:控制小车运动 5. 避障模块:可以使用超声波或红外测距模块 6. 陀螺仪*:测量角度状态 7. OLED屏幕*:通过屏幕显示工作状态 9. 180度舵机*:可以检测两边是否也有障碍物 8. .... 还有更多的功能可以自己加 然后以此可以得到几个小任务与对应要学的知识: 1. 点亮一个LED灯(GPIO输出) 2. 跑马灯,即依次按顺序点亮LED组(GPIO输出,延时函数的使用) 3. 按键控制LED亮灭 (GPIO输出功能) 4. 读取编码器的脉冲,每读取一次LED就按顺序点亮一个 (外部中断,其实用定时器也可以读,先用外部中断读) 5. 串口读取helloworld!(了解UART) 6. 蓝牙模块的使用,使用左右键控制LED(UART中断,需要APP蓝牙调试器,安装包我有) 7. 统计一段时间内编码器脉冲数,并在串口上打印(定时器中断) 8. 舵机角度控制(PWM控制) 9. 直流电机控制(PWM控制与GPIO配合控制) 10. 避障模块读取距离并在串口打印:红外(ADC),超声波(定时器捕获) 11. 实现小车基本功能 12. *陀螺仪读取角度并通过串口打印(I2C,建议先使用软件I2C实现,了解协议,再使用库来实现) 13. *将几个外设分别写成几个函数(模块化程序) 14. **OLED显示(I2C或SPI,如果是SPI的话也可以先使用软件SPI来实现,并考验第三方库的使用能力) 15. **调节小车匀速前进(PID算法) 16. ***试着让几个任务并行(FreeRTOS) 17. 更多其他功能... 这样一辆小车做下来,你的stm32水平一定会上升不少。尤其是后面几个高难度任务,更加体现知识的扎实程度。 这些会做了,那么接一个比赛也会变得更加从容。 剩下的就是通过比赛不断地巩固和积累经验了。 叠个甲,以上内容仅供参考,具体看自身情况。 666