在51中我们常用TI来认为地"手动触发"发送中断,使程序未等发送结束就会进入 串口的发送中断. 即TI = 1;//"手动触发"发送中断
这种"手动触发"发送中断机制的最大好处是发送中断处理程序与发送命令程序分离.互不干扰,发送命令程序也不需要知道发送是如何进行或实现的.
在LPCARM中,俺模拟51实现了类似功能: VIC->SoftInt = (1 << VICIntSel_UART0);//软件中断模拟激活UART0中断
在AVR上实际也能实现如此功能,如下图所述. UCSRB |= (1 << UDRIE);//"手动触发"发送中断(发送数据寄存器空中断)
在中断中处理如下: #pragma vector="USART"_UDRE_vect extern "C" __interrupt void UartTxUDREISR(void) { if (Uart.SendWritePtr != Uart.SendReadPtr) { UDR = Uart.SendBuffer[Uart.SendReadPtr ++]; UCSRB |= (1 << UDRIE); } else { UCSRB &= ~(1 << UDRIE); } }
#pragma vector="USART"_TXC_vect extern "C" __interrupt void UartTxISR(void) { if (Uart.SendWritePtr != Uart.SendReadPtr) { UDR = Uart.SendBuffer[Uart.SendReadPtr ++]; UCSRB |= (1 << UDRIE); } }
总结: 这种"手动触发"的好处可以不必在发送处要在发送缓冲区内取出首字节 来发送出去,这样我们就没必要知道缓冲区的读写指针的位置和大小等.
签名:
●█〓██▄▄▄▄▄▄ ●●●●●●→ ''''╭WWWW╮ ▄▅██████▅▄▃▂ 灌水入坛传播非典 ( ●_●) ██████████████ '''',,,;,;,;'''/▇\'' ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ 东戳西顶一片天/MMMM\
| 点击遨游水上蔬菜批发市场
打造菜农最倒塌的BLOG |
|
|
文章评论(0条评论)
登录后参与讨论