【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在一个系统当中,可能不止需要树莓派4b一个设备。有的时候还需要搭载一个mcu,做一些运动控制的事情。比如说,图像处理的结果传给mcu,mcu拿到这个结果之后做一些机械控制的事情。这里面最简单的,就是控制一个电机将残次品推到残次品框里面。
既然涉及到mcu,那么mcu的版本升级肯定是少不了的。一般的mcu升级,都是通过jtag或者swd烧入的。但是后期维护的时候,总不能让fae或者客户自己用jtag烧入吧,一方面不是很方便,另外一方面很容易烧错。今天,我们就来了解下,怎么用树莓派4b给mcu固件做升级。
1、mcu启动的原理
一个mcu想要启动起来,除了电源之外,就是复位、晶振、输入和输出。所以控制好了复位按钮,就可以实现mcu的重启。另外mcu如果需要升级固件,那么就要把原来的固件一分为二,一个是bootloader的部分,一个是应用的部分。我们升级的就是应用的部分。
2、bootloader由哪些部分构成
一般bootloader有这么几个部分,首先是上电检测按键是否需要升级;接着就是中断向量表的设置;紧接着就是串口或者usb的读写;然后是flash的烧写;最后是应用程序的跳转。如果bootloader做的比较好一点,还可以增加一个应用固件的crc校验动作,这主要也是为了防止应用固件在运行的过程中被无意改写。
3、应用固件由哪些部分构成
应用固件和bootloader部分最大的不同,就是它的启动地址和中断向量地址部分都要被改写。这就意味着link file要重新写。首先肯定是两者的启动地址不一样,其次就是中断向量。假设bootloader的中断向量地址是0x0,那么应用固件的中断向量就是另外一个地址,这点需要注意下。最后的话,就是sram大小、flash大小不太一样。毕竟应用固件功能更多一点,所以编译出来的bin文件也更大一点。
因此,在前期设计的时候,对于bootloader使用的ram、flash,以及应用固件使用的ram、flash就要做好区分,不然很容易overlap,容易出错。
4、为什么是soc来做mcu固件升级
mcu如果要自己做固件升级,那么它就要支持网络连接。但是部分mcu没有这个功能。所以很多时候,都是soc先把固件下载到本地,然后通过串口实现mcu的固件升级,这是比较常用的做法。另外,mcu的资源也是非常有限的,即使有网络通信,那么势必要引入对应的tcp/ip协议代码、下载代码,这部分都比串口要复杂一点,并且不是所有mcu都支持。
而mcu的固件大小本身并不大,更新的频率并不是那么高,所以这种情况下用soc进行升级是比较合适的做法。一般升级好了之后,直接给mcu一个复位信号即可。
void updateFirmware()
{
triggerMcuReboot();
waitForOKFromMcu();
while(1)
{
SendDataToMcu();
WaitForAck();
if(timeout)
{
return;
}
}
SendFinishCmd();
}
5、其他要注意的事情
其他需要注意的事项,就是如何选择升级的时机。刚才讨论的都是mcu启动的时候,实现固件升级,还有一种情况就是soc发起请求进行固件升级,这个时候要确保当前没有任务正在运行才可以。以汽车为例,总不能在开车的时候,升级发动机和变速箱的固件代码吧。
6、其他升级的通信方式
除了串口之外,还可以利用can、usb、网络实现固件升级,这取决于对应的mcu是否有相应的资源。用网络肯定是最快的,但复杂性会稍微高一点。usb也不错,特别是高速usb,下载速度也比较快。can的话,主要就是汽车用的比较多。