上手思路,第一步先查芯片datasheet,一切以官网资料为准,可以在STM32 Cube MX软件里选择 ACCESS TO MCU SELECTOR ,在左上角输入 STM32F103C8后,点击 datasheet 自动打开 芯片手册,点击另存为保存到桌面慢慢看。1看封装,2看供电,3看GPIO,4看中断,FLASH大小+USART也瞅瞅看。建议先搜个官方开发板原理图混个脸熟,软件项目文件打开后先编译一遍能否 0 error (s) 0 warning(s)。
最小系统,3.3V供电电路(2.0-3.6V)+复位电路(低电平复位)+8M晶振 + 启动选择电路(BOOT0 、BOOT1)+调试下载SWD接口(PA13、PA14)。
STM32芯片有三种启动方式:1闪存FLASH(BOOT0=0,B00T1=X),这个用的最多,STM32F103C8T6中64K FLASH就是这个FLASH;2 系统存储器启动(BOOT0=1,B00T1=0),用串口给STM32下载程序时用这个方式(仅限于UART1,STM32别的串口不支持下载程序),3 SRAM启动(BOOT0=1,BOOT1=1),芯片内RAM启动,掉电丢失(用的很少)。切换STM32启动方式跳帽后,重新上电才起作用,通着电直接切换无效。
STM32串口下载保姆式教程:
1核实串口助手是否安装好驱动,TXD、RXD短接后能发能收证明串口助手没问题,串口助手调节好3.3V电压;
2先调节好STM32开发板BOOT0=1,BOOT1=0跳帽,然后把串助手的TXD接开发板PA10,RXD接PA9,再通电把串口助手插入电脑USB口;
3打开STM32CubeProgrammer, 选择右上角的“UART”选项(默认是ST-LINK),在下面的Port里选择对应的COM 口,一般那个COM1不是串口助手的,COM3 或者COM4啥的大概率是正确的COM口,点击 Connect成功后会提示绿灯(Conneted),然后打开目标HEX文件下载即可。
注:下载完毕后还需要把BOOT跳帽恢复到BOOT0 = 0,BOOT1=X(0、1均可),才能正常从FLASH里启动程序。平时开发调试用的最多的还是SWD方式连接四根线:VCC、GND、DIO(PA13)、CLK(PA14)。
开发方式,汇编语言很少用了,51、以及STM32的启动文件(STARTUP.A51、startup_stm32f103xb.s)是汇编语言编写的,这俩文件是官方提供,用户一般也不会改这里面的参数;用C语言操作寄存器,太累+耗时间,我听过一个真实的段子,某个工科大学举办电子设计大赛,有个老铁技术很彪悍,不用官方库自己写寄存器,结果因为太耗时间,库还没写完初赛就被淘汰了。。。
标准库开发属于ST官方第一代开发方式,当年32bit MCU刚刚兴起时,其他外国公司只提供寄存器对应地址datasheet,老一辈嵌入式软件工程师英文不太好,对32bit MCU的英文资料都懒得看,ST:“我来我来,不会英语没关系,我给大家翻译成中文参考手册,寄存器太多不好编程?没事儿,ST标准库把常用的外设寄存器都定义配置好,您直接调用对应外设的函数就好”,ST把国内嵌入式软件工程师当大爷伺候,伺候了10年,ST就成了国内32bit MCU界的一哥;HAL库,ST官方第二代开发方式(当前主推HAL库,标准库已经停止维护),HAL是英文单词hardware abstracTIon layer首字母缩写,中文直译是“硬件抽象层”,核心目的是提高项目代码的通用性,项目A的代码原来只能在ST的A型号芯片运行,假设A型号芯片缺货,B型号芯片不缺货,如果项目A的代码能够直接在B型号芯片运行多好呀,或者只需要做很小改动就可以在B型号芯片运行,ST盈利方式是靠卖芯片赚钱,ST芯片开发门槛越低,会用ST芯片的工程师越多,则芯片卖得越多。
HAL兼容性,同一个F103系列的不同型号芯片HAL库程序可以直接烧录使用,例如把STM32F103C8T6的程序烧到STM32F103ZET6,同一个F030系列里的不同型号也类似,(前提是项目使用的外设资源两个芯片都有才行),HAL库是巧妇,巧妇难为无米之炊,HAL库没办法运用芯片没有的外设资源。
STM32Cube MX一键创建项目初始化代码,极大降低了配置项目的工作量,在标准库时代,单单是STM32项目文件的各种配置就足已劝退一大波嵌入式小白,在51世界里,一行“P0 = 0xfe;”就足矣点亮一个LED灯,再看标准库的一大堆.h .c文件,倒腾了一上午一编译好几十个error(s) warning (s),看着就头皮发麻,忙活了半天LED灯也没点亮。。。
用HAL库生成初始化项目代码后,打开用keil编写代码时,所有用户自定义的代码只能在绿色的/* USER CODE BEGIN 1 */
/* USER CODE END 1 */ 之间写,否则下次重新配置后就会自动删除。例: /* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
/* USER CODE END 3 */
HAL库是大势所趋,HAL库后续的终极目标,类似于java程序,一次编译,到处运行,类似于.txt文档的兼容性,在各个电脑系统上都可以打开。芯片硬件资源越来越丰富,性能越来越强,软件编程的门槛越来越低,我预感ST第三代开发方式是拖拽外设模块搭积木式编程。到那时候,MCU编程这事儿,是个宝宝就会。
.hex文件内部包含了真正烧录到芯片内部的.bin文件+地址信息,如果.bin文件比作水杯里的水,那么.hex文件就是水杯(地址信息)+水(.bin)。
ST-link V2下载器直接连到电脑的USB口更稳妥,中间不要经过USB-hub,实测有时候经过USB-hub会提示“No ST-LINK detected”,中间环节越少,出现幺蛾子的概率越低。