47 stm 32 f 0 IAPがAPPをジャンプした後に中断して入ることができません


47.1引用


今回の質問は、stm 32 f 0 IAPがアプリをジャンプした後、中断してアクセスできません


前にstm 32 f 103のiapプログラムを作りました.stm 32 f 103には割り込みベクトル開始アドレスコントローラがあるので、VECT_を直接修正します.TAB_OFFSETの値ですが、アプリでNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2400);,これでいいですがcortex-m 0はだめです.この機能がないので、特殊な処理が必要になります.それから私はネット上の資料に基づいて、stm 32 f 030単片機のメカニズムを真似て、同じcortex-m 0のIAPをもう一つ作りましたが、問題が発生しました.元のstm 32 f 030単片機が正常に動作できるアプリで、新しいcortex-m 0単片機ではだめです.プログラムがIAPからアプリにジャンプしたとき、すべての割り込み関数は入れませんでしたが、IAPのプログラムでは割り込み関数は問題ありません.それは、ベクトルテーブルのコピーを中断するのに問題があったに違いありません.それから問題を探して一晩探して、今朝できました.ここに記録します.
 

47.2実験


本実験ではcortex-m 0プロセッサを用い,IAPおよびAPPアプリケーションを記述したが,IAPがAPPにジャンプするのは正常であり,APPのプログラムも正常に動作しており,中断のほか!!!!そのため、バグ探しの旅が始まりました.以下はよくあるcortex-m 0がアプリで中断ベクトルテーブルをコピーする操作です.
#define APPLICATION_ADDRESS (uint32_t)0x8002400
#if   (defined ( __CC_ARM ))
  __IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#endif

	/* Enable the SYSCFG peripheral clock*/
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); 

	// copy vector table from flash to ram
	for (uint8_t i = 0; i < 48; i++) 
    {
        VectorTable[i] = *(__IO uint32_t *)(APPLICATION_ADDRESS + (i << 2));
    }
	/* Remap SRAM at 0x00000000 */
	SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

上記のジャンプ後のAPPのベクトルコピーは、stm 32 f 030というシングルチップマシンでは正常ですが、別のcortex-m 0のシングルチップマシンではできません.理由は:

この関数は使用できません:RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); //この関数はシステム構成クロックをリセットした後、起きていないと推定し、後で設定したものは役に立たない。


この関数をRCC_に変更するにはAPB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //これはシステム構成の機能です。それは正常です。


次のようになります.
#define APPLICATION_ADDRESS (uint32_t)0x8002400
#if   (defined ( __CC_ARM ))
  __IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#endif	

/* Enable the SYSCFG peripheral clock*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

	// copy vector table from flash to ram
	for (uint8_t i = 0; i < 48; i++) 
    {
        VectorTable[i] = *(__IO uint32_t *)(APPLICATION_ADDRESS + (i << 2));
    }
	
	/* Remap SRAM at 0x00000000 */
	SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

このように変更した後、すべて正常になりました!Over!