|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
改動(dòng)《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11? |
| 作者:上善若水 欄目:ARM技術(shù) |
改動(dòng)《深入淺出ARM7—LPC213X/214X(上)》第163頁的程序4.11,我想使FIFO的觸發(fā)點(diǎn)設(shè)置為4個(gè)字節(jié),其它與原程序相同,我只修改了紅色的部分。完整程序如下: #include "config.h" /* 定義串口模式設(shè)置數(shù)據(jù)結(jié)構(gòu) */ typedef struct UartMode { uint8 datab; // 字長度,5/6/7/8可選 uint8 stopb; // 停止位,1/2可選 uint8 parity; // 奇偶校驗(yàn)位,0-無校驗(yàn),1-奇校驗(yàn),2-偶校驗(yàn) }UARTMODE; uint8 rcv_buf[4]; // UART0數(shù)據(jù)接收緩沖區(qū) volatile uint8 rcv_new; // 接收新數(shù)據(jù)標(biāo)志 *********************************************************************** 函數(shù)名稱 :IRQ_UART0() 函數(shù)功能 :串口0接收中斷服務(wù)程序 *********************************************************************** void __irq IRQ_UART0 (void) { uint8 i; if ((U0IIR & 0x0F) == 0x04) rcv_new = 1; // 設(shè)置接收到新的數(shù)據(jù)標(biāo)志 for (i=0; i<4; i++) { rcv_buf[i] = U0RBR; // 讀取FIFO的數(shù)據(jù),并清除中斷 } VICVectAddr = 0x00; // 中斷處理結(jié)束 } ************************************************************************** ** 函數(shù)名稱 :UART0_SendByte() ** 函數(shù)功能 :向串口0發(fā)送1字節(jié)數(shù)據(jù) ** 入口參數(shù) :dat 要發(fā)送的數(shù)據(jù) ** 出口參數(shù) :無 ***********************************************************************void UART0_SendByte (uint8 dat) { U0THR = dat; // 要發(fā)送的數(shù)據(jù) } ************************************************************************* 函數(shù)名稱 :UART0_SendBuf() ** 函數(shù)功能 :向串口發(fā)送8字節(jié)數(shù)據(jù) ** 入口參數(shù) :dat 要發(fā)送的數(shù)據(jù) ** 出口參數(shù) :無 *********************************************************************** void UART0_SendBuf (void) { uint8 i; for (i=0; i<4; i++) UART0_SendByte(rcv_buf[i]); while ((U0LSR & 0x20) == 0); // 等待數(shù)據(jù)發(fā)送完畢 } ************************************************************************** ** 函數(shù)名稱 :UART0_Init() ** 函數(shù)功能 :串口初始化,設(shè)置工作模式和波特率。 *********************************************************************** int8 UART0_Init (uint32 baud, UARTMODE set) { 略 } ************************************************************************* 函數(shù)名稱 :main() *********************************************************************** int main (void) { UARTMODE set; set.datab = 8; set.stopb = 1; set.parity = 0; rcv_new = 0; PINSEL0 = 0x00000005; // 設(shè)置I/O連接到UART0 UART0_Init(115200, set); // 串口初始化 U0FCR = 0x41; // 使能FIFO,并設(shè)置觸發(fā)點(diǎn)為8字節(jié) U0IER = 0x01; // 允許RBR中斷,即接收中斷 IRQEnable(); // 使能IRQ中斷 /* 使能UART0中斷 */ VICIntSelect = 0x00000000; // 設(shè)置所有的通道為IRQ中斷 VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高優(yōu)先級 VICVectAddr0 = (uint32)IRQ_UART0; // 設(shè)置UART0向量地址 VICIntEnable = 1 << 0x06; // 使能UART0中斷 while (1) { if (rcv_new == 1) { rcv_new =0; UART0_SendBuf(); } } return 0; } 我只是修改了U0FCR = 0x41;還有取FIFO和發(fā)送子程序中的計(jì)數(shù)i=4,為什么運(yùn)行的結(jié)果是無論發(fā)多少數(shù),都一次性全收到,然后有幾個(gè)不可打印字符跟在后面,接著再發(fā)數(shù),就沒有任何響應(yīng)了? * - 本貼最后修改時(shí)間:2005-12-23 21:10:00 修改者:上善若水 |
| 2樓: | >>參與討論 |
| 作者: zlgarm 于 2005/12/24 9:46:00 發(fā)布:
re 按照你的修改,我試了試 ,程序運(yùn)行正常. 1.首先你要注意串口有三種方式的中斷,設(shè)置U0IER = 0x01時(shí),CTI和RDA都可以導(dǎo)致進(jìn)入中斷服務(wù)程序. 2.對于RDA中斷,你設(shè)置的是4字節(jié)觸發(fā),那么當(dāng)只有當(dāng)串口FIFO中連續(xù)接收到四個(gè)字節(jié)或其整數(shù)倍的情況下才可以產(chǎn)生RDA中斷,即在以上程序中rcv_new標(biāo)志才能置1,這樣程序才調(diào)用串口發(fā)送程序UART0_SendBuf(),這樣上位機(jī)的串口軟件才能收到相應(yīng)的數(shù)據(jù)。(建議用上位機(jī)用字符串發(fā)送方式向串口發(fā)送數(shù)據(jù),以保證接收FIFO數(shù)據(jù)增加到觸發(fā)點(diǎn)) 3.如果你發(fā)送小于觸發(fā)點(diǎn)的字符串,那么是不會觸發(fā)RDA中斷,即不會產(chǎn)生RDA中斷標(biāo)志,這樣rcv_new標(biāo)志就不會置1。所以就不會向串口上位機(jī)軟件發(fā)送數(shù)據(jù)了。 請你注意書上的相關(guān)介紹。 |
|
| 3樓: | >>參與討論 |
| 作者: 上善若水 于 2005/12/27 10:28:00 發(fā)布:
再問陳老師 我把這個(gè)程序又調(diào)試了兩遍,一次用jtag下載,一次用isp下載,運(yùn)行的結(jié)果都是送數(shù)后毫無反應(yīng)。我嘗試了多款串口調(diào)試軟件,都是以字符串格式發(fā)送數(shù)據(jù)。請問陳老師,還有哪里會出現(xiàn)致命的問題? |
|
| 4樓: | >>參與討論 |
| 作者: zgpswh 于 2005/12/27 11:07:00 發(fā)布:
我試過這樣的程序 用4個(gè)字節(jié)作觸發(fā)點(diǎn),程序是沒有問題的,關(guān)鍵是當(dāng)你發(fā)三個(gè)字節(jié)或不是4的整數(shù)倍字節(jié)時(shí)會沒有反應(yīng),下次無論你發(fā)什么數(shù)據(jù),都不會觸發(fā)引起中斷了,你只有重起程序。這會不會是一個(gè)BUG呢? |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |