完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前节回顾
上节主要介绍了按键控制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的乐园---rn"; HAL_UART_Transmit_IT(&huart1,buffer,sizeof(buffer)); 配置回调函数 ———————————————— 版权声明:本文为CSDN博主「梅山剑客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_46152793/article/details/117249979 配置回调函数 在 stm32f4xx__it.c中可以找到串口1的中断函数, 右击go to Definition 追溯到这个函数的根源,因为使能了串口中断,所以要找到接受完成的回调函数,并且在主函数中对它进行重写,这是一个虚函数,如果不进行重写,默认执行这个带有__weak的虚函数。 我们在回调函数中插入如下代码 uint8_t buffer[] = "---欢迎来到STM32F407的乐园---rn"; uint8_t str1[] = "系统开始,LED灯点亮rn"; uint8_t str2[] = "系统宕机,LED灯熄灭rn"; 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灯亮灭。成功实现了一种在线控制操作,用软件能控制硬件,能实现下位机与上位机可以互相发送信息。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:20 , Processed in 0.792008 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号