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就会根据接收速度闪烁。