由于正点原子的UART串口通信裸机例程,采用的是查询方式来进行串口通信,并未使用中断,导致CPU利用率较低,于是产生做本实验的动力。
查阅资料
通过《IMX6ULL参考手册》,得知其串口中断有
从55.4.5 Receiver中可以看出,当一个新的字符读就绪的时候,RDR=USR2[0]置1,且当DREN=UCR4[0]=1时,产生中断,据此修改正点原子裸机例程13代码。
代码修改
修改uart_init()函数如下:
void uart_init(void)
{/* 1、初始化串口IO */uart_io_init();/* 2、初始化UART1 */uart_disable(UART1); /* 先关闭UART1 */uart_softreset(UART1); /* 软件复位UART1 */UART1->UCR1 = 0; /* 先清除UCR1寄存器 *//** 设置UART的UCR1寄存器,关闭自动波特率* bit14: 0 关闭自动波特率检测,我们自己设置波特率*/UART1->UCR1 &= ~(1<<14);/** 设置UART的UCR2寄存器,设置内容包括字长,停止位,校验模式,关闭RTS硬件流控* bit14: 1 忽略RTS引脚* bit8: 0 关闭奇偶校验* bit6: 0 1位停止位* bit5: 1 8位数据位* bit2: 1 打开发送* bit1: 1 打开接收*/UART1->UCR2 |= (1<<14) | (1<<5) | (1<<2) | (1<<1);/** UART1的UCR3寄存器* bit2: 1 必须设置为1!参考IMX6ULL参考手册3624页*/UART1->UCR3 |= 1<<2; /***************************add********************************//** UART1的UCR4寄存器* bit0 设置为1,使能RDR interrupt*/UART1->UCR4 |= 1<<0;/** 中断服务函数*/GIC_EnableIRQ(UART1_IRQn); /* 使能GIC中对应的中断 */system_register_irqhandler(UART1_IRQn, (system_irq_handler_t)uart1_irqhandler, NULL); /* 注册中断服务函数 *//***************************add end********************************/ /** 设置波特率* 波特率计算公式:Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1)) * 如果要设置波特率为115200,那么可以使用如下参数:* Ref Freq = 80M 也就是寄存器UFCR的bit9:7=101, 表示1分频* UBMR = 3124* UBIR = 71* 因此波特率= 80000000/(16 * (3124+1)/(71+1))=80000000/(16 * 3125/72) = (80000000*72) / (16*3125) = 115200*/UART1->UFCR = 5<<7; //ref freq等于ipg_clk/1=80MhzUART1->UBIR = 71;UART1->UBMR = 3124;#if 0uart_setbaudrate(UART1, 115200, 80000000); /* 设置波特率 */
#endif/* 使能串口 */uart_enable(UART1);
}
添加如下代码
void uart1_irqhandler(void)
{ unsigned char data = 0;static int state=0;if ((UART1->USR2 & 0X1) == 1){UART1->USR2 &= ~(1<<0);data = UART1->URXD;putc(data);state = !state;led_switch(LED0,state);}
}
添加头文件
#include "bsp_int.h"
#include "bsp_led.h"
注释main()里面的while(1)内容
实验效果
参考链接: link https://zhuanlan.zhihu.com/p/405971390