天气: 舒适
心情: 平静
LPCarm的"手动激活"串口发送中断问题雁塔菜农 发表于 2006-12-20 23:53:00
hotpower 发表于 2006-12-20 23:42 |
11楼: 最后折算为指针与数组,51与ARM的关系 |
问题一: 指针与数组最大的不同是数组有"家",而指针是路边的"野花".
当uint8 fifo_STR[]="FIFO_TEST" ;后 一般用FIFO_STR[i]=0x..;用数组名访问数组. 也可用*(FIFO_STR+i)=0x..;用"固定指针"访问数组. 但都离不开"家"---FIFO_STR. 正如00所说,FIFO_STR是数组名,它不能移动"家"!!! 即不能FIFO_STR++. 只能用FIFO_STR[i]或*(FIFO_STR+i)在"家"附近忽悠.
如想要分家,必须先建个小家---申请指针变量. 即00所说的---uint8 * pFIFO_STR=FIFO_STR;
这样就可用U0THR = *pFIFO_STR ++; 胡作非为了~~~
不过分家后一定要小心指针带来的后患...
指针与数组的关系很微妙,在某些场合他们的很多方面确实是一样的, 也可从编译后的代码看出.
可能在某些场合数组的效率甚至超过了指针,这要看编译器了.
问题二: 首先: U0THR = 'F'; //"上善若水"提示说要先发送一字符再使能中断,随便送个字 U0IER |= 0x02; //使能THRE发送中断
大家知道51的TI可以强制置'1'而"手动激活"发送中断. 而ARM等却不能,因为这是考虑"安全"的举动,但也对FIFO的发送带来了负面影响.
即要激活发送中断必须要向U0THR写入才能实现!!!
实际也可仿效51的方法来实现"手动激活"发送中断,我认为这样才更能体现FIFO的作用. 因为在实际应用中,发送首字节很罗嗦~~~
再者FIFO的最大好处是"闭着眼睛黑发"---爽~~~
//"手动激活"发送中断 if (!Uart.TxBusy) {//发送FIFO不忙并且以换行符为界 VIC->SoftInt = (1 << VICIntSel_UART0);//软件中断模拟激活UART0中断 }
extern "C" void IRQ_UART0 (void) __irq { static unsigned char cData = 0; unsigned char ch; Status = U0->IIR & 0x0f; switch (Status) { case 0x06://接收线状态 switch (U0->LSR) { case 0x63: break; } break; case 0x04://接收数据可用 case 0x0c://字符超时指示 while((U0->LSR & 0x01) == 1) { ch = U0->RBR; if (ch == '$') { cData = '$'; RxBuffer[RxCount ++] = ch; } else if(cData == '$'){ if (ch >= 0x20) { RxBuffer[RxCount ++] = ch; } else if (ch == 0x0d) { RxBuffer[RxCount ++] = ch; } else if (ch == 0x0a) { if (RxBuffer[RxCount] == 0x0d) { cData = 0; RxBuffer[RxCount ++] = ch; //isr_evt_set (DefBeep_1, Beep_Task); isr_evt_set (1, Uart_Task); } } } } break; case 0x01://LPCARM保留中断,可用于软件模拟激活UART0中断 if (!(VIC->SoftInt & (1 << VICIntSel_UART0))) {//硬件UART0中断 break;//正常的UART0中断退出 } case 0x02://THRE中断 TxBusy = TxCount != TxdCount;//保证FIFO发送全部结束时,缓冲区空不拒绝发送 for (int i = 0; (i < 16) && (TxCount != TxdCount); i ++) {//1次写入FIFO最多16个字节 ch = TxBuffer[(TxdCount ++) & 0x3ff];//取出缓冲区1个字节数据 if (ch >= 0x0a) {//防止非法字符漏入 U0->THR = ch;//将缓冲区1个字节数据写入FIFO } } break; // case 0x0f://保留中断 // break; } VIC->SoftIntClr = (1 << VICIntSel_UART0); VIC->VectAddr = 0x00; }
| |