STM32--STM32F051 IAP的实现
一、IAP原理及過程
《正點(diǎn)原子--STM32F10x串口IAP實(shí)驗(yàn)》
《stm32f030 IAP》
《STM32F051 IAP源碼分享》
二、遇到的問題
1、中斷向量表的充定向問題
(1)與M3核的單片機(jī)由區(qū)別
? ? ? 1)、STM32F0系列沒有void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)這個(gè)函數(shù),所以不能像其他系列的那樣設(shè)置中斷向量表;
? ? ? 2)、M0核中需要把APP部分中的中斷向量表重定向到SRAM中(在M3中一般是重定向在flash中);
在M3內(nèi)核中可以通過操作VTOR寄存器來重映射中斷向量表
SCB->VTOR = FLASH_BASE | 0x10000;
/* Vector Table Relocation in Internal FLASH. */
在M0內(nèi)核中需要
memcpy((void*)0x20000000, (void*)IAP_ADDR, 0xB4);
__HAL_SYSCFG_REMAPMEMORY_SRAM();
其中,0x2000 0000是SRAM的起始地址,這個(gè)不需要改動(dòng)。
而之后的兩個(gè)參數(shù)需要根據(jù)實(shí)際情況作出修改。IAP_ADDR是應(yīng)用程序的起址地址,從這里開始的VECTOR_SIZE字節(jié),存放是的應(yīng)用程序的中斷向量表。VECTOR_SIZE是指中斷向量表的大小,具體多大可以在startup.s文件里計(jì)算得到。
? ? ? 3)、跳轉(zhuǎn)
? ? ? ?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的設(shè)定值要與程序中分配的空間地址對(duì)應(yīng),例如程序中的地址分配如下:
/*< 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設(shè)定APP部分的SRAM,要注意剩余長度的計(jì)算,剩余長度=SRAM總長度 - 中斷向量表所用長度 - 1:
?
四、待解決的問題
發(fā)現(xiàn)flash不能字讀取(或是要字節(jié)對(duì)齊,起始地址要是4的倍數(shù)),這個(gè)問題還沒有找到原因,可能是我字讀取函數(shù)寫的有問題。
/* 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;}總結(jié)
以上是生活随笔為你收集整理的STM32--STM32F051 IAP的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件协作工具Trello
- 下一篇: 计算机系统维护与管理论文,探讨计算机系统