
微處理器復(fù)位方法:
硬件引腳RESET復(fù)位;
用看門狗復(fù)位;
程序控制復(fù)位。
軟件復(fù)位實(shí)現(xiàn)方法
首先聲明一個函數(shù)指針,指向復(fù)位后要開始執(zhí)行指令的位置:
void (*app_start)(void) = 0x0000;
之后,在自己的程序中想復(fù)位的地方調(diào)用app_start();也就是跳到0x0000位置執(zhí)行指令。
可以根據(jù)不同MCU復(fù)位的地址,修改上邊的地址(0x0000)。
實(shí)際上你可以跳到任何位置執(zhí)行或調(diào)用相應(yīng)指令或函數(shù)。
實(shí)例測試
老套路,發(fā)煙測試:以Arduino為開發(fā)環(huán)境來測試。
注意:在AVR微處理器中,為了使Arduino復(fù)位時不再進(jìn)入引導(dǎo)區(qū),使AVR將BOOTRST設(shè)置為1。
使用函數(shù)指針進(jìn)行軟件復(fù)位的代碼如下,你能想象到下邊的程序會使LED燈閃亮嗎?
// 0. 引腳定義
const int LED_PIN 13 // 定義LED引腳為13號數(shù)據(jù)引腳(DIG13)
static void (*reset_this_CPU)(void) = 0x0000; // 復(fù)位本CPU函數(shù)指針
// 1. 初始化
void setup() {
pinMode(LED_PIN, OUTPUT); // 初始化D13為輸出
digitalWrite(LED_PIN, HIGH); // D13輸出高電平
delay(1000); // 延時1秒
digitalWrite(LED_PIN, LOW); // D13輸出低電平
delay(1000); // 延時1秒
reset_this_CPU(); // 跳到0x0000地址指針,也就是復(fù)位
}
// 2. 循環(huán)
void loop() {
// 此處什么也沒有?。?}
結(jié)論
通過本方法,可以通過軟件方式進(jìn)行復(fù)位,也可以用這個函數(shù)指針的方法調(diào)用任何函數(shù)。(實(shí)在不理解,請翻一下《微機(jī)原理》,謝謝。。。)
感謝一直關(guān)注著禾灮成長進(jìn)步的朋友們。你們的信任、支持和鼓勵,鞭策著我們一路走到了今天。
感謝所有的合作伙伴,我們相互促進(jìn),共同見證了彼此的成長。
感謝所有曾經(jīng)在禾灮彼此倚靠、相互鼓勵、攜手同心、砥礪同行的兄弟姐妹。這里承載了我們的青春與熱血。
禾灮,感謝有你。
未來,我們將一如既往,砥礪前行。
禾灮·小楊
2018.08.06