TQ2440开发板学习纪实--- 基于中断的UART串口接收

Posted smstong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TQ2440开发板学习纪实--- 基于中断的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开发板学习纪实--- 基于中断的UART串口接收的主要内容,如果未能解决你的问题,请参考以下文章

TQ2440开发板学习纪实--- 启用IRQ中断,告别低效的轮询!

TQ2440开发板学习纪实--- 设置堆栈并调用C函数

TQ2440开发板学习纪实--- 利用Undefined异常模拟BLX指令

TQ2440开发板学习纪实--- 设置时钟频率,让CPU运行的更快

TQ2440开发板学习纪实(10)--- 实现多任务处理,最简单OS模型

TQ2440开发板学习纪实--- 设置UART串口,输出Hello World!