如何實現(xiàn)stm32單片機每次接上電源就進行一次重啟動?
在嵌入式系統(tǒng)中,單片機的重啟有時是十分必要的,它可以解決一些系統(tǒng)啟動過程中的問題、恢復(fù)系統(tǒng)的正常運行、使系統(tǒng)更加穩(wěn)定等。
然而,有時候我們需要每次接上電源就進行一次重啟,也就是實現(xiàn)系統(tǒng)的自動重啟。本文將給出一個思路,來實現(xiàn)stm32單片機每次接上電源就進行一次重啟動。
一、背景知識
在嵌入式系統(tǒng)中,有兩類重啟,分別是軟重啟和硬重啟。
1.1 軟重啟
軟重啟是指通過程序控制單片機重新開始執(zhí)行,實現(xiàn)系統(tǒng)的重啟。在stm32單片機中,一般采用如下代碼進行軟重啟:
```c
NVIC_SystemReset(); //調(diào)用此函數(shù)進行軟重啟
```
1.2 硬重啟
硬重啟是指通過硬件控制單片機重新開始執(zhí)行,實現(xiàn)系統(tǒng)的重啟。在stm32單片機中,硬重啟通常是通過復(fù)位按鍵進行操作的。復(fù)位按鍵的功能是將單片機的復(fù)位引腳拉低,在一定時間后再拉高,從而實現(xiàn)單片機的重啟。
二、實現(xiàn)思路
了解了軟重啟和硬重啟之后,我們來思考如何實現(xiàn)stm32單片機每次接上電源就進行一次重啟動。下面是一種實現(xiàn)思路:
2.1 硬重啟
由于我們需要每次接上電源就進行一次重啟,所以需要采用硬重啟的方式。同時,我們還需要在重啟之前有一個短暫的延時,以確保系統(tǒng)已經(jīng)穩(wěn)定運行。
在stm32單片機中,硬重啟通常是通過復(fù)位按鍵進行操作的。我們可以在單片機的復(fù)位引腳和復(fù)位按鍵之間串聯(lián)一個帶有一定延時的電容,使得單片機在接電源,電容充電過程中,復(fù)位引腳的電平保持低電平,從而實現(xiàn)單片機的重啟。
2.2 延時
在實際應(yīng)用中,需要根據(jù)系統(tǒng)的不同運行環(huán)境和實際需求來設(shè)置延時的時間。由于系統(tǒng)重啟時,CPU還沒有開始執(zhí)行代碼,也就是沒有時鐘信號產(chǎn)生,所以我們需要在復(fù)位電容電壓升高之前就將系統(tǒng)時鐘啟動,以保證系統(tǒng)能夠穩(wěn)定運行。在stm32單片機中,我們可以通過設(shè)置RCC_CR寄存器中的HSEON位或HSION位來啟動時鐘。
三、代碼實現(xiàn)
實現(xiàn)思路已經(jīng)確定,下面給出相應(yīng)的代碼實現(xiàn)。
3.1 延時函數(shù)
為了實現(xiàn)正確的延時,我們需要在代碼中實現(xiàn)一個延時函數(shù)。下面是一種簡單的延時函數(shù)實現(xiàn):
```c
void delay(uint32_t n) {
while(n--) {
asm("nop");
}
}
```
3.2 硬重啟
在stm32單片機中,復(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ù)進行調(diào)用即可。
```c
int main(void) {
Reset_System();
//其他代碼
}
```
四、總結(jié)
本文介紹了實現(xiàn)stm32單片機每次接上電源就進行一次重啟動的思路,并給出相應(yīng)的代碼實現(xiàn)。
在實際應(yīng)用中,我們可以根據(jù)系統(tǒng)的不同運行環(huán)境和實際需求,來設(shè)置延時的時間和復(fù)位電容的大小。同時,我們還可以采用軟重啟的方式來滿足不同的需求。
最后,需要注意的是,重啟操作可能會對系統(tǒng)的穩(wěn)定性產(chǎn)生影響,應(yīng)根據(jù)實際需求來考慮是否需要進行系統(tǒng)的重啟。
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
130011 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3747瀏覽量
133654 -
RCC
+關(guān)注
關(guān)注
0文章
96瀏覽量
28523 -
GPIO
+關(guān)注
關(guān)注
16文章
1329瀏覽量
56232 -
STM32單片機
+關(guān)注
關(guān)注
59文章
553瀏覽量
60626
發(fā)布評論請先 登錄
GD32 usbcdc單片機從機只發(fā)送,串口打開第一次自動發(fā)最后一次測量的值
單片機系統(tǒng)進行擴展時需要遵循的原則有哪些
單片機位數(shù)的思考(8位、16位、32位)
單片機板跟上位機進行串口發(fā)收數(shù)據(jù)時,每次上位機下發(fā)指令,為什么?
電源電路焊接上單片機后電壓異常,看看這是什么問題?
單片機怎么驅(qū)動電機?
使用 CYW4373,啟動后立即進行校準,并且每兩分鐘進行一次校準,怎么操作?
PD快充芯片U8732的軟啟動功能
使用USB轉(zhuǎn)TTL串口板和ST-LINK調(diào)試下載器給STM32單片機下載程序
電機重啟動的控制策略
STM32F103x8 STM32F103xB單片機數(shù)據(jù)手冊
有單片機方面的大佬嗎?有幾個單片機方面的問題需要請教一下
請問init_ipc_shm() 是否只初始化一次?
STM32單片機最小系統(tǒng)電路設(shè)計
如何實現(xiàn)stm32單片機每次接上電源就進行一次重啟動?
評論