为了产品到现场使用后不拆壳就可升级跟新程序,最近学习了bootloader的移植,现在把移植过程和中间遇到的问题分享给大家,希望相互学习。
ST官方的例程使用的是Ymodem协议。我们需要准备2个程序,一个是IAP(bootloader),一个是APP应用程序(.bin文件)。
一、使用的平台和工具
1、硬件:单片机为stm32F030K6T6,ST-LINK下载器,USB转串口工具,USB转485工具。
2、软件:Keil,SecureCRT8.3,ST官方IAP。
二、软件工具的下载
1、SecureCRT8.3下载链接:
链接:https://pan.baidu.com/s/1GOICsxjxLIQbBdaj_ohQeQ
提取码:scrt
2、ST官网IAP下载链接:
网盘链接:链接:https://pan.baidu.com/s/1EOdtgTVvRmCa_vT-Lxzcnw
提取码:a1bg
官方链接:https://www.st.com/zh/embedded-software/stsw-stm32116.html#overview
如图:文件里边有相应的说明文档
三、实操
1、将下载好的IAP解压并打开
打开文档IAP项目后可以看到主函数如下:
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f0xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f0xx.c file USE_STDPERIPH_DRIVER,STM32F0XX,USE_STM320518_EVAL,STM320518_EVAL_REVB
*/
/* Initialize Key Button mounted on STM320518-EVAL board */
STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO);
RS485_InitTXE();
/* Test if Key push-button on STM320518-EVAL Board is pressed */
if (STM_EVAL_PBGetState(BUTTON_KEY) == 0x00)
{
/* If Key is pressed, execute the IAP driver in order to re-program the Flash */
IAP_Init();
/* Display main menu */
Main_Menu ();
}
else
{/* Keep the user application running */
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
/* Jump to application */
Jump_To_Application();
}
}
/* Infinite loop */
while (1)
{
}
}
大概流程时是这样的,上电前按住编程键进入程序下载模式,在SecureCRT上可以看到菜单如下:
从键盘输入1,进入下载模式,stm32f030k6t6一直发送字符“C”,等待下载程序,如下图
点击Transfer->Send Ymodem,选择要下载的.bin文件,确定开始下载。知道大概的流程以后,我们就可以对代码进行编译移植,主要是更改编程键的硬件和所用的串口硬件
更改按键,打开工程文件中的stm320518_eval.h,如下图所示,172-178行就是编程键的硬件配置,改成自己要使用的IO口就可以了,别和其他IO重复。
更改串口,在同一个.h文件下找到下图程序段,改成自己用的串口即可。
改完这些以后,在Ymodem.c文件中还有一处需要更改,这里的擦除FLash有点问题,如下所示:
NbrOfPage = FLASH_PagesMask(size); /*计算需要擦除Flash的页*/
/* erase user application area */
for (EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
{
FLASHStatus = FLASH_ErasePage(flashdestination + (PageSize * EraseCounter));
}
uint32_t FLASH_PagesMask(__IO uint32_t Size)
{
uint32_t pagenumber = 0x0;
uint32_t size = Size;
if ((size % FLASH_PAGE_SIZE) != 0)
{
pagenumber = (size / FLASH_PAGE_SIZE) + 1;
}
else
{
pagenumber = size / FLASH_PAGE_SIZE;
}
return pagenumber;
}
最后配置一下flash空间大小,
这样就完事大吉了,串口IAP下载程序的bootloader就可以使用了。
如果想使用485的话,需要定义一个收发使能切换输出IO口,
打开common.c文件找到如下图函数
在发送的前后加上485的发送使能和接收使能,把串口的发送标志中断改为发送完成标志,发送的数据回出现错误。
2、APP的配置和编程
配置keil输出.bin文件:$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L
配置Flash和SRAM的大小,
在主函数中定义APP程序存储的起始地址和中断向量表
在main函数中加入上边这段代码,将中断向量表复制到SRAM中(这里和stm32f103不一样)。
这样准备好IAP程序和APP的bin文件就可以验证程序了。