1、 STM32F103系列bootloader进行程序的启动的原理白话。 bootloader就是系统上电后运行的第一个程序,APP程序是我们的应用程序,APP程序也可以是上电运行的第一个程序,当整个系统就一个程序时,bootloader就=APP程序。只用当bootloader程序中实现了程序的跳转时,才称其为真正的BootLoader程序。 2、 编写BootLoader程序 编写BootLoader程序与编写正常的APP程序一样,只是需要加入跳转指令。以STM32F103RB为例,跳转指令如下(在main函数中调用):
1. #define APP_FLASH_ADDRESS (0x8010000) 2. typedef void (*pFunction)(void); 3. pFunction Jump_To_Application; 4. uint32_t JumpAddress; 5. 6. void JumpToApp(void) 7. { 8. /* Check if valid stack address (RAM address) then jump to user application */ 9. if (((*(__IO uint32_t*)APP_FLASH_ADDRESS) & 0x2FFE0000 ) == 0x20000000) 10. { 11. __disable_irq(); 12. /* Jump to user application */ 13. JumpAddress = *(__IO uint32_t*) (APP_FLASH_ADDRESS + 4); 14. Jump_To_Application = (pFunction) JumpAddress; 15. /* Initialize user application's Stack Pointer */ 16. __set_MSP(*(__IO uint32_t*) APP_FLASH_ADDRESS); 17. __enable_irq(); //打开中断,必须加 18. Jump_To_Application(); 19. } 20. }3、 BootLoader和APP程序的地址空间分配 因为程序上电默认从地址0x00000000(0x08000000)处启动,所以bootloader必须放在0x00000000处,空间可以小一些,能够放开BootLoader程序即可,一般10k左右没问题。 1)设置bootloader可用的flash地址空间,如下图所示(我设置了一半空间64k)。
修改stm32f103xb.h中的flash空间大小,如下图所示,
修改之后编译即可(编译程序后相应的stm32f103xb_flash.icf文件里的地址空间会自动被修改。) 2)同理,把剩余的flash地址空间留给APP程序使用,设置过程与上文一模一样,只是其起始址改为0x08010000,结束地址改为0x0801FFFF。 4、APP程序的编写 一定要在main函数的开头加上这句话,如果你的程序带中断的话。否则你的程序一进中断就会死机。
__disable_irq(); SCB->VTOR = 0x8010000; __enable_irq();5,简单测试我们的bootloader程序, 写两个简单的程序,让APP程序点灯(干点活让你知道是APP程序在跑),让bootloader程序不点灯。先仿真烧写app程序(这是程序代码写进了0x08010000地址),程序在点灯。之后断开程序(程序还在点灯)。之后仿真器烧写bootloader程序(烧写过程中灯会灭掉),之后运行bootloader程序,运行后系统再此点灯(因为程序跳转了)。
