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开发板学习纪实--- 利用Undefined异常模拟BLX指令
TQ2440开发板学习纪实--- 设置时钟频率,让CPU运行的更快