前节回顾
上节主要介绍了按键控制LED灯的实现,这节在上一小节的基础上,学习如何通过STM32CubMx配置的USART与上位机通信。
主要内容介绍
做单片机最重要的一部分就是实现通信功能,具体内容可参考串口详解部分内容。这里主要讲述工程实现。串口通信方式分为两大类,第一类为同步通信方式(如IIC,SPI通信方式)第二类为异步通信方式(如本节介绍到的USART),两者之间的本质区别是同步通信需要时钟,而异步通信不需要时钟。这里用USART完成本次实验。
工程配置
按照惯例,首先打开STM32CubMx进行工程配置操作,在目录中的Connectivity选择USART1,使能异步通信方式,上文讲述了USART为第二种通信方式,没有用到时钟,所以我们还需要配置通信的基本特性:如波特率、字长、奇偶校验位、停止位等,这里我们选择默认设置。
因为实验中用到了串口中断,所以也需要使能串口1的中断。
系统设置与原理图对照
我们打开正点原子F4参考原理图,也可以看到串口通信引脚配置在PA9,PA10与CubMx引脚配置一致。
配置完毕后,生成文件。
系统代码编写
使能接收中断函数
在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灯亮灭。成功实现了一种在线控制操作,用软件能控制硬件,能实现下位机与上位机可以互相发送信息。