STM32 YMODEM实现bootloader
2018-08-19 来源:eefocus
这几天一直在尝试学STM32 bootloader,在网上查阅了一番,发现实现方法不计其数。于是自己有了想动手实现一番的欲望。
下面请听我细细道来,我选用的芯片是STM32F103ZE系类,该芯片是512k,每页是2k的。
接下来就是你要重点了:
其实bootloader说白了,就是在原有APP程序 再加上另一段程序---bootloader,这个bootloader可以对你flash进行擦写操作。
那么关于STM32具体实现BOOTLOADER步骤是怎么样的呢?
下面我就具体几个细节之处谈谈:
1,如何实现在APP程序跳转到BOOTLOADER程序.
2,既然APP程序可以跳转到bootloader,那么反之也是可以的。
//判断用户是否已经下载程序,因为正常情况下此地址是栈地址。//若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
SerialPutString('Execute user Program\r\n\n');
//跳转至用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
else
{
SerialPutString('no user Program\r\n\n');
}
3,设计bootloader程序,采用YMODEM协议,一次数据1024字节、需要在keil进行设置ROM1,下载utilities也设置一下,然后download。
4,设计好bootloader程序并且用仿真器烧录到芯片之后,下面就开始设计APP程序,所需设置也是大同小异,只是将STARTADDRESS 设置成从 0800 0200 size只要不超过你整个flash剩下的区域即可
,还需要设置一点的是,产生bin文件,这里我教大家一个方法 \@p.bin就是说项目名来作为bin文件名,axf也一样。假设我项目名是BOOT-Y,那么你生成的bin文件就是这个名字
5.,接下来用SECURECRT软件进行程序app的bin文件烧录,我boot程序里面有设计了一个按键,就是你是进入到boot程序还是app程序,当然你app程序如果没有的话,那么就需要在这里进行校验了。如果按键按住,然后复位,那么程序就进入到刚才的boot区域,这里是一个串口菜单,有一个函数捕获你的按键输入字符。
/*******************************************************************************
* @函数名称 GetKey
* @函数说明 通过超级中断回去键码
* @输入参数 无
* @输出参数 无
* @返回参数 按下的键码
*******************************************************************************/
uint8_t GetKey(void)
{
uint8_t key = 0;
//等待按键按下
while (1)
{
if (SerialKeyPressed((uint8_t*)&key)) break;
}
return key;
}
6、下面就是boot的串口菜单,你输入1,加载bin文件,点击transfer的send-ymodem,然后选择你的bin文件,接下来就是1024字节数据开始发送到串口缓存区,如果校验正确的话,那么就会写入到对应的flash当中。
7、看到没?成功了!
(7.1)、
忘记说了,APP程序里面需要在 在system_stm32f10x.c文件的128行处 #define VECT_TAB_OFFSET 0x2000 /*!< Vector Table base offset field. 将中断向量表的偏移量改成你APP程序flash地址偏移量, 这个非常关键,因为你BOOT的中断和APP中断不能是同一个! 否则会出事的!