ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
74406
smartleds (22.11.2006 00:07, просмотров: 642)
Вопрос по UART0 у LPC2138 Принимаю данные по UART0 на скорости 250к, при приходе байта возникает прерывание , где я смотрю не битый ли фрейм пришел (проверяю флажок FE)и записываю принятый байт в переменную curbyte Вот пример конфигурациии прерывания U0IER = 0x00; // disable all interrupts PINSEL0_bit.P0_1 = 1;// RXD0 input U0LCR_bit.DLAB = 1; //enable DLAB U0LCR_bit.WLS = 3; //8 bit U0LCR_bit.SBS = 0; //1 stop bit U0LCR_bit.PE = 0; //no parity divisor=3; // 250k, frequence VPB 12 MHz U0DLM = divisor/256; //highbyte U0DLL = divisor%256 ; //lowbyte U0LCR_bit.DLAB = 0; //disable DLAB U0FCR=0xC1; // 14 characters FIFO and enable the FIFO's U0IER_bit.RDAIE =1 ; Interrupt enable Вот сам обработчик прерывания void UART0Interrupt(void) { intoccursuart=1; if(U0LSR_bit.FE > 0) //Yes--> framing error {//2 fe_flag=1; badbyte=U0RBR; }//2 else {//2 curbyte=U0RBR; }//2 } 1).Все работает нормально, но если я делаю буфер FIFO меньше чем 14 байт все перестает работать U0FCR=0xC1; // 14 characters FIFO and enable the FIFO's 2). Если я переношу обработку полученного байта в основную программу, а в прерывании устанавливаю только флаг intoccursuart=1; то все перестает работать. Хотя какая казалось бы разница где считывать регистр U0RBR в прерывании или в основной программе. т.е. программа выглядит так: main() ....... while { if (intoccursuart==1) {//1 intoccursuart=0; if(U0LSR_bit.FE > 0) //Yes--> framing error {//2 fe_flag=1; badbyte=U0RBR; }//2 else {//2 curbyte=U0RBR; // U0FCR_bit.RFR = 1; //RESET FIFO }//2 }//1 } в прерывании устанавливается только флажок intoccursuart=1; Эта программа раньше работала на mega16 никаких проблем не было мега все успевала обрабатывать.