本帖最后由 yangjiaxu 于 2022-9-28 23:03 编辑
#申请原创#
大家好,我是豆包,上一帖主要讲了开发板的RTC外设部分的使用,本期我们来熟悉一下imxRT1021的串口通信功能。串口通信,相信大家都比较了解,它以通信速率快,全双工通信,因此,深受工程师们的喜爱。 串口根据通信方式可分为LPUART,USART和UART; LPUART全称之为Low PowerUniversal Asynchronous Receiver Transmitter的缩写,即低功耗异步收发器,它可以灵活地与外部设备进行全双工数据交换。 USART全称之为Universal synchronousasynchronous receiver transmitter,是通用同步异步接收器发送器; UART全称之为UniversalAsynchronous Receiver/Transmitter,被称为通用异步收发传输器,其是在USART基础上裁剪掉了同步通信功能,只支持异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们正常使用的大多数是采用的异步通信,因其不需要时钟同步,而且波特率可设置,因此应用十分广泛。 本次实验采用的是imxRT1021的串口1-LPUART,主要使用其实现简单的串口收发功能。接下来就需要程序编写了。 首先配置一下中断优先级分组,该操作主要是配置MCU的优先级分配。 /**
* [url=home.php?mod=space&uid=247401]@brief[/url] 设置中断优先级分组
* @param PriorityGroup:中断优先级分组
* @retval 无
*/
void Set_NVIC_PriorityGroup(PriorityGroup_Type PriorityGroup)
{
NVIC_SetPriorityGrouping((uint32_t)PriorityGroup); //设置中断优先级分组
}
接下来是对串口IO的初始化: /**
* [url=home.php?mod=space&uid=247401]@brief[/url] 初始化uart,并开启了收发功能
* @param 无
* @retval 无
*/
void UART_Config(void)
{
UART_IOMUXC_MUX_Config();//配置IO
UART_IOMUXC_PAD_Config();//配置IO的复用功能
UART_ModeConfig();//串口初始化参数配置
}
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] 初始化uart配置参数
* @param 无
* @retval 无
*/
void UART_ModeConfig(void)
{
/*定义串口配置参数结构体变量,用于保存串口的配置信息*/
lpuart_config_t config;
/*调用固件库函数得到默认的串口配置参数,在默认的配置参数基础上修改*/
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = DEBUG_UART_BAUDRATE; //波特率
config.enableRx = DEBUG_UART_ENABLE_RESIVE; //是否允许接收数据
config.enableTx = DEBUG_UART_ENABLE_SEND; //是否允许发送数据
/*调用固件库函数,将修改好的配置信息写入到串口的配置寄存器中*/
LPUART_Init(DEBUG_UARTx, &config, BOARD_DEBUG_UART_CLK_FREQ);
/*允许接收中断*/
LPUART_EnableInterrupts(DEBUG_UARTx, kLPUART_RxDataRegFullInterruptEnable);
/*设置中断优先级,*/
set_IRQn_Priority(DEBUG_UART_IRQ, Group4_PreemptPriority_6, Group4_SubPriority_0);
/*使能中断*/
EnableIRQ(DEBUG_UART_IRQ);
//LPUART_EnableRx(DEBUG_USARTx, true);
//LPUART_EnableTx(DEBUG_USARTx, false);
}
配置完成之后就可以使用串口功能了,可以使用Uart_SendString实现串口数据的发送,使用中断服务函数实现串口的接收。 /******************串口接收中断服务函数********************/
void DEBUG_UART_IRQHandler(void)
{
uint8_t ucTemp;
/*串口接收到数据*/
if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEBUG_UARTx))
{
/*读取数据*/
ucTemp = LPUART_ReadByte(DEBUG_UARTx);
/*将读取到的数据发送出去*/
Uart_SendByte(DEBUG_UARTx, ucTemp);
}
}
至此,串口收发实验的程序代码基本就完成了,接下来可以使用编译器,将编译好的程序代码下载到imxRT1021的硬件之中。 如图所示。
通过图示可以看到,串口波特率采用115200,同时可以正常的收发数据,也就是说,程序可以将imxRT1021的串口1驱动起来了。正常来说,如果有通信协议的话,可以在中断服务或者是将数据都收完成,然后进行数据处理,从而实现一个串口通信的项目。我这个仅仅是串口通信的冰川一角,其实通信还有DMA,不定长接收和环形队列等等,这些都是项目中会常用到的,但我在这次的程序中没有体现,可想而知,接下来工程师的路还很长,其实生活亦是如此,借用一句“离骚”中的一句名言:“路漫漫其修远兮,吾将上下而求索”,加油 ~_~
|