最近沉迷STM32实现Type-C快充协议再加上学校的项目一直在鼓捣STM32,RM0091都快能背了(大雾
发表下感受:
1. 了解寄存器级别的操作还是很有必要的
比如说要把一个引脚从GPIO输出模式切换成定时器输出模式,就需要好好考虑下切换期间会发生什么。有时候直接用HAL_GPIO_Init会产生Glitch,假如驱动的是控制高压开关的MOS管啥的很容易爆炸
而且HAL_GPIO_Init很慢,本来几个位操作就能解决的非要弄个循环x
2. 抽象是要付出代价的
以STM32F030来说,官方最开始出的是标准库,然后是HAL+LL(硬件抽象层+底层库),LL和标准库基本是一个东西(很多函数and/or宏都能一一对应),HAL则是更高层次的封装,更有可移植性。
实验发现用了最简单的ADC功能,HAL比LL多用500字节RAM,2k的ROM,对于只有32k Rom 4k Ram的STM32F030K6还是很需要考虑的
分析了下HAL的实现, HAL要求使用者保存一个结构体,里面保存了初始化参数还有一些状态机的状态之类的。窝木有用ADC的DMA但是这个结构体里面还是有小一半的DMA相关...而且初始化参数还存着...大概率一直用不到的东西。
所以窝感觉HAL更适合USB SPI I2C这些定死的不需要频繁和硬件底层打交道的通信外设
题外话:
一行printf不开优化的情况下有24k rom,开了也好不到哪去,所以最好方法就是不用printf甚至不用任何stdlib里的东西
更新:
CubeMX适合开局,但是不要完全依赖这个,个人感觉里面也就是看引脚的映射和初始化时钟配置坠有用