基于STM32CubeMX——HAL库开发的串口通讯(DMA模式)

本文介绍了如何使用STM32CubeMX配置STM32F103R6Tx芯片进行串口通信,特别是利用DMA模式进行数据传输。详细步骤包括设置SYS调试模式、RCC时钟源、USART1异步通讯和DMA接收模式。同时,文章提到了关键的HAL库函数,如串口轮询和中断模式的发送与接收,以及DMA的暂停、恢复和停止操作。为了实现printf与scanf功能,还需要在stm32f1xx_hal.c文件中重写fget和fput函数,并在主函数中启动DMA接收并处理接收完成后的操作。

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

STM32CubeMX配置

首先打开STM32CubeMX选择你开发的芯片型号,这里我选择的是F103R6Tx的芯片。然后第一步选择SYS里面的debug模式,如果用HAL库不进行SWD或JTAG配置,单片机只能进行下载一次程序,要进行第二次或更多次程序下载,需要按复位键(如果你的单片机有复位按键的话),或者用镊子夹住复位线路上的电容使其短路,点击Keil下载,再松开镊子。

在这里插入图片描述然后RCC时钟源选择外部高速时钟,自接外部晶振
在这里插入图片描述然后配置时钟树
在这里插入图片描述然后打开USART1选择异步通讯模式
在这里插入图片描述打开DMA添加,注意RX的DMA传输模式选择为循环模式circular,不然只会接受一次。
在这里插入图片描述如果用DMA方式发送,则需要使能USART1的中断,注意:如果不开启串口中断,则程序只能发送一次数据,程序不能判断DMA传输是否完成,USART一直处于busy状态
在这里插入图片描述这里注意选择环境,且路径不要出现中文名
在这里插入图片描述在这里插入图片描述<

### 配置 STM32CubeMXHAL 以实现 ADC 与 DMA 协同工作并经由 USART2 发送数据 #### 使用 STM32CubeMX 进行初步设置 通过 STM32CubeMX 工具初始化项目时,需确保正确配置了 ADC 和 DMA 功能模块以及USART2通信端口。具体而言: - **ADC 设置**:选择所需的模拟输入通道,并启用连续转换模式以便于后续的数据采集过程[^1]。 - **DMA 设置**:关联已选的 ADC 请求至相应的 DMA 流/通道上;同时指定传输方向为外设到内存(Peripheral to Memory),这允许自动将采样得到的结果存储到预先分配好的缓冲区内。 - **USART2 初始化**:激活 UART 接口用于发送接收到的数据流,注意调整波特率和其他必要的通讯参数来匹配接收设备的要求。 完成上述硬件资源的选择之后,点击“Configure”按钮进入更详细的软件层面设定阶段。 #### 编写应用程序代码片段 基于生成的基础框架进一步扩展功能逻辑如下所示: ```c #include "main.h" #include "stm32f4xx_hal.h" /* 定义全局变量 */ uint8_t buffer[64]; // 存储待发往串口的消息字符串 float voltage; // 记录当前测量电压值 // ... (省略其他标准头文件) int main(void){ /* 初始化所有MCU外设, 用户的应用程序应在此处编写 */ while(1){ /* 主循环体 */ // 启动一次新的AD转换序列 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&voltage, 1); // 构造消息准备发送给PC或其他终端显示 sprintf((char*)buffer,"Voltage=%f\r\n",voltage); // 将构建好后的字符数组推送到USART2输出队列等待实际传送出去 HAL_UART_Transmit(&huart2, buffer,strlen((const char *)buffer),HAL_MAX_DELAY); } } ``` 此段示范性源码实现了周期性的读取来自特定引脚上的电平变化情况,并将其量化成易于理解的形式——即浮点数表示的实际电压等级—最后再利用异步串行链路分享这些信息给外部世界。 #### 注意事项 当遇到 FreeRTOSConfig.h 文件中定义了与 `stm32f103xx_it.c` 中相同中断处理函数的情况时,应当适当修改其中一个版本的名字或者直接删除重复项以免造成编译错误或运行期冲突现象的发生[^2]。 此外,在更换目标平台或是操作系统环境的情况下,得益于良好的分层架构设计原则,大部分高层业务流程无需做过多改动即可顺利迁移过去,只需关注底层驱动适配部分的工作量即可[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值