完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
本文说明
功能要求
STM32CubeMX+Keil+Proteus相关的安装、使用、配置等基础操作不再赘述,有关内容的详细介绍如下 串行接口相关知识点
阻塞式发送函数(要等待数据发完才能做其他任务) HAL_UART_Transmit() 非阻塞式发送函数 HAL_UART_Transmit_IT() 看函数名,多了个_IT, 即在阻塞式发送的基础上可以中断(Interrupt) 串口发送完毕中断回调函数 void HAL_UART_TxCpltCallback() 举例说明串口发送函数的作用 假如我们使用非阻塞式的串口发送函数,将发送数组dat_Txd中的前5个数据发送到 HAL_UART_Transmit_IT(&huart1,dat_Txd,5); void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) //判断发送数据的串口 { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); } } 如果是使用阻塞式发送函数,则代码变为如下内容 HAL_UART_Transmit(&huart1,dat_Txd,5,10000); //超时等待10000ms HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); HAL库中串口接收的重要函数 阻塞式接收函数(要等待数据接收完才能做其他任务,所以不推荐) HAL_UART_Transmit() 非阻塞式接收函数(推荐使用) HAL_UART_Transmit_IT() 串口发送完毕中断回调函数 void HAL_UART_RxCpltCallback() 举例说明串口接收函数的作用 假如使用非阻塞式的串口发送函数,接收USART1中的一个字节,将其保存在dat_Rxd,在发送完数据后,若该字节位0x5A,则翻转PB9引脚的输出电平 HAL_UART_Transmit_IT(&huart1,dat_Rxd,1); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) //判断发送数据的串口 { if(dat_Rxd == 0x5A) HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); } } STM32CubeMX配置USART Mode选择Asynchronous(异步的) Baud Rate(波特率)选择9600Bits/s 然后使能一下NVIC,勾选USART1 interrupt Enabled即可 其他的配置内容不再赘述,详情可查看本文开头写的本文说明一章 然后生成代码即可 Keil编写代码逻辑 首先定义一些变量 #define LED1_ON HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET); #define LED1_OFF HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET); #define LED2_ON HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET); #define LED2_OFF HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET); uint8_t Tx_str1[]= "Welcome!rn"; uint8_t Tx_str2[]= "LED1 ON!rn"; uint8_t Tx_str3[]= "LED1 OFF!rn"; uint8_t Tx_str4[]= "Command Not Found!rn"; uint8_t Rx_dat = 0; //接收字符变量 然后在主函数内实现开机发送Welcome /* USER CODE BEGIN 2 */ LED2_ON; //发送指示灯LED2亮 HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),1000); //阻塞式发送函数 LED2_OFF; //发送结束时,指示灯LED2灭 /* USER CODE END 2 */ 发送函数执行结束后,要等待串口发来的字符 这里将HAL_UART_Receive_IT()函数写在循环体内 时时刻刻等待串口发来的字符 while (1) { /* USER CODE END WHILE */ HAL_UART_Receive_IT(&huart1,&Rx_dat,3); //等待接收字符 /* USER CODE BEGIN 3 */ } 而每当HAL_UART_Receive_IT()函数执行之后,则进入中断,进入回调函数HAL_UART_RxCpltCallback() 因此我们需要编辑我们的回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { switch(Rx_dat) { case 0x4f: LED1_ON; LED2_ON; //发送指示灯LED2亮 HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),1000); //阻塞式发送函数 LED2_OFF; //发送结束时,指示灯LED2灭 break; case 0x43: LED1_OFF; LED2_ON; //发送指示灯LED2亮 HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),1000); //阻塞式发送函数 LED2_OFF; //发送结束时,指示灯LED2灭 break; default: LED2_ON; //发送指示灯LED2亮 HAL_UART_Transmit(&huart1,Tx_str4,sizeof(Tx_str4),1000); //阻塞式发送函数 LED2_OFF; //发送结束时,指示灯LED2灭 break; } } } 简单解释一下程序,进行回调函数,根据接收的字符执行对应的操作 执行完相关操作,跳出switch case继续等待接收串口发来的字符 编译运行生成hex文件,准备仿真 Proteus仿真 原理图如下 第一次仿真串口,查了查,需要在元件库里找名为COMPIM的元件 COMPIM是Proteus中一个极其有用的虚拟元件,COMPIM可以建立起一种映射,把仿真电路中的数字量映射到计算机的物理端口 找到这个元件,拖进原理图,编辑一些属性,如图 其中Physical Port(物理端口)就是我们要在计算机中建立的映射物理端口 波特率都设置成9600 除了虚拟串口,我们还需要一个虚拟终端来查看发送的数据信息 点击左侧长得像电流表的图标,找到VIRTUAL TERMIN(虚拟终端),放进原理图 第一次见比较陌生,介绍一下这个虚拟终端 这个虚拟终端有四个引脚,分别是 RXD 一 数据接收引脚 TXD 一 数据发送引脚 RTS 一 请求发送信号 CTS 一 清除传送,是对RTS的响应信号 左键这个虚拟终端,出现了一堆参数,如图 Baud Rate 一 传输波特率 Data Bits 一 数据传输位数 Parity 一 奇偶校验位 Stop Bits 一 数据传输的停止位 Send XON / XOFF 发送允许/禁止 这些好像哪里见过,找到usart.c文件的UART_Init函数中,发现完全一致 这也就是我们为什么要设置波特率为9600 一开始一脸茫然,不知道怎么将芯片的MCU和这两个元件连线 后来查了查才知道STM32芯片给了专门的TX引脚PA9和RX引脚PA10 那我们就把芯片的TX引脚和COMPIM的TXD相连,芯片的RX引脚和COMPIM的RXD相连,再将COMPIM的RXD与VIRTUAL TERMIN的RXD相连即可。详情可看上方的原理图 老规矩导入Hex文件,设置主频72MHz 虚拟串口VSPD 试用15天,使用方法官网里也有写 我自己用的是老版本的(反正能用就行,学习使用) 打开软件,创建COM3和COM4两个虚拟端口即可 两个串口已经可以正常通信了 串口调试工具XCOM 我用的是XCOM2.6版本的 由于软件是正点原子的 所以你也可以去正点原子的论坛里下载最近发布的版本来使用 打开串口调试工具XCOM,选择串口COM4->COM3,打开串口 (刚才在Proteus里设置COMPIM的串口是COM3) 开始测试串口通信 开机发送Welcome,正确 发送字符O,回传LED1 ON,LED1亮,正确 发送字符C,回传LED1 OFF,LED1灭,正确 发送字符Z,回传Command Not Found,正确 总结
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1683 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1582 浏览 1 评论
1013 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1627 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
675浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
538浏览 3评论
558浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
526浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 03:16 , Processed in 0.860292 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号