IAP公升級日記(STM32晶元)

2021-10-06 13:20:06 字數 1978 閱讀 1803

就是我們的使用者區程式

以我使用的stm32f030cct6為例,其有256kb的flash記憶體空間,m0的核心,其記憶體對映圖如下:

從圖中可以看出:該mcu的主flash位址是從0x08000000處開始,又因該款mcu的flash大小為256kb,所以該款mcu的位址區間為0x08000000~0x08040000。

關於boot暫存器描述如下:

預設情況下:位址被對映到main flash memory的0x08000000處,也就是我們的主flash的起始位址處,所以程式下好之後,mcu從0x08000000處開始尋找中斷向量表位置,並在0x08000004處找到復位中斷,進而執行主程式,知道了程式執行的大致流程之後,我們現在開始製作iap程式

這裡著重說一下跳轉**的跳轉原理,那麼,如何實現程式向指定的絕對位址的跳轉?

更新sp指標暫存器和pc指標暫存器,具體實現方法和實現**網上很多,需要注意的是,在使用內聯彙編和內嵌彙編時,部分嵌入式mcu核心支援的內嵌指令有所區別,具體情況我這裡也沒研究透,只能說使用彙編可能有平台限制,當時我使用彙編跳轉的時候指令一直無效報錯

typedef void(*pfun)(void);

//跳轉函式

}

到這裡,如果你已經進行測試,你會發現程式還是,跑飛進入宕機狀態,這是為什麼呢?

所以這裡的關鍵是,如何將中斷向量表的尋找位置從0x0800 0000修改到0x0800 8800? 

1 修改暫存器vtor的值 

2 記憶體重對映

在m3/m4核心中:有vtor暫存器,因此我們只需要修改vtor的值就可以將0x0800 0000修改到0x0800 8800,但是在m0中是沒有vtor暫存器的,這就需要我們想辦法自己進行記憶體對映,方法如下:

通過將sram重對映到位址0x0000 0000,那麼,m0系統產生中斷後,cpu還是從位址0x0000 0000尋找中斷入口,但是,實際上不再是定址0x08000000,而是定址0x2000 0000,這麼一來,接下來我們就只需要將中斷向量表整個拷貝到sram上,也就是0x2000 0000上,就這樣,cpu就可以正常定址中斷向量表了。**如下:

#if   (defined ( __cc_arm ))

__io uint32_t vectortable[48] __attribute__((at(0x20000000)));

#elif (defined (__iccarm__))

#pragma location = 0x20000000

__no_init __io uint32_t vectortable[48];

#elif defined ( __gnuc__ )

__io uint32_t vectortable[48] __attribute__((section(".ramvectortable")));

#elif defined ( __tasking__ )

__io uint32_t vectortable[48] __at(0x20000000);

#endif

void vectortableoffset(void)

/* enable the syscfg peripheral clock*/

ll_apb1_grp2_enableclock(ll_apb1_grp2_periph_syscfg);

/* remap sram at 0x00000000 */

ll_syscfg_setremapmemory(ll_syscfg_remap_sram);

}

以下是2023年11月6日10:32:53總結發現的新東西:

STM32的IAP韌體公升級

an2606 system memory boot mode an3155 usart for bootloader 指令集詳解 an2557 iap using usart 將0x08000000開始的main memory空間劃分為兩部分,其中低位址空間用於儲存iap driver,剩餘空間用於...

STM32實現IAP程式公升級

1.寫在前面 對於stm32來說,晶元出廠時已經預置了一段bootloader,但是啟動bootloader需要設定微控制器的boot引腳 boot1 0,boot0 1,並復位後才能進入系統bootloader。boot引腳的設定可通過硬體來實現自動設定和復位,從而利用系統bootloader實現...

STM32 IAP公升級工具

1 內部包含了crc mode的檢驗 2 檔案包含了頭尾 長度的資料,確保公升級操作的可靠性 3 win32串列埠查詢功能getseriallist 4 regkey.open hkey local machine,t hardware devicemap serialcomm key read e...