|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
串口問題,請大家?guī)蛶兔!實在沒招了。 |
| 作者:ketp 欄目:ARM技術(shù) |
芯片:LPC2119 TPN0441A 用串口調(diào)試助手往UARTO發(fā)數(shù)據(jù),自動發(fā)送周期>=60ms正常,發(fā)送周期<=50ms就會產(chǎn)生DataAbrot,產(chǎn)生的原因是OSMemGet()內(nèi) (pblk = pmem->OSMemFreeList;)處pblk的高低16位互換了。 程序: //內(nèi)存區(qū) static uint8 UartMemBuf[10][30]; static OS_MEM *UartMem; static void *UartQBuf[10]; static OS_EVENT *UartQ; //============================================================================================== //Function NAME : void UartInit(uint32 bps) //DESCRIPTION : 初始化 //Parameter : void //Return VALUE : void //============================================================================================== static void UartInit(uint32 bps) { uint16 Fdiv; uint8 err; extern void Uart0_Handler(void); UartQ = OSQCreate(UartQBuf, 10); //創(chuàng)建消息隊列 UartMem = OSMemCreate(UartMemBuf, 10, 30, &err); PINSEL0 |= (1<<(2 * UART0_TXD_PIN)) | (1<<(2 * UART0_RXD_PIN)); VICVectAddr14 = (uint32)Uart0_Handler; VICVectCntl14 = (1<<5) | 6; VICIntEnable = 1<<6; U0LCR = 0x80; //允許訪問分頻因子寄存器 Fdiv = (Fpclk / 16) / bps; //設(shè)置波特率 U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; //禁止訪問分頻因子寄存器,8位數(shù)據(jù)位,1位停止位 U0FCR = 0xC7; //初始化FIFO,觸發(fā)點14個字節(jié) U0IER = 0x01; //使能中斷 } //============================================================================================== //Function NAME : void SendByte(uint8 byte) //DESCRIPTION : 發(fā)送一個字節(jié) //Parameter : //Return VALUE : //============================================================================================== static void SendByte(uint8 byte) { uint8 TEMP; while(1) { TEMP = U0LSR; if(TEMP & (1<<5)) //發(fā)送保持寄存器為空 { break; } OSTimeDly(2); } U0THR = byte; } //============================================================================================== //Function NAME : void SendByte(uint8 byte) //DESCRIPTION : 接收一個字節(jié) //Parameter : //Return VALUE : //============================================================================================== static uint8 GetByte(uint16 timeout, uint8 *err) { static uint8 len = 0; static uint8 i = 1; static uint8 *buf = 0; while(1) { if(i > len) { uint8 err1; if(buf != (uint8*)0) if((buf >= (uint8*)(&(UartMemBuf[0]))) && (buf <= (uint8*)(&(UartMemBuf[10])))) { if(OSMemPut(UartMem, buf) != OS_NO_ERR)while(1); } buf = (uint8*)OSQPend(UartQ, timeout, &err1); if(err1 == OS_NO_ERR) { len = buf[0]; i = 1; continue; } buf = (uint8*)0; *err = 0; return 0; } else { *err = 1; return(buf[i++]); } } } //============================================================================================== //Function NAME : void Post(void) //DESCRIPTION : 中斷調(diào)用,將FIFO的數(shù)據(jù)發(fā)到UartQ隊列中 //Parameter : //Return |
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |