對于STM32軟件復位
對于STM32來說軟件復位有兩種方式:
1)采用官方自帶的軟件庫
在官方軟件庫的stm32f10x_nvic.c 文件里 直接提供了 系統復位的函數
/*******************************************************************************
* Function Name : NVIC_GenerateSystemReset
* Description : Generates a system reset.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void NVIC_GenerateSystemReset(void)
{
SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
}
但是不是直接調用這個函數就OK了?
在Cortex-M3權威指南中有這么一句話
這里有一個要注意的問題:從SYSRESETREQ 被置為有效,到復位發(fā)生器執(zhí)行復位命令,
往往會有一個延時。在此延時期間,處理器仍然可以響應中斷請求。但我們的本意往往是要
讓此次執(zhí)行到此為止,不要再做任何其它事情了。所以,最好在發(fā)出復位請求前,先把
FAULTMASK 置位。
所以最好在將FAULTMASK 置位才萬無一失。
同樣官方stm32f10x_nvic.c 文件里也直接提供了該函數
/*******************************************************************************
* Function Name : NVIC_SETFAULTMASK
* Description : Enables the FAULTMASK priority: Raises the execution priority to -1.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void NVIC_SETFAULTMASK(void)
{
__SETFAULTMASK();
}
所以要系統復位 只要 調用這兩個函數就OK了
NVIC_SETFAULTMASK();
GenerateSystemReset();
2)自己編寫相應匯編代碼
其實道理是一樣的,我當初是沒有看到官方的函數所以自己編的,實際你看官方函數里面其實就是調用的cortexm3_macro.s同樣的代碼 呵呵。
我的代碼:
/*******************************************************************************
* Function Name : SystemReset
* Description : Configures the port pin connected to the push button. GPIO_D_4
* Input : None
* Output : None
* Return : None
*******************************************************************************/
__asm void SystemReset(void)
{
MOV R0, #1 //;
MSR FAULTMASK, R0 //;清除FAULTMASK禁止一切中斷產生
LDR R0, =0xE000ED0C //;
LDR R1, =0x05FA0004 //;
STR R1, [R0] //; 系統軟件復位
deadloop
B deadloop //; 死循環(huán)使程序運行不到下面的代碼
}
然后用的時候在C程序里直接調用該函數就行了。
SystemReset();
在MDK環(huán)境下,包含匯編的代碼嵌入到C代碼中時,編寫、調用與C函數一樣
在misc.c中定義了上面的函數;
在misc.h中聲明了函數:void SystemReset(void);
在main.c中調用函數:SystemReset();
補充:
MDK和IAR通用的軟件復位代碼:
#ifdefined(__CC_ARM)/*------------------RealViewCompiler-----------------*/
__asmvoidGenerateSystemReset(void)
{
MOVR0,#1//;
MSRFAULTMASK,R0//;FAULTMASK禁止一切中斷產生
LDRR0,=0xE000ED0C//;
LDRR1,=0x05FA0004//;
STRR1,[R0]//;
deadloop
Bdeadloop//;
}
#elif(defined(__ICCARM__))/*------------------ICCCompiler-------------------*/
//#pragmadiag_suppress=Pe940
voidGenerateSystemReset(void)
{
__ASM("MOVR0,#1");
__ASM("MSRFAULTMASK,R0");
SCB->AIRCR=0x05FA0004;
for(;;);
}
上面的代碼,程序在FLASH中跑時可以復位,在RAM中調試不成功,原因可能是板子上的boot比較松,導致RAM啟動選擇有問題
由上面可以看出,IAR下嵌入匯編不是簡單的asm("...");,如asm("LDRR0,=0xE000ED0C");就會報錯