学习了一段时间的单片机,相信很多人和UP一样都想知道一堆MOS管的单片机到底是如何跑程序的,这个系列专栏就来详细说一下这个问题,最最重要的是多说人话,因为网上%的所谓技术文章是个人复制粘贴都能写,然而没几个人说人话,都是复制粘贴我凭什么要看你复制的,带点脑子写东西。

言归正传,从一开始的编译环境安装,工程的创建和编译,以及最终通过仿真器或者软件下载到单片机,通过真真正正的点了一个灯,到逐渐慢慢理解main函数的语句,修改一下延时函数的参数大小让灯闪的速度不一样,之后再改一下IO连接,再学会按键输入、串口printf,再到定时器闪灯、点1602和12864、PWM改改占空比,IO模拟IIC和SPI读一下传感器,基本上51学到这里就差不多了。之后就是学例程的方式写一写万年历跟各种测量显示,因为那时候的51也就有那些例程,实际上51也是能做不少东西的,读个SD卡放音乐什么的都不是问题,我记得我51就学了半年最后做了个平衡车就不再学了,那时候新东西很多,还买了一个ArduinoUNO跟STM32F030F4P6和STM32F103C8T6小蓝板

初次学习STM32这种32位的MCU一开始很不习惯固件库的方式,就是很多基本的操作比如读取IO输入输出都需要调用一个函数,而函数又需要调用大量的代码,每一句代码都涉及到好函数和很多变量或者宏,总之初次见就感觉太复杂太高深,难以理解,不就是一个IO翻转的事情嘛,至于搞这么复杂嘛,确实是没有51直接赋值和读取简单。


(资料图)

51基本上只要知道IO是怎么连的,并且顺着那么大的DIP40封装就能找到,学会抄着模拟IIC和SPI时序控制IO,学会抄各种IC的初始化和读写函数,最后main函数调用就OK,所以学51的那么长时间我基本上没有看过寄存器,甚至不知道寄存器怎么看,涉及到定时器和串口的初始化也有的抄或者直接STC-ISP软件直接抄参考代码。

因此后来学32的过程我也想着尝试这种方法快速用起来,但是似乎不太一样,51的寄存器基本上只需要一次性写几个寄存器就完成了配置,而对于32,任何一个外设甚至IO都需要配置一个结构体的N多成员,每一个成员到底选啥也是看不大懂。51上做过平衡车,学32我甚至就用小蓝板点了个灯学会下载就买了个32平衡车,记得那时候还很神奇为啥32非得是PA9和PA10下载,跟跟不太一样,然后还得先断电把BOOT0接再上电,下载完之后还得换回来。后来就买了个普中开发板,一键下载就是方便一点。买的平衡车跑得一直比较歪,就退货了,然后我又用小蓝板焊了一个跟平衡车一样的电路,也做成了一个平衡车。

学32发现学的还是那些模块,于是就开始研究32里比较好玩的一些程序,各种在屏幕上写的小游戏,以至于到后来我自己写了很多好玩的例程跟小游戏,但是我依旧没有学过寄存器,连IO口的寄存器都没有看过,只会写逻辑和调用、修改,没错我专业就是软件。

很多人觉得我很厉害,只有我自己知道自己菜的一批,直到我开始自己设计硬件,自己学着抄电源和最小系统、连线。但是很多个照着抄或者拿别人板子改的板子都没有做出来,就是闲着连线玩玩,还挺有意思的,原因老粉丝都知道了,那时候一个视觉大佬说我一个学软件的怎么不会画板子,正好也是看别人画的板子难看得一批,就开始自己画板子了,并且第一块板子就做的32全面屏开发板,因为LQFP封装我在寝室用黄花尖头烙铁就焊得很OK了。

熟悉51的思路就会有一种感觉,反正什么器件不都是IO驱动,随便连就是了,所以相对抄的开发板,IO我改了一点点,但是基本上是一样的,然后还是一样的思路跟着初始化驱动学者改了适配自己的板子,对于点灯还是很OK的。

画了三个月的板子,陆陆续续打板了好几次,修改各种问题,最后终于算是跑起来了,还是很有成就感的。之后就赶上嘉立创5元打板每月2次,于是乎各种模块我几乎都画了一遍,验证了很多的电源、显示、音频、开发板方案,累计做了近百个不同的板子,80%都是没做完或者没完善的,剩下的基本上都开源了,抄得多了自然就比较熟悉如何设计一个具有什么功能的板子。

这时候最大的问题就是底层驱动调试经验的不足。于是后来又测试了各种外设的程序的现象,尝试修改参数做对比,修改到不同的映射IO,大量的阅读固件库源码,最后是能发现,其实固件库还是对定义在一个地址的寄存器写上一个值,只不过通过这个复杂的初始化过程能让我们给它一个我们能理解的参数,也就是外设不同属性的取值。

再到后来尝试写最怕的东西,定时器和ADC,以及写一个同时拥有低功耗、USB Bootloader、文件系统、菜单UI、按键交互、不断电RTC的实用程序。再到写一个多段自由跳转的Bootloader、基于SD卡的Bootloader、FreeRTOS程序等等。

接触底层深入到一定程度,就会发现其魅力,以及从硬件、底层到应用和上位机都能做的那种自由感。也不免会想问一个问题,学了这么久单片机,谁都知道里面是个arm的M核,硬件上就是一堆MOS管,慢慢组成的CPU,是个人都这么告诉你。那么到底这一堆MOS是怎么跑程序的?(最重要的是讲人话)

下期继续讲,这期做个铺垫,拜拜

关键词: