智能復(fù)位——程序控制MCU復(fù)位


微處理器復(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容