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

猜你喜欢

转载自blog.csdn.net/smstong/article/details/53894665