TI的MSP430系列是一款功耗低、市面流行的SOC結(jié)構(gòu)的CPU,適合做智能儀表。IAR對(duì)其支持得很好,下面就以IAR調(diào)試為例來(lái)說(shuō)說(shuō)MSP430調(diào)試過(guò)程中一些問(wèn)題。
1、接上仿真器,發(fā)現(xiàn)不能下載,IAR提示找不到目標(biāo)。
(1)并口驅(qū)動(dòng)能力不足,在電腦的BIOS界面下設(shè)置成ECP或者ECP+EPP模式;(2)JTAG線太長(zhǎng),一般超過(guò)20CM不推薦,而且這個(gè)線最好不要交叉纏繞,會(huì)影響實(shí)時(shí)在線調(diào)試;
?。?)負(fù)載太大,一般功耗相對(duì)比較大,電流超過(guò)20MA以上的板子,建議用外接電源,光靠并口的電源,MCU的電壓被拉低到不能寫(xiě)FLASH。
2、程序下載到一半,突然告警并報(bào)錯(cuò),說(shuō)某某地址寫(xiě)不進(jìn)去。
(1)芯片的復(fù)位電路引起的,在寫(xiě)FLASH的時(shí)候,會(huì)造成系統(tǒng)電壓的一些波動(dòng),可能導(dǎo)致芯片復(fù)位,而為什么都是寫(xiě)到這個(gè)地址才錯(cuò),那是IAR的問(wèn)題,改用BSL再燒一邊,就可以克服了。
?。?)芯片有可能死機(jī)了,斷電,拔掉JTAG,稍后再試,一般沒(méi)有問(wèn)題
(3)如果都不是上述的方法能解決的,可以給芯片上電,電壓=3。6V,重新寫(xiě)一次,一般就OK了。為什么,寫(xiě)不進(jìn)FLASH主要是F1XX系列的寫(xiě)FLASH電壓不能低于2.7V,一般2.5V以下就不工作了,因此用3.6V電壓,什么樣的片子都能寫(xiě)回來(lái)。
3、F1611大數(shù)組定義,不能正常運(yùn)行的問(wèn)題
相信有不少朋友已經(jīng)用上了F1611,這個(gè)RAM相對(duì)大的MSP430,可能會(huì)遇到RAM中定義的變量/數(shù)組在超過(guò)一個(gè)極限的時(shí)候,MSP程序不能正常運(yùn)行的現(xiàn)象。一般初步判斷,可以用I/O輸出電平來(lái)確定程序進(jìn)程,這樣可以非常方便的知道該問(wèn)題是由于WDT造成的,因?yàn)镕1611等較大的RAM的初始化時(shí)間大于WDT默認(rèn)的32MS時(shí)間,導(dǎo)致MSP復(fù)位。
?。?)對(duì)數(shù)組用__noinit_定義,上電,編譯器不產(chǎn)生特殊的附加函數(shù)去初始化RAM。(2)修改IAR中Cstartup.S43文件中__program_start子程序,增加一個(gè)關(guān)閉WDT的操作或者設(shè)置WDT時(shí)間長(zhǎng)度超過(guò)32MS。
?。?)在Project--Options--Linker--Config中選擇Overridedefault
programe,并將Entrylib設(shè)置成__program_start
上述是已知解決1611RAM初始化時(shí)間超WDT默認(rèn)而復(fù)位的解決方法,如果用匯編,則沒(méi)有這個(gè)問(wèn)題。
4、SVS導(dǎo)致MSP“壞死”問(wèn)題
SVS在F42X里可是個(gè)不錯(cuò)的模塊,外部設(shè)計(jì)可以節(jié)約一個(gè)VD,成本和空間。在使用
時(shí),如果SVS的電壓設(shè)置在3.3V,結(jié)果一次JTAG寫(xiě)入后,板子便沒(méi)有再起來(lái)工作,很多人認(rèn)為寫(xiě)廢了這個(gè)MSP。此時(shí),可以判斷MCU是否還能工作的方法:接上電源和電流表,如果發(fā)現(xiàn)電流有周期性跳躍,確定MCU正在被SVS復(fù)位。
解決方法:重新加電壓,超過(guò)3.3V,修改設(shè)置,重寫(xiě)FLASH
MSP430單片機(jī)的程序有時(shí)候容易出現(xiàn)跑飛的情況,導(dǎo)致運(yùn)行不正常。常見(jiàn)原因總結(jié)如下:
沒(méi)有設(shè)置停止看門(mén)狗,也沒(méi)有及時(shí)喂狗
沒(méi)有定義中斷函數(shù),但又開(kāi)啟了對(duì)應(yīng)的中斷,發(fā)生中斷時(shí),找不到中斷函數(shù)入口
供電電壓不穩(wěn),或IO管腳輸入過(guò)大電壓,導(dǎo)致內(nèi)部數(shù)據(jù)受到干擾
內(nèi)存溢出,比如使用sprintf之類(lèi)的函數(shù)很容易出現(xiàn)這種問(wèn)題
msp430程序跑飛之解決方法
1.中斷或主函數(shù)中有死循環(huán),現(xiàn)象是程序停在某處。
2.堆棧溢出?,F(xiàn)象是程序跑飛。
解決辦法:
A.看中斷有沒(méi)有用 _EINT(),引起中斷嵌套。
B.Project--Options--General Options---Stack/Heap 將Stack size設(shè)置大一些。
3.中斷耗時(shí)太長(zhǎng),剛出中斷又進(jìn)去了。這時(shí)的現(xiàn)象是程序一直在中斷中執(zhí)行,回不到主函數(shù)。
4.檢查CPU的電源是不是穩(wěn)定,msp430在要保證程序正常運(yùn)行,需保證Vcc大于1.8V。當(dāng)電壓低至0.8V時(shí),程序仍有可能執(zhí)行。這時(shí)的現(xiàn)象是PC指針亂飛,有復(fù)位,死機(jī),停在中斷,時(shí)鐘頻率發(fā)生變化等現(xiàn)象。
5.程序編譯沒(méi)問(wèn)題,下載程序后上電不斷復(fù)位,該問(wèn)題是由于WDT造成的(RAM的初始化時(shí)間大于WDT默認(rèn)的32MS時(shí)間,因此MSP復(fù)位)根本原因是初始化的時(shí)間過(guò)長(zhǎng),超過(guò)了看門(mén)狗的時(shí)間,初始化完成以后才能進(jìn)入main函數(shù),這時(shí)關(guān)狗已經(jīng)來(lái)不及了。
解決的辦法:
A 對(duì)你的數(shù)組用 __no init_定義,上電編譯器不產(chǎn)生特殊的附加函數(shù)去初始化RAM.
B 在Project--Options--Linker--Config中選擇 Override default programe,并將Entry lib 設(shè)置成 __program_start這時(shí)要修改Cstartup.S43(記得把它加入復(fù)制到工程而不是修改系統(tǒng)的),在第一條指令前加入關(guān)狗的指令,在main函數(shù)里再開(kāi)(如果需要的話)。
如果用匯編,則沒(méi)有這個(gè)問(wèn)題
評(píng)論