最近在做一个项目,想使用uSD卡来实现在应用编程,首先需要一些知识
我所使用的单片机是STM32F103ZE,内部flash,超始地址为0x8000000,大小为0x80000(0x80000/1024也就是512kByte)要实现IAP,那么我需要一个bootloader,什么是bootloader呢,其实可以理解为我们PC的引导程序,我们需要在flash中为这个引导程序分配一个空间,起始于flash的起始地址(0x80000000)结束于0x80007F00,这样就分配了32KByte的空间,注意这个空间的分配一定要大于等于bootloader所占用的flash空间的大小。可以用stlink Utility来确定实际大小,也可以用编译工具编译结束后输出的信息。
除了bootloader还有最终单片机需要跑的用户应用程序。这个程序就可以分配在bootloader之后的空间里,从0x80008000开始,到0x80080000全部可用。
了解了上面的信息,那么可以知道它的实现原理:单片机上电,运行bootloader,检查某一个按钮是否按下,如果按下,就做一些初始化的工作,比如SDIO,FATFS,完成后读取SD卡中指定的BIN文件,并转移到开始地址为0x80008000的FLASH中。如果按钮没有按下,bootloader去检查0x80008000为首的FLASH区域是否有应用程序,如果有就执行。
else//未检测到按钮 { /*检查用户应用程序的起始地址是否有正确的内容*/ if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); JumpToApplication(); } }
PS:
BIN文件的生成
在调试好应用程序之后,方可生成BIN文件拷贝到SD卡中,那么如何生成这个文件呢,还是MDK ARM工具 OPTION->USER->Run #1 打勾,填入
E:\Keil\ARM\ARMCC\bin\fromelf.exe --bin -o .\STM3210E_EVAL\STM3210E_EVAL.bin .\STM3210E_EVAL\STM3210E_EVAL.axf
以上具体的路径根据自己的实际情况更改,只不过生志的BIN文件和AXF文件需要和MDK工程名一致这点要注意。
更改生成文件的超始地址:
Option->Target->IROM1 的起始地址是否为0x80008000。
还有最重要的一点,用户应用程序在调试好之后生成BIN文件之前,需要更改中断向量表的偏移,使用STM32 HAL库的情况下,找到system_stm32f1xx.c这个文件,修改宏定义:
#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
以上是默认值,这里需要更改为你所设置的偏移量,在这里就是用户应用程序相对于基址0x80000000的偏移,用户应用的基址是0x80008000,那么偏移量为0x8000所以这里改成:
#define VECT_TAB_OFFSET 0X8000