STM32F746_HAL库例程_UART+DMA+IDLE

本文详细介绍了如何使用STM32CubeMX配置STM32F746的UART、DMA和IDLE中断,通过MDK-ARM添加用户代码实现LED控制及串口通信。实验中,LED1周期性闪烁,用户按键可控制LED2亮灭,同时调试助手能成功接收单片机回传数据。

例程概览
硬件平台 NUCLEO-F746ZG
软件平台 STM32CubeMX&MDK-ARM
软件功能 串口DMA方式接收和发送、按键外部中断响应、LED灯

第一步:STM32CubeMX配置底层并生成工程代码

点击"New Project",在弹出界面点击"Board Selector",输入"nucleo-F746zg",窗口右侧显示筛选结果,双击;弹出对话框询问是否按照默认模式初始化所有外设,点击“Yes”;


进入图形化配置界面,关闭ETH和USB-OTG外设并将相关引脚设置为Reset State,设置PB3引脚为Reset State;引脚配置结果如下图所示

### STM32 HAL实现串口DMA空闲中断 #### 1. 初始化配置 为了使能STM32的串口通过DMA和空闲中断来接收不定长度的数据,在初始化阶段需完成如下操作: - 设置RCC模块,调整时钟频率并设定下载模式[^1]。 对于具体的硬件平台如`stm32f103rct6`而言,还需要特别注意一些细节上的配置项。比如要确保开启了SWD调试接口以及外接晶振作为系统的时基源;针对各个使用的USART端口(例如USART1, USART2等),应指定合适的波特率参数,并激活相应的DMA通道用于数据传输支持[^2]。 ```c // RCC与时钟配置 __HAL_RCC_USARTx_CLK_ENABLE(); // 替换为实际使用的USART编号 __HAL_RCC_DMAx_CLK_ENABLE(); // UART初始化结构体定义 UART_HandleTypeDef huart; huart.Instance = USARTx; // 使用的具体USART实例 huart.Init.BaudRate = 9600; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart) != HAL_OK){ Error_Handler(); } ``` #### 2. DMA与空闲中断设置 接下来就是配置DMA控制器以准备接受来自串口的数据流,并注册回调函数处理当检测到线路处于低电平状态超过一定时间后的事件——即所谓的“空闲线”条件触发的动作。 ```c // 配置DMA请求映射至对应的USART RXNE标志位上 __HAL_LINKDMA(&huart, hdmarx, DmaRxHandle); // 启用IDLE线检测功能及其关联的全局中断服务程序 __HAL_UART_ENABLE_IT(&huart, UART_IT_IDLE); NVIC_SetPriority(USARTx_IRQn, 0); // 调整优先级 NVIC_EnableIRQ(USARTx_IRQn); // 中断服务例程(ISR) void USARTx_IRQHandler(void){ /* 检查是否为空闲线中断 */ if (__HAL_UART_GET_FLAG(&huart, UART_FLAG_IDLE)){ __HAL_UART_CLEAR_IDLEFLAG(&huart); // 停止当前正在进行中的DMA事务 HAL_DMA_Abort(huart.hdmarx); // 处理已接收到的数据... // 准备下一轮接收过程 HAL_UART_Receive_DMA(&huart, aRxBuffer, BUFFER_SIZE); } } // 注册回调函数以便于在每次DMA传输完成后得到通知 static void MX_USARTx_UART_Init(UART_HandleTypeDef* huart){ ... huart->hdmarx->XferCpltCallback = UART_DMARxCplt; // 开始监听新的传入消息 HAL_UART_Receive_DMA(huart, aRxBuffer, BUFFER_SIZE); } // 当前缓冲区满载之后调用此方法 void UART_DMARxCplt(DMA_HandleTypeDef *hdma){ // 更新应用程序逻辑的状态机或者其他必要的动作 // 继续等待下一个分组的到来 HAL_UART_Receive_DMA(huart, aRxBuffer, BUFFER_SIZE); } ``` 上述代码片段展示了如何利用STM32 HAL构建起一套完整的机制去捕捉任意大小的消息帧,并且能够及时响应通信链路上发生的任何变化。这不仅提高了效率还简化了编程模型的设计复杂度。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值