不要学STM32,我不是说STM32不好,但是单纯为了学MCU而学MCU的想法是错误的。
你问,如何系统地入门学习stm32?
这道题是错的,如果你会用8051,会写C语言,那你就没必要刻意去学STM32了。
你需要考虑的是,我可以用 STM32 实现什么?
为什么要用STM32而不选8051?是因为51的主频太低,满足不了运算的需求?是因为51的引脚太少,满足不了众多外设的IO?是因为51太耗电,电池撑不住?是因为51的功能太弱,要用SPI,I2C,ADC,DMA?是因为51的内存太小,要存的东西太多?
当你需要使用STM32的某些功能,而51无法实现的时候,那么你就不需要学STM32了,直接去寻找STM32在某些方面的用处。比如需要使用SPI协议网卡,使用串口通信,使用RTOS等等……
关于寄存器与库
我的观点是:寄存器在你调试的时候很重要,在你需要了解芯片的工作细节的时候很重要,但是寄存器在你开发的时候并不重要。如果你没有遇到必须直接配置寄存器的情况,那么就不要直接在寄存器级别进行开发,因为面向寄存器开发的好处往往无法抵消这样做的坏处。面向寄存器的开发效率很高,但是你需要浪费10倍甚至100倍的时间才能提高0.01%的效率。既然ST已经为你提供了很好的库,就没有理由再重新发明轮子了。
那么什么时候我们必须直接控制寄存器?
首先,某个代码块被调用得非常频繁。例如,如果你有一个庞大的 for 循环,那么 for 循环中的每一步都应该仔细优化。好的优化可以实现更好的性能。这种情况在图像处理相关的代码中很常见。
第二,库函数有bug。这种情况遇到的概率很低,但确实存在。不过一般来说,如果MCU出现意外行为,你首先应该想到的是你的代码有bug,而不是库函数有bug。如果库函数真的有bug,去Google搜一下,相信你绝对不是第一个掉坑的人。
对于传统的电子工程师来说,使用库编程可能感觉有些空洞和不切实际。但如果你写过 Web、服务器端代码或桌面代码,你一定会明白 API、封装和抽象的含义。