1)STM32系统给上位机(win10)连续发送“hello windows!”,win10采用“串口助手”工具接收。如果STM32的连续发送之间不加延时语句,观察win10端是否出现接收数据丢失的现象。
1.1在STM32CubeMX中建立一个新的工程。
1.2在新的工程中选择stm32f103c8t6型号。
1.3将PA9和PA10两个引脚分别配置为USART1_TX和USART1_RX。
1.4在左侧局域栏中的Connectivity中选中USART1,将其Mode设置为Asynchronous。
1.5配置文件的名称和保存路径,并选择MDK_keil开发工具,选择版本v5
1.6在左侧选项栏中选中Code Generator,并在其中的Generated Files中勾选上第一个选项,并点击右上方的GENERATE CODE生成keil5程序。
1.7编写STM32F1xx HAL库配置文件
1.8编写main.h头文件
1.8编写主函数main.c文件
1.9编译并运行编写的程序
编译成功:
硬件连接
STM32F103C8T6 ↔ USB转串口模块
PA9 (USART1_TX) → RXD of USB-to-Serial
PA10 (USART1_RX) → TXD of USB-to-Serial
GND → GND
串口助手设置
在Windows 11的串口助手中需要设置:
波特率: 115200
数据位: 8位
停止位: 1位
校验位: 无
流控制: 无
代码详细说明
- 系统初始化
HAL_Init(): 初始化HAL库
SystemClock_Config(): 配置系统时钟为72MHz(使用8MHz HSE晶振,PLL 9倍频)
MX_GPIO_Init(): 初始化GPIO
MX_USART1_UART_Init(): 初始化USART1 - USART1配置
波特率: 115200
数据位: 8位
停止位: 1位
校验位: 无
硬件流控制: 无
过采样: 16倍 - 数据传输
使用HAL_UART_Transmit()函数以阻塞方式发送数据
HAL_MAX_DELAY参数确保数据完全发送完成
发送字符串为"hello windows!\r\n"(包含换行符便于观察)
主循环中连续发送,没有添加任何延时语句 - 性能特点
由于没有延时,STM32会以最快速度连续发送数据
发送频率取决于串口波特率和字符串长度
理论上最大发送频率约为:115200 / (14×10) ≈ 823次/秒
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送。
2.1修改STM32F1xx HAL库配置文件
2.2编写中断头文件(stm32f1xx_it.h)
2.3修改编写中断服务函数(stm32f1xx_it.c)
2.4修改头文件(main.h)
2.5编写主函数main.c
2.6编译并运行程序
编译运行成功:
硬件连接
STM32F103C8T6 ↔ USB转串口模块
PA9 (USART1_TX) → RXD of USB-to-Serial
PA10 (USART1_RX) → TXD of USB-to-Serial
GND → GND
串口助手设置
在Windows 11的串口助手中需要设置:
波特率: 115200
数据位: 8位
停止位: 1位
校验位: 无
流控制: 无
功能说明
- 基本功能
STM32上电后连续发送"hello windows!"字符串
发送之间没有延时,以最快速度连续发送 - 扩展功能
暂停发送: 当上位机发送字符"#"时,STM32暂停发送"hello windows!"
继续发送: 当上位机发送字符"*"时,STM32继续发送"hello windows!"
状态反馈: 收到控制命令时发送相应的状态信息(可选) - 实现原理
中断接收
使用HAL_UART_Receive_IT()启动中断接收
在HAL_UART_RxCpltCallback()回调函数中处理接收到的数据
每次中断处理完成后重新启动接收中断
发送控制
使用全局变量send_enable_flag控制发送状态
主循环中检查该标志决定是否发送数据
volatile关键字确保多环境下的正确访问
代码详细说明
1. 初始化流程
- 系统时钟配置(72MHz)
- GPIO初始化
- USART1初始化(115200波特率,8数据位,1停止位,无校验)
- 启动USART1接收中断
2. 中断处理流程
- 接收到字符触发USART1中断
- 在回调函数中判断接收到的字符
- 根据字符修改发送使能标志
- 重新启动接收中断等待下一个字符
3. 主循环流程
- 检查发送使能标志
- 如果允许发送,则发送"hello windows!"
- 如果不允许发送,则跳过发送操作
- 循环执行,无额外延时