新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機實現(xiàn)軟件復(fù)位(軟復(fù)位)的方法及討論

        單片機實現(xiàn)軟件復(fù)位(軟復(fù)位)的方法及討論

        作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        單片機軟復(fù)位有什么好的方法?如從機收到復(fù)位命令(軟件命令),程序怎么使機器復(fù)位?雖然要使軟件始終處于可控狀態(tài),最好不要用"復(fù)位",因為復(fù)位是純硬件過程,軟件是不可控的.但是我們還是要討論方法,一般流傳的方法如下:

        1、放狗;

        本文引用地址:http://www.104case.com/article/201611/321824.htm

        2、((void(code*)(void))0x0000)();

        3、用單片機一個引腳控制點一下RSTRST;

        4、用單片機一個引腳控制重新加電;

        5、用單片機自帶的軟件復(fù)位指令或內(nèi)狗指令;

        6、goto大法;

        天堂雨林博客對以上方法的意見:

        方法1:“放狗”是單片機軟復(fù)位的最好辦法,也基本上是唯一的一個辦法。但并不是所有單片機都具備看門狗的功能,也不是一個萬全之策。

        辦法2:這不是復(fù)位,只是把程序轉(zhuǎn)到地址0去執(zhí)行,不如用一個JMP更直接。目前可能極少數(shù)單片機或者用戶已經(jīng)自行添加Bootload時用戶程序的程序開始地址并不為0x0000,所以需要查找這些特定單片機的啟動地址。
        keilC51下面可以這樣實現(xiàn):
        voidsoft_reset(void)
        {
        ((void(code*)(void))0x0000)();
        }
        在需要軟件復(fù)位的地方使用語句:
        soft_reset();
        一般可實現(xiàn)軟件復(fù)位。

        辦法3:用軟件實現(xiàn)的硬復(fù)位。需要犧牲一個單片機引腳,且增加了單片機外部電路構(gòu)造的復(fù)雜性,很不可取。

        辦法4:類似辦法3,同樣需要犧牲一個單片機引腳,且增加了單片機外部電路構(gòu)造的復(fù)雜性,很不可取。但不能把它單單地當成是復(fù)位,應(yīng)該叫上電復(fù)位。

        辦法5:Atmel89C不帶內(nèi)狗,S的有內(nèi)狗,只是一條指令就行。如STC的單片機有軟件復(fù)位指令,即ISP_CONTR,地址在0E7H單元(即strISP_CONTR=0xE7),MOVISP_CONTR,#00100000B(C語言為ISP_CONTR=0x20),內(nèi)狗也是一條指令MOVWDT_CONTR,#00111100B!
        STC51系列單片機Datasheet中指出:傳統(tǒng)的8051單片機由于硬件上未支持此功能,用戶必須用軟件模擬實現(xiàn),實現(xiàn)起來較麻煩。現(xiàn)STC新推出的增強型8051根據(jù)客戶要求增加了ISP_CONTR特殊功能寄存器,實現(xiàn)了此功能。用戶只需簡單的控制ISP_CONTR特殊功能寄存器的其中兩位SWBS/SWRST就可以系統(tǒng)復(fù)位了。

        辦法6:程序從頭(上電復(fù)位處)開始運行,且只有一個循環(huán)這種情況,當然可以用goto,如在main()的開頭設(shè)一個start:,在程序的唯一循環(huán)中設(shè)定一個條件,然后goto命令。但需要注意,如果是在中斷例程里,那么中斷掛號寄存器仍置位,同級中斷不能執(zhí)行。所以必須先使中斷掛號寄存器清零,EA=0。只有RETI指令可以使中斷掛號寄存器清零。51單片機有兩級中斷優(yōu)先級,所以需要執(zhí)行兩次RETI指令。這用匯編是很簡單的事,而C則比較難以實現(xiàn)。但是,goto命令盡量不要用,因為goto會到處亂竄,而且goto不能跑到函數(shù)外面去執(zhí)行一個命令。

        最后總結(jié)如下:最好使用辦法5最為簡潔方便,使用辦法2實現(xiàn)也不失為一種好方法。



        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 来凤县| 南乐县| 沁水县| 淳化县| 华蓥市| 贵溪市| 贺兰县| 南汇区| 双桥区| 克什克腾旗| 墨竹工卡县| 通化市| 乐山市| 桃源县| 双桥区| 江孜县| 洪江市| 赤壁市| 潢川县| 厦门市| 武平县| 广饶县| 娄烦县| 台南县| 柳州市| 广丰县| 冀州市| 泸定县| 新巴尔虎左旗| 芜湖市| 开阳县| 廊坊市| 中方县| 彰化市| 弋阳县| 竹溪县| 雅安市| 施甸县| 巧家县| 若尔盖县| 承德县|