STM32系列之HAL库开发
STM32系列文章目录
前言
本文主要记录STM32—HAL库开发笔记,以及一些本人在开发过程中遇到的问题。
一、HAL库之串口收发
在本章节主要介绍USART的串口收发方式
1.配置STM32CUBEID

配置:USART的波特率为115200,其余参数默认

在自动生成的工程文件中,在工程文件夹下找到Core/Src下,找到usart.c文件。添加如下代码。
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
提示:需要加在/* USER CODE BEGIN */和/* USER CODE END */之间,否则重新生成工程时候,代码会消失。
需要在使用串口打印数据的地方,直接调用printf函数即可。
2.使用串口中断收发
2.1 配置串口中断

使能串口中断,并设置抢占式优先级和子优先级。
2.2 HAL库中断处理逻辑

下面来逐步实现上述功能
- 调用HAL_UART_Receive_IT()来实现开启中断,设置接受缓存区,以及要接受的字节数量,需要在加在main函数中的,while之前

HAL_UART_Receive_IT(&huart1, &USART1_NewData, 1);//开启接收中断,设置缓冲区,以及设置多少个字节后进入中断
- 写中断回调函数HAL_UART_RxCpltCallback()函数
在HAL库中,可以找到HAL_UART_RxCpltCallback()的定义如下所示
/**
* @brief Rx Transfer completed callbacks.
* @param huart Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval None
*/
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
_weak是弱函数的意思,在MDK ARM链接时优先链接定义为非weak的函数或变量,如果找不到则再链接_weak函数。故此自定义HAL_UART_RxCpltCallback()函数如下。
uint8_t USART1_BUFF[USART_MAX_LEN];//接受缓冲区
uint16_t USART1_RX_STA=0;//接受状态标记
uint8_t USART1_NewData;//串口收到的1字节数据缓存
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
printf("%c",USART1_NewData);
//HAL_UART_Transmit(&huart1,(uint8_t *)USART1_NewData,1,100);
if((USART1_RX_STA&0x00)==0)
{
if(USART1_RX_STA&0x4000)
{
if(USART1_NewData!=0x0a)
{
USART1_RX_STA=0;//重新开始接受
}
else
{
USART1_RX_STA|=0x8000;
}
}
else
{
USART1_BUFF[USART1_RX_STA&0x3FFF]=USART1_NewData;
USART1_RX_STA++;
if(USART1_RX_STA>(USART_MAX_LEN-1))
{
USART1_RX_STA=0;
}
}
}
}
HAL_UART_Receive_IT(&huart1, &USART1_NewData, 1);//由于是收到一个字节就进中断一次,在出中断回调函数之前需要重新打开串口接受中断。
}
按照上述配置之后,便可以使用printf打印信息,以及使用串口接收中断回显上位机发来的信息。
3 测试结果


浙公网安备 33010602011771号