STM32CubMX自学笔记(三)---串口通信

前节回顾

上节主要介绍了按键控制LED灯的实现,这节在上一小节的基础上,学习如何通过STM32CubMx配置的USART与上位机通信。

主要内容介绍

做单片机最重要的一部分就是实现通信功能,具体内容可参考串口详解部分内容。这里主要讲述工程实现。串口通信方式分为两大类,第一类为同步通信方式(如IIC,SPI通信方式)第二类为异步通信方式(如本节介绍到的USART),两者之间的本质区别是同步通信需要时钟,而异步通信不需要时钟。这里用USART完成本次实验。

工程配置

按照惯例,首先打开STM32CubMx进行工程配置操作,在目录中的Connectivity选择USART1,使能异步通信方式,上文讲述了USART为第二种通信方式,没有用到时钟,所以我们还需要配置通信的基本特性:如波特率、字长、奇偶校验位、停止位等,这里我们选择默认设置。
Alt因为实验中用到了串口中断,所以也需要使能串口1的中断。
在这里插入图片描述

系统设置与原理图对照

我们打开正点原子F4参考原理图,也可以看到串口通信引脚配置在PA9,PA10与CubMx引脚配置一致。
Alt
在这里插入图片描述
配置完毕后,生成文件。

系统代码编写

使能接收中断函数

hal_uart.h中找到HAL_UART_Receive_IT函数并且在 main.c函数的while(1)中添加串口中断启动函数 ,启动串口接收中断,使得单片机能一直接收到发送的数据。

/* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,&Buffer,1);
	//Buffer是在main函数中定义的,1表示传入数据的字节大小
  /* USER CODE END 2 */

main.c中添加如下函数,实现串口的标题显示,传入的buffer为之定义

uint8_t buffer[] = "---欢迎来到STM32F407的乐园---\r\n";
HAL_UART_Transmit_IT(&huart1,buffer,sizeof(buffer));

配置回调函数

stm32f4xx__it.c中可以找到串口1的中断函数,
在这里插入图片描述
右击go to Definition 追溯到这个函数的根源,因为使能了串口中断,所以要找到接受完成的回调函数,并且在主函数中对它进行重写,这是一个虚函数,如果不进行重写,默认执行这个带有__weak的虚函数。
在这里插入图片描述我们在回调函数中插入如下代码

uint8_t buffer[] = "---欢迎来到STM32F407的乐园---\r\n";
uint8_t str1[] = "系统开始,LED灯点亮\r\n";
uint8_t str2[] = "系统宕机,LED灯熄灭\r\n";
uint8_t Rx_dat = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口回调函数
{
	if(huart->Instance == USART1)//判断实例是否是串口1触发的
									//如果仅仅使用了一个串口也可以不需要判断
	{
		if(Rx_dat == 0x01)//接收到的数据是否为1
		{
			HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
			//给LED灯写入一个低电平,点亮LED灯
			HAL_UART_Transmit_IT(&huart1,str1,sizeof(str1));
			//将字符串1发送到上位机
			//第一个参数为串口1的地址,第二个参数为发送的字符串,第三个参数为传送的字符串大小
		}
		else if(Rx_dat == 0x02)//接收到的数据是否为2
		{
			HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
			//给LED灯写入一个高电平,熄灭LED灯
			HAL_UART_Transmit_IT(&huart1,str2,sizeof(str2));
			//将字符串2发送到上位机,第一个参数为串口1的地址
			//第二个参数为发送的字符串,第三个参数为传送的字符串大小
		}
	}
}
HAL_UART_Receive_IT(&huart1,&Rx_dat,1); 

另一种方式

也可以不使用中断方式来实现所发送和接收的功能,这种方式称之为查询。
HAL_UART_Transmit_IT(&huart1,str1,sizeof(str1));替换成如下代码

// 参数1是串口1的地址,参数2是传入的字符。参数3是传入的字符大小,参数4是超时时间,超出这个时间就不传送了
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);

下载验证

把配置好的工程下载到开发板上,打开串口调试助手,复位单片机。起初看到的现象是欢迎字样。
在这里插入图片描述在发送窗口输入“1”时,向上位机发送信息,并且打印在界面上,另外,LED灯点亮。
在这里插入图片描述
在这里插入图片描述在发送窗口输入“2”时,向上位机发送信息,并且打印在界面上,另外,LED灯熄灭。
在这里插入图片描述
符合实验预期现象,实验完毕。

结语

本次例程主要讲述了串口通信的实际操作,通过上位机发送数据给单片机,单片机也可以发送信息给上位机,不需要对人工对硬件进行操作,就能实现LED灯亮灭。成功实现了一种在线控制操作,用软件能控制硬件,能实现下位机与上位机可以互相发送信息。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值