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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM