STM32--STM32F051 IAP的实现
一、IAP原理及過程
《正點原子--STM32F10x串口IAP實驗》
《stm32f030 IAP》
《STM32F051 IAP源碼分享》
二、遇到的問題
1、中斷向量表的充定向問題
(1)與M3核的單片機由區別
? ? ? 1)、STM32F0系列沒有void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)這個函數,所以不能像其他系列的那樣設置中斷向量表;
? ? ? 2)、M0核中需要把APP部分中的中斷向量表重定向到SRAM中(在M3中一般是重定向在flash中);
在M3內核中可以通過操作VTOR寄存器來重映射中斷向量表
SCB->VTOR = FLASH_BASE | 0x10000;
/* Vector Table Relocation in Internal FLASH. */
在M0內核中需要
memcpy((void*)0x20000000, (void*)IAP_ADDR, 0xB4);
__HAL_SYSCFG_REMAPMEMORY_SRAM();
其中,0x2000 0000是SRAM的起始地址,這個不需要改動。
而之后的兩個參數需要根據實際情況作出修改。IAP_ADDR是應用程序的起址地址,從這里開始的VECTOR_SIZE字節,存放是的應用程序的中斷向量表。VECTOR_SIZE是指中斷向量表的大小,具體多大可以在startup.s文件里計算得到。
? ? ? 3)、跳轉
? ? ? ?4)、幾種中斷向量表重定向的方法
? ? ? ? ? A:?memcpy((void*)0x20000000, (void*)IAP_ADDR, 0xB4);
? ? ? ? ? B:?
void InterruptRemap(void) {uint8_t i;u32_t Data;u32_t Address;for(i=1;i<48;i++){Data = *(__IO uint32_t *)(0x08003000+i*4);Address = 0x20000000 + (i*4);*(__IO uint32_t *)Address= (uint32_t )Data;}__HAL_SYSCFG_REMAPMEMORY_SRAM(); }?三、FLASH和SRAM的配置
? ?1、BootLoader部分
2、app部分
ROM的設定值要與程序中分配的空間地址對應,例如程序中的地址分配如下:
/*< Bootloader address base. 12KB>*/ /* bootloader: 12KB 0x08000000--0x08003000 */ #define BOOTLOADER_ADDR_BASE 0x08000000 /*< APP address base. 24KB >*/ /* 0x08003000--0x08009000 */ #define APP_START_ADDR 0x08003000 /*< Parameter address base. 2KB. >*/ #define PARAM_ADDR_BASE 0x08009000 #define UPDATE_FLAG_L8_ADDR (PARAM_ADDR_BASE+0) #define UPDATE_FLAG_H8_ADDR (PARAM_ADDR_BASE+1) #define APP_SIZE_L8_ADDR (PARAM_ADDR_BASE+2) #define APP_SIZE_M1_ADDR (PARAM_ADDR_BASE+3) #define APP_SIZE_M2_ADDR (PARAM_ADDR_BASE+4) #define APP_SIZE_H8_ADDR (PARAM_ADDR_BASE+5) #define APP_CRC_L8_ADDR (PARAM_ADDR_BASE+6) #define APP_CRC_H8_ADDR (PARAM_ADDR_BASE+7) /*< APP TEMP address base. 24KB >*/ #define APP_TEMP_START_ADDR 0x08009800 /*< Deserve address base. 2KB >*/ #define DESERVE_ADDR_START 0x0800F800設定APP部分的SRAM,要注意剩余長度的計算,剩余長度=SRAM總長度 - 中斷向量表所用長度 - 1:
?
四、待解決的問題
發現flash不能字讀取(或是要字節對齊,起始地址要是4的倍數),這個問題還沒有找到原因,可能是我字讀取函數寫的有問題。
/* Get the new app size. *///newAPPSize = hal_flash_read_word(APP_SIZE_L8_ADDR);//直接讀取字,不成功newAPPSizeL = hal_flash_read_half_word(APP_SIZE_L8_ADDR);newAPPSizeH = hal_flash_read_half_word(APP_SIZE_M2_ADDR);newAPPSize = (newAPPSizeH<<16) | newAPPSizeL;u32_t hal_flash_read_word(u32_t addr){return *(__IO u32_t *)addr;}總結
以上是生活随笔為你收集整理的STM32--STM32F051 IAP的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件协作工具Trello
- 下一篇: 小米盒子访问计算机硬盘,小米盒子3增强版