1.IAPの原則とプロセス
「PunctualAtom-STM32F10xシリアルポートIAP実験」
2.発生した問題
1.割り込みベクタテーブルの充電方向
(1)M3コアMCUとは異なります
1)STM32F0シリーズには関数void NVIC_SetVectorTable(u32 NVIC_VectTab、u32 Offset)がないため、他のシリーズのように割り込みベクタテーブルを設定することはできません。
2)M0コアでは、APP部分の割り込みベクタテーブルをSRAMにリダイレクトする必要があります(通常はM3のフラッシュでリダイレクトされます)。
M3コアでは、VTORレジスタを操作することで割り込みベクタテーブルを再マッピングできます
SCB-> VTOR = FLASH_BASE | 0x10000;
/ *内部FLASHでのベクタテーブルの再配置* /
M0カーネルでは、
memcpy((void *)0x20000000、(void *)IAP_ADDR、0xB4);
__HAL_SYSCFG_REMAPMEMORY_SRAM();の
うち、0x2000 0000はSRAMの開始アドレスであり、これを変更する必要はありません。
次の2つのパラメータは、実際の状況に応じて変更する必要があります。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();
}
3、FLASHおよびSRAM構成
1.ブートローダー部分
2.アプリ部分
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:
4.解決すべき問題
フラッシュがワードで読み取れないことがわかりました(またはバイトアラインメントが必要で、開始アドレスが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;
}