在嵌入式环境中,串口通信是必不可少的通信方式,这一章我们主要是讲解一下HAL库怎么应用串口外设做收发功能。
一、准备工作
1、使用我们第一章配置好工程文件。如图
2、明确原理图上面所需要的串口,这里我们用串口1做实验。
二、具体操作
1、Pinout菜单栏下,串口的选择与配置。配置如图
外设选择USART1,Mode选择Asynchronous(异步通信)。这样右边会显示配置的两个串口脚PA、PA10。
2、在Configuration菜单栏下,点击connectivity下的USART1弹出配置界面,配置如图
1)首先在Parameter Settings 下配置 Baud Rate(波特率)我们这里设置115200(可根据自己需要而定)。
2)在NVIC Setting界面我们要把串口全局中断使能,Enable选项打钩。
3、生成工程
点击Project菜单栏选择Generate code,工程生成完毕。
好了现在基本的串口配置已经完成了,但是光光这里配置是不够的在工程代码里面还需要添加一些函数才能使用。
4、打开工程,工程里面配置
由于HAL库里面串口配置比较繁琐,串口在接收的时候只能一个字节一个字节的接收,而且接受完成一次就需要重新使能接收中断,这里是比较麻烦的。我提供了以下解决办法,这里需要修改两处代码。
1)串口初始化.C里面添加
这里是在串口1初始化的情况下加了接受中断使能和打开接受中断。
代码如下:
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
USART1->CR1 |= ((uint16_t)0x2000);//USART Enable
}
2、串口中断函数里面修改
这里串口接受中断本来是调用HAL库自己的回调函数,这里十分浪费时间。所以修改成我们经常使用的方式。
代码如下:
void USART1_IRQHandler(void)
{
unsigned char temp;
if(__HAL_UART_GET_IT_SOURCE(&huart1,UART_IT_RXNE) != RESET)
{
temp = READ_REG(huart1.Instance->DR);
HAL_UART_Transmit(&huart1,&temp, 1, 100);
}
HAL_UART_IRQHandler(&huart1);
}
HAL_UART_Transmit(&huart1,&temp, 1, 100); 这里我是把接收到的数据返回发送了出去。如果需要其他处理则是在这里调
用解析回调函数。
这里就实现了串口中断方式的接收功能。
发送功能可直接调用HAL库函数 HAL_UART_Transmit(&huart1,arr, 10, 100);
这里huart1代表选用的串口这里是USART1;arr代表传入的数据首地址;10代表的要发出的数据个数10个字节;100代表超时时
间100ms;
如有什么不懂联系加QQ群:1063618791欢迎大家学习交流!