欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32L051使用HAL库操作实例(4)-串口实验

程序员文章站 2022-06-30 13:33:11
...

一、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)
思路:使用中断控制方式,当串口接收到数据时,再将接收到的数据发送出去
1.MCU选型
本例程使用的为STM32L051C8T6型号
2.使能时钟
STM32L051使用HAL库操作实例(4)-串口实验
3.设置GPIO口(本例使用的为串口1,板载自带USB转串口芯片)
STM32L051使用HAL库操作实例(4)-串口实验
STM32L051使用HAL库操作实例(4)-串口实验
4.串口配置
①模式配置
STM32L051使用HAL库操作实例(4)-串口实验

②串口参数配置

STM32L051使用HAL库操作实例(4)-串口实验
③因为程序使用的是中断处理,所以还需要打开NVIC Settings页面,使能中断
STM32L051使用HAL库操作实例(4)-串口实验
④串口引脚配置
STM32L051使用HAL库操作实例(4)-串口实验
5.配置STM32CubeMX生成工程文件
STM32L051使用HAL库操作实例(4)-串口实验
STM32L051使用HAL库操作实例(4)-串口实验
6.点击GENERATE CODE生成工程文件

二、KEIL程序
1.串口相关函数说明:

  • 串口发送/接收函数

                    HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制

                    HAL_UART_Receive();串口轮询模式接收,使用超时管理机制

                    HAL_UART_Transmit_IT();串口中断模式发送

                    HAL_UART_Receive_IT();串口中断模式接收

                    HAL_UART_Transmit_DMA();串口DMA模式发送

                    HAL_UART_Transmit_DMA();串口DMA模式接收

  • 串口中断函数
                    HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用

                    HAL_UART_TxCpltCallback();数据完全发送完成后调用

                    HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用

                    HAL_UART_RxCpltCallback();数据完全接受完成后调用

                    HAL_UART_ErrorCallback();传输出现错误时调用

2.程序编写

1.在main.c文件中定义2个数组,用于发送及存放数据内容;

/* USER CODE BEGIN Includes */
uint8_t aTxBuffer[]="\r\n*********串口发送数据*********\r\n";
uint8_t aRxBuffer[1];		// 用来接收串口1发送的数据
/* USER CODE END Includes */

2.由于要使用printf,所以需要重定义,USART.C文件中;

#include "stdio.h"   //这个一定不能忘

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
    USART1->TDR = (uint8_t) ch;      
	return ch;
}
#endif 

3.重新编写串口接收回调函数


void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{
	if(huart->Instance == USART1)	// 判断是由哪个串口触发的中断
	{
		HAL_UART_Transmit(&huart1,aRxBuffer,1,100);	// 接收到数据马上使用串口1发送出去
		HAL_UART_Receive_IT(&huart1,aRxBuffer,1);		// 重新使能串口1接收中断
	}
}

4.main.c函数添加如下;

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit_IT(&huart1 ,aTxBuffer,sizeof(aTxBuffer)); //sizeof()可读取目标数组长度
	HAL_UART_Receive_IT(&huart1,aRxBuffer,1);
	printf("\r\nSTM32L051C8T6 开发板串口实验\r\n");
	printf("\r\n请输入数据\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);  //LED1
		HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

2.编译文件,下载。即可实现串口收发状态(开发板串口拨码开关不要忘了打开(* ̄︶ ̄))

STM32L051使用HAL库操作实例(4)-串口实验

相关标签: STM32 STM32L0