基于Hal库stm32串口配置-printf函数-回调函数

使用示例

/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
DEBUG_USART_Config();
printf("欢迎使用野火 电机开发板 步进电机 速度闭环控制 位置式PID例程\r\n");
printf("按下按键1增加目标值、按键2减少目标值\r\n");	
printf("其他操作请使用PID调试助手\r\n");	  /* 初始化时间戳 */

这样即可以打印到串口助手上。

基础原理

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是STM32微控制器内部集成的一个硬件外设,用于串行数据通信。它能够根据数据寄存器中的一个字节数据自动生成数据帧时序,并通过TX引脚发送出去,同时也可以自动接收RX引脚的数据帧时序,将其拼接成一个字节数据并存放在数据寄存器中。

波特率生成器

  • 功能:USART内置波特率发生器,最高支持4.5 Mbps的速率。
  • 工作原理:波特率发生器通过对输入时钟频率进行分频来生成所需的波特率时钟。例如,如果APB2总线提供72 MHz的频率,波特率发生器将对其进行分频,生成所需的波特率时钟。在这个时钟下进行数据的收发,即为指定的通信波特率。

配置选项

  • 数据位长度:可配置为8位或9位数据长度。
  • 停止位长度:可选0.5、1、1.5或2个停止位。
  • 校验位:可选无校验、奇校验或偶校验。
  • 模式支持:
  • 同步模式:用于需要时钟信号的通信。
  • 硬件流控制:用于避免数据丢失的问题。
  • DMA(直接存储器访问):用于大量数据传输,减轻CPU负担。
  • 智能卡模式:支持智能卡通信。
  • IrDA(红外数据协会):用于红外通信。
  • LIN(局域网络接口):用于汽车通信网络。

硬件流控制

问题:当A设备通过TX向B设备的RX发送数据,如果A发送太快,B处理不过来,就可能导致数据丢失。

  • 解决方案:硬件流控制在硬件电路上多出一根线,用于反馈B设备的准备状态。
  • 当B设备没有准备好接受数据时,发送高电平信号。
  • 当B设备准备好接受数据时,发送低电平信号。
  • A设备根据B设备的反馈信号决定是否发送数据。
  • 作用:避免数据丢失的问题,确保数据传输的可靠性。
  • 使用:STM32支持硬件流控制,但一般情况下不常用。

DMA支持

  • 功能:USART支持DMA(直接存储器访问)用于数据传输。
  • 优势:在进行大量数据收发时,DMA可以直接将数据从存储器传输到USART外设或从USART外设传输到存储器,减轻了CPU的负担,提高了数据传输效率。

STM32F103C8T6的USART资源

  • USART1:连接在APB2总线上。
  • USART2、USART3:连接在APB1总线上。

串口初始化

  • 开启时钟:首先,打开USART和GPIO所需的时钟。
  • GPIO初始化:将TX引脚配置为复用输出,将RX引脚配置为输入。
  • 配置USART:使用一个结构体配置所有参数。
  • 启用USART:
  •         如果只需要发送功能,直接启用USART。
  •         如果需要接收功能,还需配置中断。在启用USART之前,添加ITConfig和NVIC的相关代码。

问题引入?

1、这两个函数的功能和区别?//HAL_UART_Receive_IT(&UartHandle,UART_RxBuffer,20); /*使能串口接收断 */ __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);

在 STM32 的 HAL 库中,HAL_UART_Receive_IT 和 __HAL_UART_ENABLE_IT 是用于配置和启用 UART 接收功能的两个关键函数。它们的区别在于功能不同,分别用于启动接收中断和使能特定的中断。


1. HAL_UART_Receive_IT

功能:

  • 启动 UART 接收中断:该函数用于以中断模式启动 UART 接收数据。当接收到指定数量的数据时,会触发中断。
  • 异步接收:通过中断方式接收数据,适合需要实时处理接收数据的场景。
  • 数据缓冲区:需要传递一个接收缓冲区 UART_RxBuffer(一个数组或指针),用于存储接收到的数据。
  • 接收长度:需要指定接收的数据长度 20,表示期望接收 20 个字节的数据。

触发条件:

  • 当 UART 接收到指定数量的字节(例如 20 字节)时,触发接收完成中断。
  • 调用回调函数 HAL_UART_RxCpltCallback 处理接收完成后的逻辑。

示例代码:

HAL_UART_Receive_IT(&UartHandle, UART_RxBuffer, 20);

关键点:

  • 接收完成后,系统会自动调用回调函数 HAL_UART_RxCpltCallback
  • 适用于需要接收固定长度数据的场景。

2. __HAL_UART_ENABLE_IT

功能:

  • 使能特定的 UART 中断:该函数用于使能 UART 的特定中断源(例如,接收缓冲区非空中断 
### STM32 HAL中DMA中断回调函数的使用方法 在STM32 HAL中,当配置并启用DMA传输时,可以通过定义特定的回调函数来响应DMA事件。对于串口通信中的DMA操作,主要涉及的是`HAL_UARTEx_RxEventCallback()`这一回调函数[^3]。 #### 定义回调函数 为了自定义处理逻辑,在项目源文件中重新实现此回调函数: ```c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { /* 用户可以根据实际需求编写代码 */ if (Size > 0) { // 处理接收到的数据 ProcessReceivedData(huart->pRxBuffPtr, Size); // 如果还需要继续接收,则重启DMA接收 HAL_UARTEx_ReceiveToIdle_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE); } } ``` 上述代码片段展示了如何覆盖默认行为,并针对不同情况执行相应动作。每当发生空闲线检测到停止位、半缓冲区满或是整个缓冲区已填满的情况时都会触发这个回调函数。 #### 配置UART与DMA 确保已经在STM32CubeMX工具里正确设置了USART外设以及关联的DMA通道用于RX方向上的数据流管理。具体来说就是选择合适的单片机型号(比如STM32F103C8T6),然后按照向导提示完成必要的初始化工作[^1]。 另外需要注意的是,如果希望利用外部GPIO引脚作为中断源的话,应该关注`HAL_GPIO_EXTI_Callback()`这样的接口来进行更细致化的控制[^4];不过这通常适用于其他类型的硬件交互而非直接与DMA相关的场景下。 通过以上介绍可以看出,在应用层面上灵活运用这些API可以使开发者更加高效地管理和优化基于STM32平台的应用程序性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值