STM32 HAl库中断方式进行串口通信

文章目录

  • 前言
  • 1 串口中断方式特点
  • 2 通过STM32CubeMx配置项目
    • 2.1 设置RCC
    • 2.2 设置SYS
    • 2.3 设置USART
    • 2.4 创建项目
  • 3 Keil配置代码
    • 3.1 修改main函数
    • 3.2 编译并烧录
  • 4 实验效果
  • 总结

前言

软件版本

  • STM32CubeMX 6.4 0
  • Keil 531

硬件

  • STM32F103C8T6

1 串口中断方式特点

  • 发送数据时,将一字节数据放入数据寄存器DR;接收数据时,将DR内容存放在用户存储区
  • 中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据
  • 在传输数据量较大,且通信波特率较高(大于38400)时,如果采用中断方式,每收发一个字节的数据,CPU都会被打断,造成CPU无法处理其他事务。因此在批量数据传输,通信波特率较高时,建议采用DMA方式。

2 通过STM32CubeMx配置项目

不懂的步骤可以看我另一篇博客:https://blog.csdn.net/apple_52030329/article/details/127232960

2.1 设置RCC

STM32 HAl库中断方式进行串口通信_第1张图片
并按老样子配置时钟

2.2 设置SYS

STM32 HAl库中断方式进行串口通信_第2张图片

2.3 设置USART

Mode选择异步通信(Asynchronous)
波特率为115200,1位停止位,无校验位
STM32 HAl库中断方式进行串口通信_第3张图片

选择嵌套向量中断控制器(NVIC),配置使能中断

STM32 HAl库中断方式进行串口通信_第4张图片

2.4 创建项目

配置与以前相同

STM32 HAl库中断方式进行串口通信_第5张图片

3 Keil配置代码

打开刚才通过CubeMX生成的项目

3.1 修改main函数

  1. 定义全局变量
    为方便调用,在main函数前定义全局变量
char c;//指令 0:停止  1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start\n";//提示2
char tips2[]="Stop\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
  1. 在main函数中设置接收中断

函数原型

 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

函数功能
功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

参数说明
UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
  1. whlie中添加传输代码
if(flag==1){
			//发送信息
			HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
			
			//延时
			HAL_Delay(1000);
		}
  1. 在main函数下面重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	//当输入的指令为0时,发送提示并改变flag
	if(c=='0'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}
	
	//当输入的指令为1时,发送提示并改变flag
	else if(c=='1'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}
	
	//当输入不存在指令时,发送提示并改变flag
	else {
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); 
	}

	//重新设置中断
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}

3.2 编译并烧录

烧录工具选择 mcuisp

STM32 HAl库中断方式进行串口通信_第6张图片

4 实验效果

  1. 当发送1后可以看到不断输出“hello windows”
    STM32 HAl库中断方式进行串口通信_第7张图片

  2. 当输入0后端口停止输出
    STM32 HAl库中断方式进行串口通信_第8张图片

总结

串口通信的实现方式有多种,轮询、中断以及使用DMA处理等,本文简单实现了中断方式。


参考
https://blog.csdn.net/qq_41799583/article/details/83749371
https://blog.csdn.net/qq_47281915/article/details/121053903
https://blog.csdn.net/isyuuun/article/details/121074067

你可能感兴趣的:(stm32,单片机)