看了開發(fā)板配套光盤中的非操作系統(tǒng)示例代碼,試著進(jìn)行簡(jiǎn)化,只留下最核心的啟動(dòng)代碼,然后自己編寫makefile進(jìn)行編譯,燒錄到開發(fā)板中進(jìn)行實(shí)驗(yàn),總算成功了。第一個(gè)程序運(yùn)行后只是簡(jiǎn)單地讓4個(gè)LED輪流開啟關(guān)閉,雖然沒有看懂是怎么做到控制LED的,但看懂了系統(tǒng)啟動(dòng)部分,而且把有點(diǎn)亂的代碼整理得整齊了些;第二個(gè)程序運(yùn)行后可以從串口輸出文本,這對(duì)以后的進(jìn)一步學(xué)習(xí)很重要,因?yàn)榇谳敵鍪呛苤匾恼{(diào)試手段(從顯示屏輸出文本太復(fù)雜,不是初學(xué)者可以容易搞定的)。此外,看了《基于ARM的嵌入式系統(tǒng)開發(fā)與實(shí)例》,雖然第4章,第5章看得很暈,因?yàn)榇鎯?chǔ)器控制器比較復(fù)雜,書中講了好多硬件連接以及操作時(shí)序的問題,以前完全沒接觸過,基礎(chǔ)不夠,看不懂。但第6章和第7章講的中斷控制器和PWM定時(shí)器,看門狗定時(shí)器還是比較好懂的,然后結(jié)合S3C2440A用戶手冊(cè),了解了S3C2440A與書中講的S3C44B0X的區(qū)別。把書中的例子改成可以在自己的開發(fā)板上運(yùn)行的程序,燒錄進(jìn)去,運(yùn)行得與預(yù)期效果一致。 0 說明
本文引用地址:http://m.butianyuan.cn/article/201611/318885.htm 我用的開發(fā)板是mini2440,它采用的處理器是基于ARM920T的S3C2440A;而看的教材《基于ARM的嵌入式系統(tǒng)開發(fā)與實(shí)例》是以基于ARM7TDMI的S3C44B0X為例進(jìn)行講解的。
1 中斷控制器
S3C2440A可以接受60個(gè)來自內(nèi)部外設(shè)或者外部中斷引腳的中斷請(qǐng)求,多個(gè)中斷請(qǐng)求經(jīng)過仲裁判優(yōu)后向ARM920T核心發(fā)出IRQ或者FIQ請(qǐng)求。S3C2440A與S3C44B0X有幾處不同:
(1) 有些中斷請(qǐng)求是帶子寄存器的。這些請(qǐng)求先對(duì)子源中斷請(qǐng)求寄存器(SUBSRCPND)相應(yīng)位置1,再通過子中斷屏蔽寄存器(INTSUBMASK),然后才能進(jìn)入到源中斷寄存器(SRCPND)中,最后通過中斷屏蔽寄存器(INTMASK),再進(jìn)行模式(INTMOD)和優(yōu)先級(jí)(PRIORITY)判斷。在處理通過子中斷寄存器的中斷時(shí),要記得清除SUBSRCPND的相應(yīng)位。
(2)從用戶手冊(cè)上看,S3C2440A是沒有像S3C44B0X那樣的中斷控制寄存器的,不能選擇是使用向量中斷還是非向量中斷。書中講的IRQ向量模式寄存器應(yīng)該是對(duì)應(yīng)S3C2440A的中斷優(yōu)先級(jí)寄存器,S3C2440A的優(yōu)先級(jí)輪轉(zhuǎn)也比較好理解;至于中斷請(qǐng)求清除寄存器,S3C2440A好像是沒有對(duì)應(yīng)的寄存器的。在這上面,S3C44B0X似乎復(fù)雜一些。
下面是來自S3C2440A用戶手冊(cè)的中斷處理過程圖:
2 PWM定時(shí)器
這方面S3C2440A與S3C44B0X沒有太大的不同,書中講的基本原理與定時(shí)器特性適用于S3C2440A。
3 看門狗定時(shí)器
除主時(shí)鐘輸入頻率不同外,S3C2440A與S3C44B0X沒有大的差別。
4 源代碼
(1)PWM定時(shí)器處理代碼
static int int_count;
static __irq void Timer0_Int(void)
{
Uart_Printf("nTimer 0 interrupt %d times",++int_count);
rSRCPND = BIT_TIMER0;
rINTPND = BIT_TIMER0;
}
void Timer0_Start(void)
{
int i;
rTCFG0 = 0xFF;// 定時(shí)器0,1的預(yù)分頻值為255
rTCFG1 = 0x2; // 定時(shí)器0的時(shí)鐘分割器采用1/8分頻
rTCNTB0 = 25600;
rTCON = 0x06;
for(i=0;i<1000;i++);
rTCON = 0x09;
pISR_TIMER0 = (unsigned int)Timer0_Int;
rINTMSK &= (~BIT_TIMER0);
}
(2)看門狗定時(shí)器處理代碼
static int int_count;
#define SUB_BIT_WDT (0x01 << 13)
static __irq void Watchdog_Int(void)
{
Uart_Printf("nWatchdog interrupt %d times",++int_count);
rSUBSRCPND = SUB_BIT_WDT;
rSRCPND = BIT_WDT_AC97;
rINTPND = BIT_WDT_AC97;
}
void Watchdog_Start(void)
{
rWTCNT = 16000;
rWTDAT = 16000;
pISR_WDT_AC97 = (unsigned int)Watchdog_Int;
rINTMSK &= (~BIT_WDT_AC97);
rINTSUBMSK &= (~SUB_BIT_WDT);
// 0xFF3C=不產(chǎn)生復(fù)位信號(hào) 0xFF3D=產(chǎn)生復(fù)位信號(hào),約10秒后系統(tǒng)復(fù)位
rWTCON = 0xFF3C;
}
(3)說明
主函數(shù)中執(zhí)行下列代碼:
Timer0_Start();
Watchdog_Start();
while(1);
會(huì)看到串口約1秒輸出一次定時(shí)器中斷處理消息,約10秒輸出一次看門狗中斷處理消息。如果設(shè)置看門狗定時(shí)器控制寄存器的值為0xFF3D,則看門狗定時(shí)器超時(shí)時(shí),會(huì)發(fā)出復(fù)位信號(hào),即大約每隔10秒,系統(tǒng)會(huì)復(fù)位一次。
主程序在運(yùn)行死循環(huán),但串口輸出還是可以進(jìn)行的,這就是中斷的功能了:中斷程序的執(zhí)行,處理其他事務(wù)。以前學(xué)微機(jī)原理的時(shí)候,講中斷只是抽象的概念,不好理解,這里就看得比較清楚了。
中斷處理函數(shù)中,應(yīng)該清除相應(yīng)的中斷請(qǐng)求位。對(duì)于看門狗中斷,由于是通過子中斷寄存器的,所以還要清除子中斷源請(qǐng)求寄存器。如果不進(jìn)行清除動(dòng)作,則中斷請(qǐng)求一直保持,相當(dāng)于不停地發(fā)生中斷,無法返回到主程序中。
armcc擴(kuò)展了C語言,提供__irq關(guān)鍵字用以定義中斷處理函數(shù)。曾試著不使用__irq,但無論是用C語言還是匯編語言編程,都無法正確實(shí)現(xiàn)中斷處理,還是對(duì)中斷處理中應(yīng)該進(jìn)行的保存恢復(fù)寄存器,以及返回到主程序的操作不熟悉,等以后熟悉了再試著不用這個(gè)關(guān)鍵字吧。
5 兩個(gè)術(shù)語
PWM:Pulse Width Modulation,脈寬調(diào)制。
脈寬調(diào)制(PWM:(Pulse Width Modulation)是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測(cè)量、通信到功率控制與變換的許多領(lǐng)域中。
簡(jiǎn)而言之,PWM是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。PWM信號(hào)仍然是數(shù)字的,因?yàn)樵诮o定的任何時(shí)刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。通的時(shí)候即是直流供電被加到負(fù)載上的時(shí)候,斷的時(shí)候即是供電被斷開的時(shí)候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。
看門狗:Watchdog
在由單片機(jī)構(gòu)成的微型計(jì)算機(jī)系統(tǒng)中,由于單片機(jī)的工作常常會(huì)受到來自外界電磁場(chǎng)的干擾,造成程序的跑飛,而陷入死循環(huán),程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)無法繼續(xù)工作,會(huì)造成整個(gè)系統(tǒng)的陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果,所以出于對(duì)單片機(jī)運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)測(cè)的考慮,便產(chǎn)生了一種專門用于監(jiān)測(cè)單片機(jī)程序運(yùn)行狀態(tài)的芯片,俗稱“看門狗”。
看門狗電路電路的應(yīng)用,使單片機(jī)可以在無人狀態(tài)下實(shí)現(xiàn)連續(xù)工作,其工作原理是:看門狗芯片和單片機(jī)的一個(gè)I/O引腳相連,該I/O引腳通過程序控制它定時(shí)地往看門狗的這個(gè)引腳上送入高電平(或低電平),這一程序語句是分散地放在單片機(jī)其他控制語句中間的,一旦單片機(jī)由于干擾造成程序跑飛后而陷入某一程序段進(jìn)入死循環(huán)狀態(tài)時(shí),寫看門狗引腳的程序便不能被執(zhí)行,這個(gè)時(shí)候,看門狗電路就會(huì)由于得不到單片機(jī)送來的信號(hào),便在它和單片機(jī)復(fù)位引腳相連的引腳上送出一個(gè)復(fù)位信號(hào),使單片機(jī)發(fā)生復(fù)位,即程序從程序存儲(chǔ)器的起始位置開始執(zhí)行,這樣便實(shí)現(xiàn)了單片機(jī)的自動(dòng)復(fù)位。
看門狗,又叫 watchdog timer,是一個(gè)定時(shí)器電路, 一般有一個(gè)輸入,叫喂狗,一個(gè)輸出到MCU的RST端,MCU正常工作的時(shí)候,每隔一端時(shí)間輸出一個(gè)信號(hào)到喂狗端,給 WDT 清零,如果超過規(guī)定的時(shí)間不喂狗,(一般在程序跑飛時(shí)),WDT 定時(shí)超過,就回給出一個(gè)復(fù)位信號(hào)到MCU,是MCU復(fù)位. 防止MCU死機(jī). 看門狗的作用就是防止程序發(fā)生死循環(huán),或者說程序跑飛。(
評(píng)論