stm32F1使用SD卡实现IAP

最近在做一个项目,想使用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
posted @ 2016-06-28 15:33  杰克纬伯  阅读(2592)  评论(0编辑  收藏  举报