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库中断处理逻辑

在这里插入图片描述
下面来逐步实现上述功能

  1. 调用HAL_UART_Receive_IT()来实现开启中断,设置接受缓存区,以及要接受的字节数量,需要在加在main函数中的,while之前
    在这里插入图片描述
HAL_UART_Receive_IT(&huart1, &USART1_NewData, 1);//开启接收中断,设置缓冲区,以及设置多少个字节后进入中断
  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 测试结果

在这里插入图片描述

posted @ 2022-04-04 13:52  满月居于空717  阅读(74)  评论(0)    收藏  举报  来源