STM32--STM32F051IAPの実装

1.IAPの原則とプロセス

「PunctualAtom-STM32F10xシリアルポートIAP実験」

《 stm32f030 IAP》

「STM32F051IAPソースコード共有」

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;
    } 

おすすめ

転載: blog.csdn.net/zwb_578209160/article/details/106359799