本文主要是介绍TQ2440开发板学习纪实(7)--- 基于中断的UART串口接收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
UART0的发送、接收、错误分别产生不同的中断,可以分别控制。本文仅对UART0的接收采用中断方式,发送仍然采用轮训方式。这样有个很大的用处,那就是程序陷入死循环是,可以通过UART0发送给ARM一个信号,来终止程序的运行。
关键代码片段:
1 取消相关中断屏蔽位
/* unmask interrupt for UART0 */rINTMSK &= ~(1<<28);rINTSUBMSK &= ~(1<<0);
2 IRQ处理函数里增加28号中断
void c_irq_handler(unsigned int cpsr)
{puts("irq\n");int offset = rINTOFFSET; /* the ID of current IRQ *//* handle */switch (offset) {case 0:key_on_press(4);break;case 1:key_on_press(1);break;case 2:key_on_press(3);break;case 3:break;case 4:key_on_press(2);break;case 28: /* UART0 */uart_on_irq();break;default:on_unkown_irq();break;}
3 在uart_on_irq函数里处理中断
/* be called automatically when recv a byte */
static void uart_on_recv_byte(int byte)
{static int flag = 0;flag ? led_on(4) : led_off(4);flag = !flag;
}/* IRQ handler */
void uart_on_irq()
{if(rSUBSRCPND & 1) { /* recv */int byte = rURXH0;uart_on_recv_byte(byte);rSUBSRCPND |= 1;}if(rSUBSRCPND & (1<<1)){ /* send */rSUBSRCPND |= 1<<1;}if(rSUBSRCPND & (1<<2)) { /* err */rSUBSRCPND |= 1<<2;}rSRCPND |= 1<<28;rINTPND |= 1<<28;
}
其效果是,收到一个字节收改变LED1的亮灭。这样当连续收到数据时,LED1就会根据接收速度闪烁。
这篇关于TQ2440开发板学习纪实(7)--- 基于中断的UART串口接收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!