版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章LPC1700系列處理器4.1GPIO接口4.2定時(shí)器4.3看門狗4.4UART串口通信4.5ADC/DAC4.6實(shí)時(shí)時(shí)鐘4.7其它接口
基本接口技術(shù)
LPC1700系列嵌入式處理器具有豐富的外設(shè)接口,以滿足不同應(yīng)用場合的需要。處理器中內(nèi)嵌1個(gè)10/100M以太網(wǎng)介質(zhì)詢問控制器(MAC),1個(gè)帶4KB端點(diǎn)RAM的USB2.0全速device/host/OTG控制器,4個(gè)UART串行口,2個(gè)CAN通道,1個(gè)SPI接口,2個(gè)同步串行口(SSP),3個(gè)I2C接口和1個(gè)I2S接口。為了支持上述串行通信接口,LPC1700系列處理器采用了一些特殊的部件,主要包括1個(gè)片上4MHz內(nèi)置高精度時(shí)鐘發(fā)生器;共計(jì)64KB的片內(nèi)RAM,32KB的本地SRAM,2個(gè)共AHB總線模塊使用的16KBSRAM,該SRAM用以支持以太網(wǎng)、USB、DMA存儲(chǔ)器等模塊操作。除了上述串行通信控制器外,LPC1700系列處理器還具有4個(gè)32位的定時(shí)器,1個(gè)看門狗,1個(gè)正交編碼器接口,1個(gè)RTC,1個(gè)增強(qiáng)12位8通道的ADC和10位DAC,2個(gè)PWM單元,4根外部中斷引腳,以及多至70條的快速GPIO引腳。所有這些接口及特性使得LPC1700系列處理器特別適合于電子測量、工業(yè)控制總線、白色家電、報(bào)警系統(tǒng)以及電機(jī)控制系統(tǒng)等應(yīng)用場合。
本章選取實(shí)際應(yīng)用中所使用的基本外設(shè)接口進(jìn)行介紹,使讀者對LPC1700系列處理器的應(yīng)用有一個(gè)初步了解。LPC1700系列處理器的高級通信接口將在下一章介紹。
4.1.1特性
LPC1700嵌入式處理器共有5個(gè)通用輸入/輸出端口,即GPIO接口,占用P0~P4共70根引腳。這些引腳一般與其它外圍設(shè)備模塊引腳復(fù)用,所以在某些應(yīng)用場合不是所有GPIO引腳都能使用。4.1GPIO接口
1.?dāng)?shù)字I/O端口
LPC1700嵌入式處理器采取以下方法加速GPIO端口的操作速度:GPIO寄存器被安排在外設(shè)AHB總線尋址空間,以實(shí)現(xiàn)高速的I/O時(shí)序;屏蔽寄存器允許將某些端口位作為一組進(jìn)行操作,而其它位不變;所有GPIO寄存器都可按字節(jié)、半字和字尋址;整個(gè)端口值可用一條指令寫入;GPIO寄存器可由GPDMA進(jìn)行訪問。
其它特性還包括:位電平置位和清零寄存器允許用一條指令置位清零一個(gè)端口的任意位;所有GPIO寄存器支持Cortex-M3位帶操作;GPIO寄存器可由GPDMA控制器進(jìn)行訪問,允許對GPIO進(jìn)行DMA數(shù)據(jù)操作,使之與DMA請求同步;單個(gè)端口的方向可控制;所有I/O口在復(fù)位后默認(rèn)為上拉輸入。
2.中斷信號產(chǎn)生端口
LPC1700端口0和端口2的每根引腳都可以產(chǎn)生中斷信號。每個(gè)中斷信號可編程設(shè)置為上升沿觸發(fā)、下降沿觸發(fā)或脈沖觸發(fā)。每個(gè)使能的中斷可作為喚醒信號,用于把某個(gè)模塊從省電模式中喚醒。用戶軟件通過操作GPIO寄存器,可以掛起上升沿中斷、下降沿中斷和GPIO總中斷。邊沿檢測是異步的,因此可以在沒有時(shí)鐘的情況下(例如掉電模式)操作。由于這種特性,就無需電平觸發(fā)中斷。
端口0和端口2的中斷信號與VIC的外部中斷3共享同一個(gè)中斷通道。4.1.2應(yīng)用場合
通用輸入/輸出端口GPIO引腳可以用于驅(qū)動(dòng)LED或其它指示設(shè)備,用于控制片外設(shè)備,用于探測數(shù)字輸入信號和檢測電平跳變,還可以用于喚醒某個(gè)在省電模式中的外圍模塊。4.1.3引腳描述
GPIO引腳描述如表4.1所示。
表4.1GPIO引腳描述4.1.4寄存器描述
由于LPC1700嵌入式處理器要求與基于ARM7內(nèi)核的LPC2300系列產(chǎn)品相兼容,故該處理器只實(shí)現(xiàn)了5個(gè)32位通用I/O端口中的部分通用引腳功能。具體細(xì)節(jié)見“引腳功能選擇寄存器”章節(jié)。
表4.2的GPIO地址映射寄存器反映了所有GPIO口可用的增強(qiáng)型GPIO特性(快速GPIO特性,局部總線可訪問寄存器)。這些寄存器位于AHB總線尋址空間,以便進(jìn)行高速的讀寫時(shí)序。它們支持字節(jié)、半字和字的不同大小的數(shù)據(jù)訪問。屏蔽寄存器允許訪問一個(gè)GPIO端口的一組位,而不影響其它位。
表4.2GPIO寄存器地址映射表
表4.3GPIO中斷寄存器地址映射特性1.GPIO端口方向控制寄存器(FIO[0/1/2/3/4]DIR-0x2009C0[0/2/4/6/8]0)
該32位寄存器用于控制已配置為GPIO的引腳的輸入/輸出方向。在實(shí)際應(yīng)用中應(yīng)根據(jù)引腳的功能正確設(shè)置其輸入/輸出方向??焖貵PIO端口方向控制寄存器的特征如表4.4所示。
表4.4快速GPIO端口方向控制寄存器的特征
除了只能按32位訪問的FIOxDIR寄存器外,每個(gè)快速GPIO端口可以通過幾個(gè)8位和16位寄存器控制。表4.5列出的寄存器雖然功能與FIOxDIR相同,但使用這些寄存器用戶程序能更快更容易地訪問物理端口。
表4.5快速GPIO方向控制8位和16位寄存器續(xù)表2.GPIO端口輸出置位寄存器(FIO[0/1/2/3/4]SET-0x2009C0[1/3/5/7/9]8)
該寄存器用于在GPIO的輸出引腳產(chǎn)生高電平輸入。對應(yīng)位寫1,則對應(yīng)引腳輸出高電平,寫0無效。如果引腳被配置位為輸入或其它功能,則寫1也無效。對該寄存器執(zhí)行讀操作,返回前一次對該寄存器寫入的值,而對外部引腳狀態(tài)無影響。
讀FIOxSET寄存器返回該寄存器的值,該值由前一次對FIOxSET和FIOxCLR(或前面提到的FIOxPIN)的寫操作確定,它不反映任何外部環(huán)境對I/O引腳的影響。對FIOSET寄存器的訪問是否有效要根據(jù)FIOMASK寄存器的對應(yīng)位的狀態(tài)而定。快速GPIO端口輸出置位寄存器特性如表4.6所示。
表4.6快速GPIO端口輸出置位寄存器
除了只能按32位訪問的FIOxSET寄存器外,每個(gè)快速GPIO端口可以通過幾個(gè)8位和16位寄存器控制。表4.7列出的寄存器雖然功能與FIOxSET相同,但使用這些寄存器用戶程序能更快更容易地訪問物理端口。
表4.7快速GPIO端口輸出置位8位和16位寄存器3.GPIO端口輸出清除寄存器(FIO[0/1/2/3/4]CLR-0x2009C0[1/3/5/7/9]C)
該寄存器用于在GPIO的輸出引腳產(chǎn)生低電平輸出。對應(yīng)位寫1,則對應(yīng)引腳輸出低電平并且清除FIOSET寄存器中對應(yīng)位,寫0無效。如果引腳被配置位為輸入或其它功能,則寫1也無效。
對FIOCLR寄存器的訪問是否有效要根據(jù)FIOMASK寄存器的對應(yīng)位的狀態(tài)而定??焖貵PIO端口輸出清除寄存器特性如表4.8所示。
表4.8快速GPIO端口輸出清除寄存器特性
除了只能按32位訪問的FIOxCLR寄存器外,每個(gè)快速GPIO端口可以通過幾個(gè)8位和16位寄存器控制。表4.9列出的寄存器雖然功能與FIOxCLR相同,但使用這些寄存器用戶程序能更快更容易地訪問物理端口。
表4.9快速GPIO端口輸出清除8位和16位寄存器4.GPIO端口引腳值寄存器(FIO[0/1/2/3/4]PIN-0x2009C0[1/3/5/7/9]4)
該寄存器只提供那些被配置為數(shù)字功能的引腳端口值。寄存器保存了端口引腳的邏輯值,而無論引腳被配置位輸入或輸出,亦或配置為數(shù)字功能模塊。比如,某個(gè)端口引腳可以配置為GPIO輸入、輸出,UART輸入,PWM輸出等功能。但該端口所有引腳的邏輯狀態(tài)可以在FIOPIN寄存器中讀出。如果引腳被設(shè)置為模擬功能,引腳的狀態(tài)則不能被有效讀到。例如引腳被配置為A/D輸入,則該引腳在FIOPIN中的值無效。
寫入FIOPIN寄存器的值保存在端口的輸出寄存器中,省去了分別寫FIOSET和FIOCLR寄存器的步驟。使用該寄存器時(shí)要特別注意,因?yàn)橐坏┮粋€(gè)值寫入,整個(gè)端口引腳的狀態(tài)都被更新了。如某端口所有引腳配置為GPIO輸出,則向FIOXPIN寫入0x0000FFFF時(shí),端口的高16根引腳變?yōu)榈碗娖捷敵?,?6根引腳變?yōu)楦唠娖捷敵?。對FIOPIN寄存器的訪問是否有效要根據(jù)FIOMASK寄存器的對應(yīng)位的狀態(tài)而定??焖貵PIO端口引腳值寄存器特性如表4.10所示。
表4.10快速GPIO端口引腳值寄存器特性
除了只能按32位訪問的FIOxPIN寄存器外,每個(gè)快速GPIO端口可以通過幾個(gè)8位和16位寄存器控制。表4.11列出的寄存器雖然功能與FIOxPIN相同,但使用這些寄存器用戶程序能更快更容易地訪問物理端口。
表4.11快速GPIO端口引腳值8位和16位寄存器續(xù)表5.快速GPIO端口屏蔽寄存器(FIO[0/1/2/3/4]MASK-0x2009C0[1/3/5/7/9]0)
該寄存器屬于快速GPIO端口寄存器組。它用于允許或禁止通過寫FIOPIN、FIOSET和FIOCLR寄存器來控制端口引腳狀態(tài)的操作。屏蔽寄存器也能用于屏蔽對FIOPIN寄存器的讀操作。
如果寄存器中某位為0,則允許讀或?qū)懖僮鲗?yīng)端口引腳;如果寄存器中某位為1,則無法通過寫操作改變引腳狀態(tài);如果讀取FIOPIN寄存器,該引腳的當(dāng)前狀態(tài)也不會(huì)反映出來。快速GPIO端口屏蔽寄存器特性如表4.12所示。
表4.12快速GPIO端口屏蔽寄存器特性
除了只能按32位訪問的FIOxMASK寄存器外,每個(gè)快速GPIO端口可以通過幾個(gè)8位和16位寄存器控制。表4.13列出的寄存器雖然功能與FIOxMASK相同,但使用這些寄存器用戶程序能更快更容易地訪問物理端口。
表4.13快速GPIO端口屏蔽8位和16位寄存器6.GPIO總中斷狀態(tài)寄存器(IOIntStatus-0x40028080)
該只讀寄存器保存了支持中斷的GPIO端口產(chǎn)生的中斷請求。寄存器每位代表一個(gè)端口。GPIO總中斷狀態(tài)寄存器特性如表4.14所示。
表4.14GPIO總中斷狀態(tài)寄存器特性7.GPIO上升沿中斷使能寄存器(IO[0/2]IntEnR-0x400280[9/B]0)
該讀寫寄存器每位使能對應(yīng)GPIO端口引腳為上升沿觸發(fā)中斷。GPIO上升沿中斷使能寄存器特性如表4.15所示。
8.GPIO下降沿中斷使能寄存器(IO[0/2]IntEnF-0x400280[9/B]4)
該讀寫寄存器每位使能對應(yīng)GPIO端口引腳為下降沿觸發(fā)中斷。GPIO下降沿中斷使能寄存器特性如表4.16所示。
表4.15GPIO上升沿中斷使能寄存器特性
表4.16GPIO下降沿中斷使能寄存器特性9.GPIO上升沿中斷狀態(tài)寄存器(IO[0/2]IntStatR-0x400280[8/A]4)
該讀寫寄存器每位表示對應(yīng)端口各引腳的上升沿中斷狀態(tài)。GPIO上升沿中斷狀態(tài)寄存器特性如表4.17所示。
表4.17GPIO上升沿中斷狀態(tài)寄存器特性
10.GPIO下降沿中斷狀態(tài)寄存器(IO[0/2]IntStatF-0x400280[8/A]8)
該讀寫寄存器每位表示對應(yīng)端口各引腳的下降沿中斷狀態(tài)。GPIO下降沿中斷狀態(tài)寄存器特性如表4.18所示。
表4.18GPIO下降沿中斷狀態(tài)寄存器特性
11.GPIO中斷清除寄存器(IO[0/2]IntClr-0x400280[8/A]C)
該寄存器為只讀,對每位寫1則清除對應(yīng)GPIO端口的任何中斷狀態(tài)。GPIO中斷清除寄存器特性如表4.19所示。
表4.19GPIO中斷清除寄存器4.1.5使用注意事項(xiàng)
下面通過兩個(gè)例子說明使用GPIO接口應(yīng)注意的事項(xiàng)。
例4.1
順序訪問FIOSET和FIOCLR控制GPIO引腳。
GPIO輸出引腳由端口對應(yīng)的FIOSET和FIOCLR寄存器確定。最后一次訪問FIOSET或FIOCLR寄存器決定引腳最終輸出狀態(tài)。
【程序4.1】順序訪問FIOSET和FIOCLR控制GPIO引腳。
FIO0DIR=0x00000080; //端口0引腳7配置位輸出
FIO0CLR=0x00000080; //該引腳輸出低電平
FIO0SET=0x00000080; //該引腳輸出高電平
FIO0CLR=0x00000080; //該引腳輸出低電平
例4.2
寫FIOPIN寄存器從端口0輸出二進(jìn)制數(shù)據(jù)。
在實(shí)際應(yīng)用時(shí),先寫入FIOSET然后再寫入FIOCLR,這樣引腳先輸出0(低電平),一個(gè)小延遲后輸出1(高電平)。有的應(yīng)用系統(tǒng)可以忍受這樣的延遲,但有些系統(tǒng)卻要求在一個(gè)端口同時(shí)輸出一個(gè)由0、1混合的二進(jìn)制內(nèi)容。所以通過對FIOPIN寄存器的操作就可以實(shí)現(xiàn)這一要求。下列代碼保持端口0的引腳16~31和0~7不變,同時(shí)在引腳8~15輸出0xA5,無論之前引腳為何值。
【程序4.2】使用32位快速GPIO寄存器。
FIO0MASK=0xFFFF00FF;
FIO0PIN=0x0000A500;
【程序4.3】使用16位快速GPIO寄存器。
FIO0MASKL=0x00FF;
FIO0PINL=0xA500;
【程序4.4】使用8位快速GPIO寄存器。
FIO0PIN1=0xA5;寫FIOSET/FIOCLR寄存器與寫FIOPIN寄存器有以下區(qū)別:
(1)對FIOSET/FIOLCR寄存器寫1可以很方便地改變引腳狀態(tài),而只有對寄存器位寫1的引腳狀態(tài)被改變,其它引腳保持不變。但如果要在GPIO端口同時(shí)輸出0和1混合的二進(jìn)制數(shù)值時(shí)則不能用FIOSET/FIOCLR寄存器。
(2)寫FIOPIN寄存器則可以在并行GPIO同時(shí)輸出需要的二進(jìn)制數(shù)值。寫入FIOPIN寄存器的二進(jìn)制數(shù)據(jù)將影響所有被配置為輸出的引腳狀態(tài):寫入數(shù)據(jù)0引腳輸出低電平;寫入數(shù)據(jù)1引腳輸出高電平。為了只改變端口中某幾根引腳狀態(tài),應(yīng)用程序必須將FIOPIN內(nèi)容讀出并和一個(gè)屏蔽碼相與,屏蔽碼中的0位引腳將被設(shè)置,1位引腳將保持不變。最后這個(gè)結(jié)果或上一個(gè)需要輸出的內(nèi)容,再保存入FIOPIN寄存器。例4.2就是這樣一種情況,端口0的15至8引腳輸出0xA5,其它引腳保持不變。4.1.6應(yīng)用舉例
本例使用端口2的P2.0~P2.7共8根引腳控制8盞LED燈。當(dāng)引腳輸出高電平時(shí)點(diǎn)亮LED燈,輸出低電平熄滅LED燈。
1.GPIO端口寄存器相關(guān)宏定義
為了方便用戶使用GPIO端口的寄存器,在頭文件中定義了GPIO端口的結(jié)構(gòu)體類型以及5個(gè)端口的結(jié)構(gòu)體指針宏。具體程序如代碼清單4.5所示。
【程序4.5】GPIO端口寄存器相關(guān)宏定義。
typedefstruct //結(jié)構(gòu)體中寄存器的安排嚴(yán)格按照寄存器地址的先后順序
{
union{
_IOuint32_tFIODIR;
struct{
_IOuint16_tFIODIRL;
_IOuint16_tFIODIRH;
};
struct{
_IOuint8_tFIODIR0;
_IOuint8_tFIODIR1;
_IOuint8_tFIODIR2;
_IOuint8_tFIODIR3;
};
};
uint32_tRESERVED0[3];
union{
_IOuint32_tFIOMASK;
…
};
union{
_IOuint32_tFIOPIN;
…
};
union{
_IOuint32_tFIOSET;
…
};
union{
_Ouint32_tFIOCLR;
…
};
}LPC_GPIO_TypeDef;
//各個(gè)端口寄存器基地址宏定義
#defineLPC_GPIO_BASE(0x2009C000UL)
#defineLPC_GPIO0_BASE(LPC_GPIO_BASE+0x00000)
#defineLPC_GPIO1_BASE(LPC_GPIO_BASE+0x00020)
#defineLPC_GPIO2_BASE(LPC_GPIO_BASE+0x00040)
#defineLPC_GPIO3_BASE(LPC_GPIO_BASE+0x00060)
#defineLPC_GPIO4_BASE(LPC_GPIO_BASE+0x00080)
//各個(gè)端口寄存器指針宏定義
#defineLPC_GPIO0((LPC_GPIO_TypeDef*)LPC_GPIO0_BASE)
#defineLPC_GPIO1((LPC_GPIO_TypeDef*)LPC_GPIO1_BASE)
#defineLPC_GPIO2((LPC_GPIO_TypeDef*)LPC_GPIO2_BASE)
#defineLPC_GPIO3((LPC_GPIO_TypeDef*)LPC_GPIO3_BASE)
#defineLPC_GPIO4((LPC_GPIO_TypeDef*)LPC_GPIO4_BASE)
2.LED燈初始化函數(shù)——LED_init()
LED_init()函數(shù)只是端口的簡單設(shè)置,要是端口既有輸出又有輸入則可分別獨(dú)立設(shè)置引腳方向。另外程序還定義了LED位數(shù)及屏蔽碼。具體程序如代碼清單4.6所示。
【程序4.6】GPIO端口初始化函數(shù)。
#defineLED_NUM8/*NumberofuserLEDs*/
constunsignedlongled_mask[]={1UL<<0,1UL<<1,1UL<<2,1UL<<3,1UL<<4,
1UL<<5,1UL<<6,1UL<<7};
voidLED_init(void){
LPC_GPIO2->FIODIR|=0x000000ff;//P2.0...P2.7OutputLEDsonPORT2definedasOutput
}
3.LED燈點(diǎn)亮函數(shù)——LedOn()
LedOn()函數(shù)中設(shè)置FIO2SET寄存器的某位為1,控制端口2引腳輸出高電平,從而點(diǎn)亮LED燈。函數(shù)參數(shù)num為具體點(diǎn)亮LED燈的序號0~7。具體代碼如代碼清單4.7
所示。
【程序4.7】LED燈點(diǎn)亮函數(shù)。
voidLED_On(unsignedintnum){
LPC_GPIO2->FIOPIN|=led_mask[num];
}
4.LED燈熄滅函數(shù)——LedOff()
LedOff()函數(shù)中設(shè)置FIO2CLR寄存器的某位為1,控制端口2引腳輸出低電平,從而熄滅LED燈。函數(shù)參數(shù)num為具體熄滅LED燈的序號0~7。具體代碼如代碼清單4.8所示。
【程序4.8】LED燈熄滅函數(shù)。
voidLED_Off(unsignedintnum){
LPC_GPIO2->FIOPIN&=~led_mask[num];
}
4.2.1特性
LPC1700嵌入式處理器具有4個(gè)32位可編程定時(shí)/計(jì)數(shù)器,除了外設(shè)基址之外操作完全相同。4個(gè)定時(shí)器最少有2個(gè)捕獲輸入和2個(gè)匹配輸出,并且每個(gè)定時(shí)器有多個(gè)引腳可選擇。定時(shí)器2引出了全部4個(gè)匹配輸出。
4.2定時(shí)器定時(shí)/計(jì)數(shù)器對外設(shè)時(shí)鐘(PCLK)周期或外部時(shí)鐘進(jìn)行計(jì)數(shù),可選擇產(chǎn)生中斷或根據(jù)匹配寄存器的設(shè)定,在到達(dá)指定的定時(shí)值時(shí)執(zhí)行其它動(dòng)作(輸出高/低電平、翻轉(zhuǎn)或者無動(dòng)作)。捕獲輸入用于在輸入信號發(fā)生跳變時(shí)捕獲定時(shí)器值,并可選擇產(chǎn)生中斷。
4個(gè)定時(shí)器可用作對內(nèi)部事件進(jìn)行計(jì)數(shù)的間隔定時(shí)器,或者通過捕獲輸入實(shí)現(xiàn)脈寬調(diào)制,也可以作為自由運(yùn)行的定時(shí)器。
LPC1700定時(shí)器的主要特點(diǎn)有:
(1)帶可編程32位預(yù)分頻器的32位定時(shí)器/計(jì)數(shù)器。
(2)具有多達(dá)4路32位的捕獲通道,當(dāng)輸入信號跳變時(shí)可取得定時(shí)器的瞬時(shí)值,也可選擇使捕獲事件產(chǎn)生中斷。
(3)具有4個(gè)32位匹配寄存器:
●匹配時(shí)定時(shí)器繼續(xù)工作,可選擇產(chǎn)生中斷;
●匹配時(shí)停止定時(shí)器,可選擇產(chǎn)生中斷;
●匹配時(shí)復(fù)位定時(shí)器,可選擇產(chǎn)生中斷。
(4)具有多達(dá)4個(gè)對應(yīng)于匹配寄存器的外部輸出,具有下列特性:
●匹配時(shí)設(shè)置為低電平;
●匹配時(shí)設(shè)置為高電平;
●匹配時(shí)翻轉(zhuǎn);
●配時(shí)無動(dòng)作。4.2.2應(yīng)用場合
LPC1700定時(shí)器主要運(yùn)用于以下場合:
(1)對內(nèi)部事件計(jì)數(shù)的內(nèi)部計(jì)數(shù)器。
(2)通過捕獲輸入實(shí)現(xiàn)脈沖寬度調(diào)制器。
(3)普通定時(shí)器。
4.2.3定時(shí)器結(jié)構(gòu)
定時(shí)器邏輯框圖如圖4.1所示。
圖4.1定時(shí)器邏輯框圖4.2.4引腳功能描述
定時(shí)/計(jì)數(shù)器相關(guān)引腳在表4.20中列出。
表4.20定時(shí)/計(jì)數(shù)器引腳描述軟件可以在引腳選擇寄存器中選擇多個(gè)引腳用作CAP或MAT功能,詳情請參見第3.2節(jié)相關(guān)內(nèi)容。當(dāng)有多個(gè)引腳用作匹配輸出時(shí),所有引腳狀態(tài)完全相同;當(dāng)有多個(gè)引腳用作捕獲輸入時(shí),只有序號最低的引腳有效。需要注意的是,在不使用器件引腳的情況下匹配功能也可以在內(nèi)部使用。4.2.5寄存器功能描述
表4.21列出了定時(shí)/計(jì)數(shù)器的所有寄存器。寄存器詳細(xì)功能描述在本節(jié)后面給出。
表4.21定時(shí)/計(jì)數(shù)器寄存器列表續(xù)表1.中斷寄存器(T[0/1/2/3]IR-0x40004000、0x40008000、0x40090000及0x40094000)
中斷寄存器中4個(gè)位用于匹配中斷,2個(gè)位用于捕獲中斷。如果有中斷產(chǎn)生,IR中的對應(yīng)位置1,否則為0。向?qū)?yīng)的IR位寫入1會(huì)復(fù)位中斷,寫入0無效。清除定時(shí)器匹配中斷也會(huì)清除對應(yīng)的DMA請求,中斷寄存器的位描述如表4.22所示。
表4.22中斷寄存器的位描述2.定時(shí)器控制寄存器(T[0/1/2/3]TCR-0x40004004、0x40008004、0x40090004及0x40094004)
定時(shí)器控制寄存器用于控制定時(shí)/計(jì)數(shù)器的操作,定時(shí)器控制寄存器的位描述如表4.23所示。
表4.23定時(shí)器控制寄存器的位描述3.計(jì)數(shù)控制寄存器(T[0/1/2/3]CTCR-0x40004070、0x40008070、0x40090070及0x40094070)
計(jì)數(shù)控制寄存器(CTCR)用來選擇定時(shí)器或計(jì)數(shù)器模式,計(jì)數(shù)器模式下可選擇計(jì)數(shù)的引腳和邊沿。計(jì)數(shù)控制寄存器的位描述如表4.24所示。
當(dāng)選擇工作在計(jì)數(shù)器模式時(shí),在每個(gè)PCLK時(shí)鐘的上升沿對CAP輸入(由CTCR位3:2選擇)進(jìn)行采樣。比較完CAP輸入的2次連續(xù)采樣結(jié)果后,可以識別下面四個(gè)事件中的一個(gè):上升沿、下降沿、任一邊沿或選擇的CAP輸入的電平無變化。只要識別到的事件與CTCR寄存器中位1:0選擇的事件相對應(yīng),定時(shí)器計(jì)數(shù)器寄存器加1。
計(jì)數(shù)器的外部時(shí)鐘源的操作受到一些限制。由于PCLK時(shí)鐘的2個(gè)連續(xù)的上升沿用來識別CAP選擇輸入的一個(gè)邊沿,所以CAP輸入的頻率不能大于1/2個(gè)PCLK時(shí)鐘。因此,這種情況下同一CAP輸入的高/低電平持續(xù)時(shí)間不能小于1/(2*PCLK)。
表4.24計(jì)數(shù)控制寄存器的位描述4.定時(shí)器計(jì)數(shù)器寄存器(T[0/1/2/3]TC-0x40004008、0x40008008、0x40090008及0x40094008)
當(dāng)預(yù)分頻計(jì)數(shù)器到達(dá)計(jì)數(shù)的上限時(shí),32位定時(shí)器計(jì)數(shù)器加1。如果TC在到達(dá)計(jì)數(shù)上限之前沒有被復(fù)位,它將一直計(jì)數(shù)到0xFFFFFFFF,然后翻轉(zhuǎn)到0x00000000。該事件不會(huì)產(chǎn)生中斷。如果需要,可用匹配寄存器檢測溢出。5.?預(yù)分頻寄存器(T[0/1/2/3]PR-0x4000400C、0x4000800C、0x4009000C及0x4009400C)
32位預(yù)分頻寄存器指定預(yù)分頻計(jì)數(shù)器的最大值。TC每經(jīng)過PR+1個(gè)PCLK加1。
6.預(yù)分頻計(jì)數(shù)器寄存器(T[0/1/2/3]PC-0x40004010、0x40008010、0x40090010及0x40094010)
預(yù)分頻計(jì)數(shù)器寄存器使用某個(gè)常量來控制PCLK的分頻。預(yù)分頻計(jì)數(shù)器每個(gè)PCLK周期加1,當(dāng)其到達(dá)預(yù)分頻寄存器PR中保存的值時(shí),定時(shí)器計(jì)數(shù)器TC加1,預(yù)分頻計(jì)數(shù)器PC在下個(gè)PCLK周期復(fù)位。這樣就使得當(dāng)PR=0時(shí),每個(gè)PCLK周期TC加1;當(dāng)PR=1時(shí),每兩個(gè)PCLK周期TC加1,依此類推。
7.匹配寄存器(MR0-MR3)
每個(gè)定時(shí)器有4個(gè)匹配寄存器,共16個(gè)。匹配寄存器值連續(xù)與定時(shí)器計(jì)數(shù)值相比較,當(dāng)兩個(gè)值相等時(shí)自動(dòng)觸發(fā)相應(yīng)動(dòng)作(產(chǎn)生中斷,復(fù)位定時(shí)器計(jì)數(shù)器或停止定時(shí)器)。具體執(zhí)行什么動(dòng)作由MCR寄存器控制。
8.匹配控制寄存器(T[0/1/2/3]MCR-0xE0004014、0xE0008014、0xE0070014及0xE0074014)
匹配控制寄存器用于控制在發(fā)生匹配時(shí)所執(zhí)行的操作。匹配控制寄存器的位描述如表4.25所示。
表4.25匹配控制寄存器的位描述9.捕獲寄存器(CR0-CR1)
每個(gè)定時(shí)器最少有個(gè)兩個(gè)捕獲寄存器。每個(gè)捕獲寄存器都與一個(gè)器件引腳相關(guān)聯(lián)。當(dāng)引腳發(fā)生特定的事件時(shí),可將定時(shí)器計(jì)數(shù)值裝入該寄存器。捕獲控制寄存器的設(shè)定決定捕獲功能是否使能以及捕獲事件在引腳的上升沿、下降沿或是雙邊沿發(fā)生。
10.捕獲控制寄存器(T[0/1/2/3]CCR-0x40004028、0x4E0008028、0x40090028及0x40094028)
當(dāng)發(fā)生捕獲事件時(shí),捕獲控制寄存器用于控制將定時(shí)器計(jì)數(shù)值是否裝入4個(gè)捕獲寄存器中的一個(gè)以及是否產(chǎn)生中斷。同時(shí)設(shè)置上升沿和下降沿也是有效的配置,這樣會(huì)在兩種沿觸發(fā)時(shí)均捕獲事件。捕獲控制寄存器的位描述如表4.26所示。其中,“n”代表定時(shí)器的編號0或1。
表4.26捕獲控制寄存器的位描述11.外部匹配寄存器(T[0/1/2/3]EMR-0x4000403C、0x4000803C、0x4009003C及0x4009403C)
外部匹配寄存器提供對外部匹配引腳的控制和查看外部匹配引腳的電平狀態(tài)。外部匹配寄存器的位描述如表4.27所示。其中,“n”代表定時(shí)器編號0、1、2或3;“m”代表匹配引腳編號0或1。
表4.27外部匹配寄存器的位描述續(xù)表每個(gè)定時(shí)器中的匹配0和1的匹配事件都可以引起一個(gè)DMA請求,詳情請參考第4.7.1節(jié)相關(guān)內(nèi)容。
外部匹配引腳輸出選擇如表4.28所示。
表4.28外部匹配引腳輸出選擇4.2.6應(yīng)用舉例
本例介紹采用查詢方式和中斷方式用定時(shí)器T0產(chǎn)生固定延時(shí),并控制LED燈規(guī)律閃爍。
1.定時(shí)器寄存器相關(guān)宏定義
為了方便用戶使用定時(shí)器相關(guān)寄存器,在頭文件中定義了定時(shí)器寄存器的結(jié)構(gòu)體類型以及4個(gè)定時(shí)器的結(jié)構(gòu)體指針宏。具體程序如代碼清單4.9所示。
【程序4.9】定時(shí)器寄存器相關(guān)宏定義。
typedefstruct //結(jié)構(gòu)體中寄存器的安排嚴(yán)格按照寄存器地址的先后順序
{
_IOuint32_tIR;
_IOuint32_tTCR;
_IOuint32_tTC;
_IOuint32_tPR;
_IOuint32_tPC;
_IOuint32_tMCR;
_IOuint32_tMR0;
_IOuint32_tMR1;
_IOuint32_tMR2;
_IOuint32_tMR3;
_IOuint32_tCCR;
_Iuint32_tCR0;
_Iuint32_tCR1;
uint32_tRESERVED0[2];
_IOuint32_tEMR;
uint32_tRESERVED1[12];
_IOuint32_tCTCR;
}LPC_TIM_TypeDef;
//APB1與APB2總線基地址宏定義
#defineLPC_APB0_BASE(0x40000000UL)
#defineLPC_APB1_BASE(0x40080000UL)
//定時(shí)器T0~T3基地址宏定義
#defineLPC_TIM0_BASE(LPC_APB0_BASE+0x04000)
#defineLPC_TIM1_BASE(LPC_APB0_BASE+0x08000)
#defineLPC_TIM2_BASE(LPC_APB1_BASE+0x10000)
#defineLPC_TIM3_BASE(LPC_APB1_BASE+0x14000)
//定時(shí)器T0~T3結(jié)構(gòu)體指針宏定義
#defineLPC_TIM0((LPC_TIM_TypeDef*)LPC_TIM0_BASE)
#defineLPC_TIM1((LPC_TIM_TypeDef*)LPC_TIM1_BASE)
#defineLPC_TIM2((LPC_TIM_TypeDef*)LPC_TIM2_BASE)
#defineLPC_TIM3((LPC_TIM_TypeDef*)LPC_TIM3_BASE)
2.查詢方式使用定時(shí)器
用查詢方式使用定時(shí)器可以提供非常準(zhǔn)確的延時(shí)時(shí)間,但在該方式中處理器被獨(dú)占,系統(tǒng)效率低,所以在實(shí)際應(yīng)用中不宜大量使用這種方式。函數(shù)delayMs使用定時(shí)器0或1產(chǎn)生毫秒級的延時(shí)。函數(shù)共有兩個(gè)參數(shù):timer_num為定時(shí)器序號;delayInMs為延時(shí)時(shí)間,單位為毫秒。由于定時(shí)器時(shí)鐘由Fpclk提供,當(dāng)預(yù)分頻寄存器PR設(shè)為0時(shí),計(jì)數(shù)Fpclk個(gè)時(shí)鐘周期為1秒,所以延時(shí)要以毫秒為基本單位就可以設(shè)置MR寄存器為Fpclk/1000的整數(shù)倍。對Fpclk的設(shè)置請參閱系統(tǒng)時(shí)鐘設(shè)置相關(guān)章節(jié)。具體代碼如程序清單4.10所示。
【程序4.10】定時(shí)器延時(shí)函數(shù)。
voiddelayMs(uint8_ttimer_num,uint32_tdelayInMs)
{
if(timer_num==0)
{
LPC_TIM0->TCR=0x02; //復(fù)位定時(shí)器T0
LPC_TIM0->PR=0x00; //設(shè)置預(yù)分頻為0
LPC_TIM0->MR0=delayInMs*(Fpclk/1000-1); //設(shè)置毫秒級的匹配值
LPC_TIM0->IR=0xff; //清全部中斷標(biāo)志
LPC_TIM0->MCR=0x04; //設(shè)置匹配時(shí)停止定時(shí)器
LPC_TIM0->TCR=0x01; //啟動(dòng)定時(shí)器
//處理器查詢T0匹配標(biāo)志位
while(LPC_TIM0->TCR&0x01);
}
elseif(timer_num==1)
{
…… //定時(shí)器T1相同操作
}
return;
}
3.中斷方式使用定時(shí)器
在實(shí)際應(yīng)用中,一般要求處理器間隔固定時(shí)間作相應(yīng)處理,如定時(shí)讀取外部數(shù)據(jù)或刷新數(shù)碼管顯示等,這時(shí)使用定時(shí)器中斷功能就非常有必要,并且在這種方式下定時(shí)器與處理器可以并行工作,等計(jì)數(shù)完成,定時(shí)器通過中斷通知處理器轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。這樣的使用方式可以提高系統(tǒng)的效率。程序首先要初始化使用的定時(shí)器,init_timer()函數(shù)執(zhí)行內(nèi)容包括設(shè)置定時(shí)器的匹配寄存器MRn和匹配控制寄存器MCRn,還有安裝定時(shí)器中斷服務(wù)函數(shù)等。該函數(shù)有兩個(gè)參數(shù):timer_num為初始化定時(shí)器序號,TimerInterval為Fpclk周期數(shù)也即定時(shí)器中斷間隔時(shí)間。具體代碼如程序4.11所示。
【程序4.11】定時(shí)器初始化函數(shù)。
uint32_tinit_timer(uint8_ttimer_num,uint32_tTimerInterval)
{
if(timer_num==0)
{
timer0_counter=0;
LPC_TIM0->MR0=TimerInterval; //設(shè)置匹配值
LPC_TIM0->MCR=3; //定時(shí)器T0匹配時(shí)產(chǎn)生中斷并復(fù)位TC
NVIC_EnableIRQ(TIMER0_IRQn); //使能定時(shí)器T0中斷
return(1);
}
elseif(timer_num==1)
{
……
}
return(0);
}隨后程序使能定時(shí)器。這時(shí)定時(shí)器開始計(jì)數(shù),直到TC與MR匹配產(chǎn)生中斷,同時(shí)復(fù)位TC開始新一輪計(jì)數(shù)。定時(shí)器使能函數(shù)的程序代碼如程序4.12所示,定時(shí)器服務(wù)函數(shù)的程序代碼如程序4.13所示。
【程序4.12】定時(shí)器使能函數(shù)。
voidenable_timer(uint8_ttimer_num)
{
if(timer_num==0)
{
LPC_TIM0->TCR=1; //計(jì)數(shù)器使能
}
else
{
LPC_TIM1->TCR=1;
}
return;
}
【程序4.13】定時(shí)器中斷服務(wù)函數(shù)。
voidTIMER0_IRQHandler(void)
{
LPC_TIM0->IR=1; //清定時(shí)器T0中斷標(biāo)志
timer0_counter++; //中斷服務(wù)
return;
}4.2.7重復(fù)中斷定時(shí)器(RIT)概述
LPC1700嵌入式處理器包含了一個(gè)32位重復(fù)中斷定時(shí)器(RIT),用于提供在規(guī)定時(shí)間間隔產(chǎn)生中斷的通用方法,而且不需要使用標(biāo)準(zhǔn)的定時(shí)器。RIT專門用于重復(fù)產(chǎn)生與操作系統(tǒng)中斷無關(guān)的中斷,但在系統(tǒng)有其它需要時(shí),它可用作Cortex-M3系統(tǒng)節(jié)拍定時(shí)器的備用定時(shí)器。4.2.8RIT寄存器描述
重復(fù)中斷定時(shí)器寄存器列表如表4.29所示。
表4.29重復(fù)中斷定時(shí)器寄存器列表1.比較寄存器(RICOMPVAL-0x400B0000)
比較寄存器的位描述如表4.30所示。
表4.30比較寄存器的位描述2.屏蔽寄存器(RIMASK-0x400B0004)
屏蔽寄存器的位描述如表4.31所示。
表4.31屏蔽寄存器的位描述3.控制寄存器(RICTRL-0x400B0008)
控制寄存器的位描述如表4.32所示。
表4.32控制寄存器的位描述4.計(jì)數(shù)器寄存器(RICOUNTER-0x400B000C)
計(jì)數(shù)器寄存器的位描述如表4.33所示。
表4.33計(jì)數(shù)器寄存器的位描述4.2.9RIT操作
處理器復(fù)位后,計(jì)數(shù)器從0開始遞增計(jì)數(shù)。只要計(jì)數(shù)值與RICOMPVAL的值相等,中斷標(biāo)志就被置位。通過向RIMASK中對應(yīng)的位寫入1可將其余的任意位或者幾個(gè)位(組合位)從本次比較中刪除。如果RITENCLR位為低(默認(rèn)狀態(tài)),比較值相等時(shí)只會(huì)設(shè)置中斷標(biāo)志,而不影響計(jì)數(shù)器值,計(jì)數(shù)器繼續(xù)運(yùn)行,當(dāng)計(jì)數(shù)值達(dá)到FFFFFFFFH時(shí),在下個(gè)時(shí)鐘沿將翻轉(zhuǎn)回0然后繼續(xù)計(jì)數(shù);如果RITENCLR位置位,比較值相等時(shí)還可以使計(jì)數(shù)器復(fù)位到0,則在下個(gè)時(shí)鐘沿計(jì)數(shù)重新開始。向RITEN位寫入0可以停止計(jì)數(shù)。當(dāng)硬件斷開時(shí)(BREAK引腳有效且置位RITENBR位),計(jì)數(shù)也會(huì)停止。位RITEN和RITENBR在復(fù)位后都會(huì)被置位。
向RITINT位寫入1可清除中斷標(biāo)志。軟件隨時(shí)可以通過寫RICOUNTER向計(jì)數(shù)器裝入任意值,還可以通過軟件隨時(shí)讀取RICOUNTER計(jì)數(shù)器、RICOMPVAL寄存器、RIMASK寄存器和RICTRL寄存器的值。
4.3.1功能描述
使用看門狗(WD,WatchDog)是在系統(tǒng)進(jìn)入錯(cuò)誤狀態(tài)后,為了防止程序異常導(dǎo)致系統(tǒng)崩潰,使系統(tǒng)能在一段合理時(shí)間內(nèi)復(fù)位系統(tǒng)??撮T狗使能后,如果用戶軟件在看門狗預(yù)設(shè)的時(shí)間內(nèi)沒有“喂狗”(或叫重裝)看門狗定時(shí)器,系統(tǒng)將被復(fù)位。4.3看門狗看門狗包括一個(gè)4分頻的預(yù)分頻器和一個(gè)32位計(jì)數(shù)器。時(shí)鐘通過預(yù)分頻器輸入定時(shí)器,定時(shí)器進(jìn)行遞減計(jì)數(shù)。定時(shí)器遞減的最小值為0xFF。如果設(shè)置一個(gè)小于0xFF的值,系統(tǒng)會(huì)將0xFF裝入計(jì)數(shù)器。因此看門狗最小間隔時(shí)間為WDCLK×256×4,最大間隔時(shí)間為WDCLK×232×4,兩者都是WDCLK×4的倍數(shù)。
看門狗應(yīng)按以下順序使用:①設(shè)置WDTC寄存器設(shè)定看門狗重裝常數(shù);②通過WDMOD寄存器設(shè)定工作模式;③通過向WDFEED寄存器先寫0xAA后寫0x55序列使能看門狗;④看門狗應(yīng)在計(jì)數(shù)器下溢出前重新裝入常數(shù),以避免復(fù)位或中斷發(fā)生。
當(dāng)看門狗計(jì)數(shù)器下溢后將重新從0x0開始計(jì)數(shù),這與外部復(fù)位時(shí)情況相同??撮T狗超時(shí)標(biāo)志位WDTOF可以用于檢測判斷看門狗是否引起了復(fù)位條件。WDTOF標(biāo)志必須使用軟件清除。
看門狗時(shí)鐘模塊使用兩個(gè)時(shí)鐘源:PCLK和WDCLK。PCLK被APB總線使用來訪問看門狗寄存器;WDCLK被看門狗定時(shí)器用作計(jì)數(shù)時(shí)鐘。
LPC1700處理器看門狗具有以下一些特性:
(1)如果沒有周期性重裝,則產(chǎn)生片內(nèi)復(fù)位;
(2)支持調(diào)試模式;
(3)由軟件使能,但要求禁止硬件復(fù)位或看門狗復(fù)位/中斷;
(4)錯(cuò)誤/不完整的喂狗時(shí)序會(huì)導(dǎo)致復(fù)位/中斷(如果使能);
(5)指示看門狗復(fù)位標(biāo)志;
(6)帶內(nèi)部預(yù)分頻器的可編程32位定時(shí)器;
(7)可選擇WDCLK×4倍數(shù)的時(shí)間周期:從WDCLK×256×4到WDCLK×232×4。
看門狗時(shí)鐘WDCLK可以選擇RTC時(shí)鐘、內(nèi)部RC晶振或APB總線設(shè)備時(shí)鐘PCLK。這樣系統(tǒng)可以根據(jù)不同省電環(huán)境的要求選擇看門狗使用的時(shí)鐘源。而且看門狗定時(shí)器在使用內(nèi)部時(shí)鐘源時(shí)不需要外部晶振,以提高系統(tǒng)的可靠性。4.3.2看門狗結(jié)構(gòu)
看門狗功能結(jié)構(gòu)框圖如圖4.2所示。
圖4.2看門狗邏輯框圖4.3.3寄存器功能描述
看門狗共有5個(gè)寄存器,具體如表4.34所示。
表4.34看門狗寄存器列表1.看門狗模式寄存器(WDMOD-0x40000000)
WDMOD寄存器各位的描述如表4.35所示。該寄存器可通過WDEN和WDRESET的組合來控制看門狗的操作。
表4.35看門狗模式寄存器各位的描述一旦WDEN和/或WDRESET位置位,就無法使用軟件將其清零。這兩個(gè)標(biāo)志由外部復(fù)位或看門狗定時(shí)器溢出清零。
當(dāng)看門狗發(fā)生超時(shí),看門狗超時(shí)標(biāo)志W(wǎng)DTOF置位時(shí),該標(biāo)志由軟件清零;中斷標(biāo)志W(wǎng)DINT置位時(shí),任何復(fù)位都會(huì)使該位清零。只要看門狗中斷被響應(yīng),它就可以在NVIC中禁止或不停地產(chǎn)生看門狗中斷請求??撮T狗中斷的用途就是在不進(jìn)行芯片復(fù)位的前提下允許在看門狗溢出時(shí)對其進(jìn)行調(diào)試。在看門狗運(yùn)行時(shí)根據(jù)不同時(shí)鐘源可隨時(shí)產(chǎn)生看門復(fù)位或中斷。RTC晶振時(shí)鐘與APB總線外設(shè)時(shí)鐘可以在處理器休眠模式中使用,IRC可以在處理器深度休眠模式中使用。如果在休眠或深度休眠模式中出現(xiàn)看門狗中斷,那么處理器被喚醒。看門狗操作模式的選擇如表4.36所示。
表4.36看門狗操作模式選擇
2.看門狗定時(shí)器常數(shù)寄存器(WDTC-0x40000004)
WDTC寄存器決定看門狗的超時(shí)值,各位描述如表4.37所示。當(dāng)“喂狗”時(shí)序產(chǎn)生時(shí),WDTC的內(nèi)容將重新裝入看門狗定時(shí)器,它是一個(gè)32位寄存器,低8位在復(fù)位時(shí)設(shè)置為1。寫入一個(gè)小于0xFF的值會(huì)使0xFF裝入WDTC,因此超時(shí)的最小時(shí)間間隔為WDCLK
×
256
×
4。
表4.37WDTC位描述3.看門狗喂狗寄存器(WDFEED-0x40000008)
WDFEED寄存器的各位描述如表4.38所示。向該寄存器寫入0xAA,然后寫入0x55會(huì)使WDTC的值重新裝入看門狗定時(shí)器。如果設(shè)置好了看門狗的溢出模式,該操作還將啟動(dòng)看門狗運(yùn)行。
置位WDMOD中的WDEN位之后,還必須完成一次有效的喂狗時(shí)序,然后看門狗才能產(chǎn)生復(fù)位。在看門狗真正啟動(dòng)之前,將忽略錯(cuò)誤的“喂狗”;在看門狗啟動(dòng)后,如果向WDFEED寄存器寫入0xAA之后的下一個(gè)操作不是向WDFEED寄存器寫入0x55,而是訪問任何一個(gè)看門狗寄存器,那么會(huì)立刻造成復(fù)位/中斷。在“喂狗”時(shí)序中,一次對看門狗寄存器不正確訪問之后的第二個(gè)PCLK周期將產(chǎn)生復(fù)位。
在“喂狗”時(shí)序過程中應(yīng)禁止中斷。如果在“喂狗”時(shí)序期間出現(xiàn)中斷,那么將會(huì)產(chǎn)生一個(gè)中止條件。
表4.38看門狗喂狗寄存器的位描述4.看門狗定時(shí)器值寄存器(WDTV-0x4000000C)
WDTV寄存器用于讀取看門狗定時(shí)器的當(dāng)前值,各位描述如表4.39所示。當(dāng)讀出該數(shù)值時(shí),鎖定和同步的過程需要6個(gè)WDCLK和6個(gè)PCLK周期,所以WDTV寄存器的真實(shí)值比CPU讀取出來的值要舊一些。
表4.39看門狗定時(shí)器值寄存器的位描述5.看門狗時(shí)鐘源選擇寄存器(WDCLKSEL-0x40000010)
該寄存器允許選擇看門狗定時(shí)器的時(shí)鐘源,各位描述如表4.40所示??赡艿倪x擇有內(nèi)部RC晶振(IRC)、RTC晶振和APB總線外設(shè)時(shí)鐘(PCLK)。
表4.40看門狗時(shí)鐘源選擇寄存器的位描述4.3.4操作舉例
看門狗的應(yīng)用較靈活,可以選擇看門狗超時(shí)僅產(chǎn)生中斷或產(chǎn)生系統(tǒng)復(fù)位中斷。當(dāng)系統(tǒng)只需看門狗產(chǎn)生中斷時(shí),設(shè)置WDEN位即可,一旦置位WDEN,則只有通過系統(tǒng)復(fù)位才能清零WDEN位。WDRESET位用于設(shè)置看門狗超時(shí)后復(fù)位定時(shí)器還是復(fù)位系統(tǒng)。WDRESET位一旦設(shè)置也需要系統(tǒng)復(fù)位后該位才能被復(fù)位。
1.看門狗初始化
程序4.14是一個(gè)使用看門狗產(chǎn)生普通中斷的例子。產(chǎn)生系統(tǒng)復(fù)位中斷只需再多設(shè)置WDRESET位即可。函數(shù)首先安裝看門狗中斷服務(wù)函數(shù),然后設(shè)置WDCLKSEL寄存器,選擇內(nèi)部RC晶振為時(shí)鐘源。由于內(nèi)部RC晶振頻率為4MHz,因此設(shè)置WDTC的值為4M-1。而看門狗時(shí)鐘電路把時(shí)鐘源4分頻,所以這樣看門狗超時(shí)時(shí)間設(shè)置為4s。接著再設(shè)置WDMOD寄存器的WDEN位。最后完成一個(gè)“喂狗”序列,使能看門狗定時(shí)器。
【程序4.14】看門狗初始化函數(shù)。
uint32_tWDTInit(void)
{
…
NVIC_EnableIRQ(WDT_IRQn); //使能看門狗中斷
LPC_WDT->WDCLKSEL=0; //選擇內(nèi)部RC晶振為時(shí)鐘源
LPC_WDT->WDTC=WDT_FEED_VALUE; //4秒后看門狗產(chǎn)生超時(shí)中斷
LPC_WDT->WDMOD=WDEN; //僅產(chǎn)生超時(shí)中斷
LPC_WDT->WDFEED=0xAA; //執(zhí)行“喂狗”序列,使能看門狗
LPC_WDT->WDFEED=0x55;
return(TRUE);
}
2.看門狗“喂狗”函數(shù)
只要嚴(yán)格按照“喂狗”序列設(shè)置WDFEED寄存器就可以重置看門狗計(jì)數(shù)器。具體代碼見程序4.15。
【程序4.15】看門狗“喂狗”函數(shù)。
voidWDTFeed(void)
{
LPC_WDT->WDFEED=0xAA; //“喂狗”序列
LPC_WDT->WDFEED=0x55;
return;
}
3.看門狗中斷服務(wù)函數(shù)
在進(jìn)入看門狗中斷服務(wù)函數(shù)后先要清除中斷標(biāo)志,然后才進(jìn)行相應(yīng)操作。具體代碼見程序4.16。
【程序4.16】看門狗中斷服務(wù)函數(shù)。
voidWDT_IRQHandler(void)
{
LPC_WDT->WDMOD&=~WDTOF; //清除看門狗中斷標(biāo)志
wdt_counter++;
return;
}
4.4.1概述
LPC1700嵌入式處理器具有4個(gè)符合C’550工業(yè)標(biāo)準(zhǔn)的通用異步串行口(UART):UART0、UART1、UART2和UART3。其中,UART0、UART2和UART3除了寄存器地址不同以外功能相同。而UART1除了具有其它三個(gè)普通串口的功能外還增加了一個(gè)MODEM接口與RS-485/EIA-485模式,且不支持紅外通信模式。本章主要介紹普通串口的功能及具體操作,有關(guān)UART1功能的描述請讀者參閱相關(guān)用戶手冊。4.4UART串口通信普通串口具有以下一些特性:
(1)每個(gè)串口具有獨(dú)立的16字節(jié)收發(fā)FIFO;
(2)寄存器位置符合C’550工業(yè)標(biāo)準(zhǔn);
(3)接收器FIFO觸發(fā)點(diǎn)可為1、4、8和14字節(jié);
(4)內(nèi)置波特率發(fā)生器;
(5)可用于精確控制波特率的小數(shù)分頻器,并擁有以實(shí)現(xiàn)軟件流控制的自動(dòng)波特率檢測能力和機(jī)制;
(6)支持DMA操作;
(7)
UART3包含了一個(gè)支持紅外通信的IrDA模式。4.4.2UART結(jié)構(gòu)
UART0、UART2和UART3的結(jié)構(gòu)如圖4.3所示。
圖4.3UART結(jié)構(gòu)框圖
APB接口提供CPU或主機(jī)與UART之間的通信連接。
UARTn接收器模塊UnRX監(jiān)視串行輸入線RXDn的有效輸入;UARTn接收移位寄存器(UxRSR)通過RXDn接收有效字符。當(dāng)UnRSR接收到一個(gè)有效字符時(shí),它將該字符傳送到UARTn接收緩沖寄存器FIFO中,等待CPU或主機(jī)通過主機(jī)接口訪問。
UARTn發(fā)送器模塊UnTX接收CPU或主機(jī)寫入的數(shù)據(jù)并將數(shù)據(jù)緩存到UARTn發(fā)送保持寄存器FIFO(UnTHR)中。UARTn發(fā)送移位寄存器(UnTSR)讀取UnTHR中的數(shù)據(jù)并將數(shù)據(jù)通過串行輸出引腳TXDn發(fā)送。
UARTn波特率發(fā)生器模塊UnBRG產(chǎn)生UARTn發(fā)送模塊所需的時(shí)序。UnBRG模塊時(shí)鐘源為APB時(shí)鐘(PCLK)。主時(shí)鐘與UnDLL和UnDLM寄存器所指定的分頻數(shù)相除得到UARTn發(fā)送模塊使用的時(shí)鐘,該時(shí)鐘為16倍過采樣時(shí)鐘NBAUDOUT。
中斷接口包含寄存器UnIER和UnIIR。中斷接口可接收幾個(gè)由UnTX和UnRX發(fā)出的單時(shí)鐘寬度的使能信號。
UnTX和UnRX的狀態(tài)信息保存在UnLSR中。UnTX和UnRX的控制信息保存在UnLCR中。4.4.3寄存器功能描述
每個(gè)UART包含的寄存器如表4.41所示。分頻器鎖存訪問位(DLAB)包含在UnLCR7中,用于使能訪問分頻鎖存寄存器DLLx與DLMx。
表4.41UART寄存器列表續(xù)表1.UART接收緩沖寄存器——UnRBR
UnRBR是UART接收FIFO的頂部字節(jié),各位的功能描述如表4.42所示。UnRBR包含了最早接收到的字符,可通過總線接口讀出。LSB(bit0)代表最早接收到的數(shù)據(jù)位。如果接收到的字符小于8位,則未使用的高位填充為0。
如果要訪問UnRBR,UnLCR的分頻鎖存訪問位(DLAB)必須為0。UnRBR為只讀寄存器。
由于PE、FE和BI位與RBR的FIFO頂端字節(jié)相對應(yīng)(即下次讀RBR時(shí)讀出的字節(jié)),因此,將接收的字節(jié)及其狀態(tài)位成對讀出的正確方法是先讀U0LSR,再讀U0RBR。
表4.42UART接收緩沖寄存器的位描述
2.UART發(fā)送保持寄存器——UnTHR
UnTHR是UART發(fā)送FIFO的頂部字節(jié),各位的功能描述如表4.43所示。UnTHR包含了發(fā)送FIFO中最新的字符,可通過總線接口寫入。LSB代表最先發(fā)送的位。
如果要訪問UnTHR,UnLCR的分頻鎖存訪問位(DLAB)必須為0。U0THR為只寫寄存器。
表4.43UART發(fā)送保持寄存器的位描述3.UART分頻鎖存低位寄存器與高位寄存器——UnDLL/UnDLM
分頻鎖存是波特率發(fā)生器的一部分,它保存了用于產(chǎn)生波特率時(shí)鐘的APB時(shí)鐘PCLK分頻值,波特率時(shí)鐘必須是波特率的16倍,等式如下:
UnDLL和UnDLM寄存器一起構(gòu)成一個(gè)16位除數(shù),UnDLL包含除數(shù)的低8位,UnDLM包含除數(shù)的高8位。值0x0000被看做0x0001,因?yàn)槌龜?shù)是不允許為0的。
當(dāng)訪問UART分頻鎖存寄存器時(shí),分頻鎖存訪問位(DLAB)必須為1。分頻鎖存寄存器各位的功能描述如表4.44及表4.45所示。
表4.44分頻鎖存低位寄存器的位描述表4.45分頻鎖存高位寄存器的位描述4.UART中斷使能寄存器——UnIER
UnIER用于使能5個(gè)UART中斷源,各位功能描述如表4.46所示。
表4.46中斷使能寄存器的位描述5.UART中斷標(biāo)志寄存器——UnIIR
UnIIR提供狀態(tài)代碼用于指示一個(gè)掛起中斷的中斷源和優(yōu)先級,各位功能描述如表4.47所示。在訪問UnIIR過程中,中斷被凍結(jié)。如果在訪問UnIIR時(shí)產(chǎn)生了新的中斷,該中斷被記錄,下次UnIIR訪問可讀出。
表4.47中斷標(biāo)志寄存器的位描述如果中斷狀態(tài)位是1,則沒有中斷掛起,并且中斷標(biāo)識位字段為0;如果中斷狀態(tài)位是0,并且在沒有自動(dòng)波特率中斷掛起的情況下,可以通過中斷標(biāo)識位字段判斷中斷源以及中斷服務(wù)程序應(yīng)該執(zhí)行的相應(yīng)操作。在退出中斷服務(wù)程序之前,必須讀取UnIIR來清除中斷。
UART的RLS中斷(UnIIR[3:1]=011)是最高優(yōu)先級的中斷。只要UART的接收輸入產(chǎn)生4個(gè)錯(cuò)誤條件(溢出錯(cuò)誤(OE)、奇偶錯(cuò)誤(PE)、幀錯(cuò)誤(FE)和間隔中斷(BI))中的任意一個(gè),該中斷標(biāo)志將置位。產(chǎn)生該中斷的錯(cuò)誤條件可通過查看UnLSR[4:1]得到,當(dāng)讀取UnLSR時(shí)清除中斷。
UART的RDA中斷(UnIIR[3:1]=010)與CTI中斷(UnIIR[3:1]=110)共用第二優(yōu)先級。當(dāng)UART的接收FIFO到達(dá)UnFCR[7:6]所定義的觸發(fā)點(diǎn)時(shí),RDA被激活;當(dāng)UART的接收FIFO的深度低于觸發(fā)點(diǎn)時(shí),RDA復(fù)位。當(dāng)RDA中斷激活時(shí),CPU可讀出由觸發(fā)點(diǎn)所定義的數(shù)據(jù)塊。
CTI中斷(UnIIR[3:1]=110)為第二優(yōu)先級中斷。當(dāng)UART接收的FIFO包含至少1個(gè)字符并且在接收3.5~4.5個(gè)字符的時(shí)間內(nèi)沒有發(fā)生UART接收FIFO動(dòng)作時(shí),該中斷產(chǎn)生。UART接收FIFO的任何動(dòng)作(讀或?qū)慤ARTRSR)都將清除該中斷。當(dāng)接收到的信息不是觸發(fā)值的倍數(shù)時(shí),CTI中斷將清空UART的RBR。例如,如果外設(shè)想要發(fā)送一個(gè)105個(gè)字符的信息,而觸發(fā)值為10個(gè)字符,那么前100個(gè)字符將使CPU接收10個(gè)RDA中斷,而剩下的5個(gè)字符使CPU接收1~5個(gè)CTI中斷(取決于服務(wù)程序)。UART的中斷處理如表4.48所示。
表4.48UART的中斷處理UART的THRE中斷(UnIIR[3:1]=001)為第三優(yōu)先級中斷。當(dāng)UART的THRFIFO為空并且滿足特定的初始化條件時(shí),該中斷激活。這些初始化條件將使UART的THRFIFO被數(shù)據(jù)填充,以免在系統(tǒng)啟動(dòng)時(shí)產(chǎn)生許多THRE中斷。當(dāng)THRE=1已經(jīng)有一個(gè)字符減去停止位的延時(shí),并在上一次THRE=1事件之后,UnTHR中存在至多2個(gè)字符時(shí),該初始化條件成立。在沒有譯碼和服務(wù)THRE中斷時(shí),該延遲為CPU提供了將數(shù)據(jù)寫入U(xiǎn)nTHR的時(shí)間。如果UART的THRFIFO中曾經(jīng)有兩個(gè)或更多字符,而當(dāng)前UnTHR為空時(shí),THRE中斷立即設(shè)置。當(dāng)發(fā)生UnTHR寫操作或UnIIR讀操作并且THRE為最高優(yōu)先級中斷(UnIIR[3:1]=001)時(shí),THRE中斷復(fù)位。
6.UARTFIFO控制寄存器——UnFCR
UnFCR為只寫寄存器,控制UART接收和發(fā)送FIFO的操作,各位的功能描述如表4.49所示。
表4.49UARTFIFO控制寄存器的位描述通過使用DMA,用戶可選擇操作UART的發(fā)送和/或接收。DMA模式由FCR寄存器中的DMA模式選擇位決定。只有在FCR寄存器中的FIFO使能位置位時(shí),該位才會(huì)有用。
1)
UART接收DMA
在DMA模式中,當(dāng)接收FIFO有效字節(jié)數(shù)大于或等于觸發(fā)點(diǎn)水平,或者在發(fā)生字符超時(shí)的情況下,接收DMA請求就會(huì)生效(詳情請參考上文對RX觸發(fā)點(diǎn)的描述)。接收DMA請求由DMA控制器清除。
2)
UART發(fā)送DMA
在DMA模式中,當(dāng)發(fā)送FIFO變?yōu)槲礉M時(shí),發(fā)送DMA請求就會(huì)生效。發(fā)送DMA請求由DMA控制器清除。
7.UART線控制寄存器——UnLCR
UnLCR決定發(fā)送和接收數(shù)據(jù)字符的格式,各位的功能描述如表4.50所示。
8.UART線狀態(tài)寄存器——UnLSR
UnLSR為只讀寄存器,提供了UART發(fā)送和接收模塊的狀態(tài)信息,UART線狀態(tài)寄存器的位描述如表4.51所示。
表4.50UART線控制寄存器的位描述表4.51UART線狀態(tài)寄存器的位描述續(xù)表9.UART發(fā)送使能寄存器——UnTER
UnTER寄存器可以實(shí)現(xiàn)軟件流控制。當(dāng)TxEn=1時(shí),只要數(shù)據(jù)可用,UARTn發(fā)送器就會(huì)一直發(fā)送數(shù)據(jù),一旦TxEn變?yōu)?,UARTn就會(huì)停止數(shù)據(jù)傳輸。
UnTER還可實(shí)現(xiàn)軟件和硬件流控制。當(dāng)TxEn=1時(shí),只要數(shù)據(jù)可用,UARTn發(fā)送器就會(huì)一直發(fā)送數(shù)據(jù),一旦TxEn變?yōu)?,UARTn就會(huì)停止數(shù)據(jù)傳輸。表4.52描述了如何利用TxEn位來實(shí)現(xiàn)軟件流控制。
表4.52UART發(fā)送使能寄存器的位描述10.UARTFIFO水平寄存器——UnFIFOLVL
UnFIFOLVL寄存器是一個(gè)只讀寄存器,允許軟件讀取當(dāng)前的FIFO水平狀態(tài)。發(fā)送和接收FIFO的數(shù)據(jù)量(水平)均存放在該寄存器中,各位的功能描述如表4.53所示。
表4.53UARTFIFO水平寄存器的位描述4.4.4基本操作
LPC1700處理器的UART0、UART2和UART3具有完全相同的寄存器,只是基地址不同,UART的基本寄存器功能框圖如圖4.4所示。
圖4.4UART寄存器功能框圖其中,寄存器UnRBR與UnTHR是同一地址,但物理上是分開的,讀操作時(shí)為UnRBR,寫操作時(shí)為UnTHR。寄存器UnDLL與UnRBR、UnTHR,UnDLM與UnIER具有相同的地址。如果要訪問UnDLM、UnDLL,分頻器鎖存訪問位DLAB必須為1;若要訪問UnRBR、UnTHR、UnIER,則分頻器鎖存訪問位DLAB必須為0。UnDLM和UnDLL寄存器是波特率發(fā)生器的分頻器鎖存寄存器,用于設(shè)置合適的串口波特率;UnRBR為數(shù)據(jù)接收緩沖器,用于讀取接收到的數(shù)據(jù),若FIFO使能,串口接收到的數(shù)據(jù)會(huì)壓入FIFO緩沖;UnTHR為發(fā)送保持寄存器,向此寄存器寫入數(shù)據(jù)時(shí),將會(huì)引起串口數(shù)據(jù)發(fā)送,若FIFO使能,數(shù)據(jù)將會(huì)壓入FIFO緩沖。
如前所述,波特率的除數(shù)計(jì)算如下:
UnDLM、UnDLL=
通過線控制寄存器LCR可設(shè)置串口的工作模式,F(xiàn)CR則用于FIFO的使能或者復(fù)位操作。當(dāng)接收或者發(fā)送數(shù)據(jù)的時(shí)候,會(huì)產(chǎn)生相應(yīng)的線狀態(tài)標(biāo)志位(LSR),通過對IER進(jìn)行設(shè)置,可實(shí)現(xiàn)串口的發(fā)送、接收、出錯(cuò)等中斷。注意,IER中的位0為接收中斷使能,位1為發(fā)送中斷使能,位2為線狀態(tài)中斷使能(通信出錯(cuò)中斷使能),若不使能相應(yīng)的中斷,對應(yīng)的中斷不會(huì)產(chǎn)生,此時(shí)可以通過LSR讀取串口的狀態(tài),以判斷串口操作是否完成或是否成功。UART模式寄存器的功能框圖如圖
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度文化產(chǎn)業(yè)發(fā)展基金擔(dān)保合同范本3篇
- 個(gè)人融資借款利息合同樣本版B版
- 專用實(shí)驗(yàn)儀器采購合同范本2024版B版
- 高等職業(yè)學(xué)校辦學(xué)條件重點(diǎn)監(jiān)測指標(biāo)
- 2025年海南鮮品品牌IP授權(quán)與開發(fā)合同3篇
- 2024年適用最高限額擔(dān)保合同范本一
- 福建省南平市松溪縣鄭墩中學(xué)2020-2021學(xué)年高二數(shù)學(xué)理月考試題含解析
- 2024年瀝青物資采購協(xié)議樣本版
- 2024年項(xiàng)目借調(diào)人員合同集
- 2024年物業(yè)服務(wù)管理合同標(biāo)的說明
- 飛行原理(第二版) 課件 第4章 飛機(jī)的平衡、穩(wěn)定性和操縱性
- 2024年10月自考04532財(cái)務(wù)會(huì)計(jì)專題試題及答案含解析
- 醫(yī)院行政人員禮儀培訓(xùn)
- 暨南大學(xué)珠海校區(qū)財(cái)務(wù)辦招考財(cái)務(wù)工作人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 羊水少治療護(hù)理查房
- DB21-T 3874-2023 海水魚工廠化循環(huán)水養(yǎng)殖池設(shè)計(jì)規(guī)范
- DB43T 523-2010 蕹菜栽培技術(shù)規(guī)程
- 2024年全國統(tǒng)一高考英語試卷(新課標(biāo)Ⅰ卷)含答案
- OQC培訓(xùn)資料教學(xué)課件
- 2024年8月CCAA國家注冊審核員OHSMS職業(yè)健康安全管理體系基礎(chǔ)知識考試題目含解析
- 防溺水課件教學(xué)課件
評論
0/150
提交評論