如何實(shí)現(xiàn)stm32單片機(jī)每次接上電源就進(jìn)行一次重啟動?
在嵌入式系統(tǒng)中,單片機(jī)的重啟有時是十分必要的,它可以解決一些系統(tǒng)啟動過程中的問題、恢復(fù)系統(tǒng)的正常運(yùn)行、使系統(tǒng)更加穩(wěn)定等。
然而,有時候我們需要每次接上電源就進(jìn)行一次重啟,也就是實(shí)現(xiàn)系統(tǒng)的自動重啟。本文將給出一個思路,來實(shí)現(xiàn)stm32單片機(jī)每次接上電源就進(jìn)行一次重啟動。
一、背景知識
在嵌入式系統(tǒng)中,有兩類重啟,分別是軟重啟和硬重啟。
1.1 軟重啟
軟重啟是指通過程序控制單片機(jī)重新開始執(zhí)行,實(shí)現(xiàn)系統(tǒng)的重啟。在stm32單片機(jī)中,一般采用如下代碼進(jìn)行軟重啟:
```c
NVIC_SystemReset(); //調(diào)用此函數(shù)進(jìn)行軟重啟
```
1.2 硬重啟
硬重啟是指通過硬件控制單片機(jī)重新開始執(zhí)行,實(shí)現(xiàn)系統(tǒng)的重啟。在stm32單片機(jī)中,硬重啟通常是通過復(fù)位按鍵進(jìn)行操作的。復(fù)位按鍵的功能是將單片機(jī)的復(fù)位引腳拉低,在一定時間后再拉高,從而實(shí)現(xiàn)單片機(jī)的重啟。
二、實(shí)現(xiàn)思路
了解了軟重啟和硬重啟之后,我們來思考如何實(shí)現(xiàn)stm32單片機(jī)每次接上電源就進(jìn)行一次重啟動。下面是一種實(shí)現(xiàn)思路:
2.1 硬重啟
由于我們需要每次接上電源就進(jìn)行一次重啟,所以需要采用硬重啟的方式。同時,我們還需要在重啟之前有一個短暫的延時,以確保系統(tǒng)已經(jīng)穩(wěn)定運(yùn)行。
在stm32單片機(jī)中,硬重啟通常是通過復(fù)位按鍵進(jìn)行操作的。我們可以在單片機(jī)的復(fù)位引腳和復(fù)位按鍵之間串聯(lián)一個帶有一定延時的電容,使得單片機(jī)在接電源,電容充電過程中,復(fù)位引腳的電平保持低電平,從而實(shí)現(xiàn)單片機(jī)的重啟。
2.2 延時
在實(shí)際應(yīng)用中,需要根據(jù)系統(tǒng)的不同運(yùn)行環(huán)境和實(shí)際需求來設(shè)置延時的時間。由于系統(tǒng)重啟時,CPU還沒有開始執(zhí)行代碼,也就是沒有時鐘信號產(chǎn)生,所以我們需要在復(fù)位電容電壓升高之前就將系統(tǒng)時鐘啟動,以保證系統(tǒng)能夠穩(wěn)定運(yùn)行。在stm32單片機(jī)中,我們可以通過設(shè)置RCC_CR寄存器中的HSEON位或HSION位來啟動時鐘。
三、代碼實(shí)現(xiàn)
實(shí)現(xiàn)思路已經(jīng)確定,下面給出相應(yīng)的代碼實(shí)現(xiàn)。
3.1 延時函數(shù)
為了實(shí)現(xiàn)正確的延時,我們需要在代碼中實(shí)現(xiàn)一個延時函數(shù)。下面是一種簡單的延時函數(shù)實(shí)現(xiàn):
```c
void delay(uint32_t n) {
while(n--) {
asm("nop");
}
}
```
3.2 硬重啟
在stm32單片機(jī)中,復(fù)位引腳的引腳號為NRST,一般被定義為GPIOA的第0號引腳(PA0)。同時,我們還需要在復(fù)位引腳和復(fù)位按鍵之間串聯(lián)一個帶有一定延時的電容。
```c
void Reset_System(void) {
//延時一段時間
delay(0xFFFFF);
//啟動時鐘
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); //啟動外部高速晶振
RCC_WaitForHSEStartUp(); //等待外部高速晶振就緒
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //將外部高速晶振選為系統(tǒng)時鐘
RCC_HCLKConfig(RCC_SYSCLK_Div1); //選擇AHB時鐘為HCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //選擇APB2時鐘為HCLK
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//復(fù)位引腳配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//將NRST引腳拉低一段時間,模擬復(fù)位按鍵的按下操作
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
delay(0x3FF);
//將NRST引腳拉高,完成重啟操作
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
```
3.3 主函數(shù)
在主函數(shù)中,我們對函數(shù)進(jìn)行調(diào)用即可。
```c
int main(void) {
Reset_System();
//其他代碼
}
```
四、總結(jié)
本文介紹了實(shí)現(xiàn)stm32單片機(jī)每次接上電源就進(jìn)行一次重啟動的思路,并給出相應(yīng)的代碼實(shí)現(xiàn)。
在實(shí)際應(yīng)用中,我們可以根據(jù)系統(tǒng)的不同運(yùn)行環(huán)境和實(shí)際需求,來設(shè)置延時的時間和復(fù)位電容的大小。同時,我們還可以采用軟重啟的方式來滿足不同的需求。
最后,需要注意的是,重啟操作可能會對系統(tǒng)的穩(wěn)定性產(chǎn)生影響,應(yīng)根據(jù)實(shí)際需求來考慮是否需要進(jìn)行系統(tǒng)的重啟。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120348 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3593瀏覽量
129466 -
RCC
+關(guān)注
關(guān)注
0文章
93瀏覽量
26937 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52090 -
STM32單片機(jī)
+關(guān)注
關(guān)注
59文章
549瀏覽量
58717
發(fā)布評論請先 登錄
相關(guān)推薦
評論