STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令)

本文详细介绍了如何使用STM32进行串行通信,通过中断机制实现按键检测和LED控制,涉及Proteus电路设计、STM32CubeMX配置、MDK编程及VSPD虚拟串口的应用。通过实例展示了COM1与COM2之间的通信过程和LED响应功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、功能需求分析

在中断机制实现按键检测的案例之后,我们介绍串行通信,而使用串行通信的方式采用中断方式实现,即在完成发送或者接收数据后,会触发串行通信的发送和接收callback函数,执行回调函数功能。
在单片机通信方式中,通常有两种,串行通信和并行通信。
串行通信即一次只发送一位数据,多次发送完成。
并行通信即一次发送多位数据,一次完成。
下面有一张关于两种通信方式的基础知识点,概括很全面,大家可以自己理解。
在这里插入图片描述需求分析:

  1. 仿真方式,实现COM1和COM2的通信,COM2发送命令,COM1执行命令并返回结果;
  2. 接线方式,COM1连接STM32,RXD和TXD并联,STM32使用第一组串口线,PA9(TXD)PA10(RXD);PA0-PA2分别连接LED1-LED3;
  3. 通信协议:
    COM2发送字符a,LED1熄灭;
    COM2发送字符b,LED1点亮;
    COM2发送字符c,LED2熄灭;
    COM2发送字符d,LED2点亮;
    COM2发送字符e,LED3熄灭;
    COM2发送字符f,LED3点亮;

使用到的工具:

工具软件 功能
Proteus 绘制原理图
STM32CubeMX 图形化配置生成MDK项目
MDK 编写下位机代码
XCOM 串口调试住手
VSPD 虚拟串口驱动

用到的工具比较多,这里梳理一下思路:
本案例的功能是通过串口通信实现命令下发和命令执行以及结果反馈的功能。
具体实现选择的是通过单个字符,比如‘a’命令,点亮LED1;
但是如果想实现串口通信,需要提供两个物理串口,而且是不同PC机的,同一台PC机无法实现自己的两个串口通信。
所以,这里使用到了VSPD,它可以将一台PC的两个端口虚拟连接,实现数据收发,解决了我们硬件的限制。

在这里插入图片描述

### STM32CubeMX Proteus 串口接收中断配置教程 #### 配置环境准备 为了实现STM32通过Proteus进行串口中断接收,在开始之前需确保已安装并设置了STM32CubeMX、Keil MDK以及Proteus软件,并能正常工作。此外,还需下载相应的文件以便于项目开发。 #### 使用STM32CubeMX初始化外设 启动STM32CubeMX工具后加载目标单片机型号,接着按照需求配置时钟树结构和其他必要的硬件资源。对于USART接口而言,主要操作如下: - **选择USART端口**:依据实际电路连接情况指定用于通信的具体UART/USART通道。 - **设定参数**:调整波特率至9600bps或其他合适速率;校验位通常选无(NONE),停止位保持默认即可[^1]。 ```c /* 初始化 USART */ static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 9600; // 设置波特率为9600 bps huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } ``` #### 启用中断功能 完成上述基本配置之后,转到NVIC(嵌套向量中断控制器)页面勾选对应USART事件触发条件——即RXNE(接收数据寄存器非空),从而允许外部输入信号引起内部处理程序响应。 #### 编写回调函数处理接收到的数据 当有新字符到达时会自动调用预定义好的ISR入口点`void USART2_IRQHandler(void)`,在此处编写具体逻辑来读取缓冲区内的有效负载并向应用程序层传递消息。 ```c // 定义全局变量存储接收到的信息 uint8_t receivedData; /** * @brief This function handles USART2 global interrupt. */ void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(&huart2); } /** * @brief UART receive complete callback in non blocking mode * @param UartHandle: pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { if (UartHandle->Instance == USART2){ // 将接收到的数据保存起来 receivedData = RxBuffer[0]; // 清除标志位并重新启用接收中断 __HAL_UART_CLEAR_FLAG(UartHandle, UART_FLAG_TC); HAL_UART_Receive_IT(UartHandle, RxBuffer, 1); } } ``` 以上就是基于STM32CubeMX配合Proteus仿真的串口中断接收方案概述及其部分核心代码片段展示。希望这些资料能够帮助理解如何构建稳定可靠的异步串行链路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值