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

前言

软件版本

  • 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

在这里插入图片描述
并按老样子配置时钟

2.2 设置SYS

在这里插入图片描述

2.3 设置USART

Mode选择异步通信(Asynchronous)
波特率为115200,1位停止位,无校验位
在这里插入图片描述

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

在这里插入图片描述

2.4 创建项目

配置与以前相同

在这里插入图片描述

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

在这里插入图片描述

4 实验效果

  1. 当发送1后可以看到不断输出“hello windows”
    在这里插入图片描述

  2. 当输入0后端口停止输出
    在这里插入图片描述

在这里插入图片描述

总结

串口通信的实现方式有多种,轮询、中断以及使用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

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日常脱发的小迈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值