STM32F103C8T6 HAL库 printf重定向 USART1 DMA方式发送数据

2024-06-09 15:04

本文主要是介绍STM32F103C8T6 HAL库 printf重定向 USART1 DMA方式发送数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

        在上一篇文章里,我采用printf重定向为usart1,但是这样发送,对于MPU的负载比较大,所以本篇文章采用DMA方式,解放MPU资源,去做其他的事情,这里仅做为自己的记录。

正文开始:

        Cubemx配置

        先是在Cubemx里对单片机进行配置,跟上一篇文章同样的配置

        增加DMA通道,并且将RX引脚置为上拉模式,因为本次只是作为发送,所以,这里也可以不把RX置为上拉模式,

        配置DMA,保持默认配置即可,可以根据自己的项目需求,将自己的优先级进行调整。

                这里已经是默认勾选了DMA中断,这里只将USART1的中断使能勾选上

        并且将RX引脚设置为上拉模式,因为在选择异步通信后,CubeMX会自动配置引脚的工作模式。这时的默认配置是不打开上下拉。这可能会使引脚在悬空状态时电平不确定,产生误接收。我们把RX接收引脚,修改为:上拉(Pull-up),给引脚固定一个弱上拉,以避免悬空时产生误接收。

        有些同学第一次会找不到如何将RX设置为上拉模式,按照我的箭头指示即可。

        至此,我们的配置部分基本完成,点击生辰代码即可。

        代码部分:

        在KEIL中新建文件夹USART_DMA.c和USAR_DMA.h文件。代码如下

        USART_DMA.c

#include "USART_DMA.h"
#include "stdio.h"
#include "stdarg.h"volatile uint8_t  usart_dma_tx_over = 1;int myprintf(const char *format,...)
{va_list arg;static char SendBuff[200] = {0};int rv;while(!usart_dma_tx_over);//等待前一次DMA发送完成va_start(arg,format);rv = vsnprintf((char*)SendBuff,sizeof(SendBuff)+1,(char*)format,arg);va_end(arg);HAL_UART_Transmit_DMA(&huart1,(uint8_t *)SendBuff,rv);usart_dma_tx_over = 0;//清0全局标志,发送完成后重新置1return rv;
}void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART1){usart_dma_tx_over = 1;}
}//要用的时候,直接可以
//myprintf("num:%d\r\n",i++);	
//HAL_Delay(1000);

        USART_DMA.h

#ifndef __USART_DMA_H
#define __USART_DMA_H#include "main.h"
#include "usart.h"int myprintf(const char *format,...);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);#endif

        使用的话,只要在while循环里添加myprintf即可。

        代码解释:

        这里我用到的是DMA传输,用到的函数是

HAL_UART_Transmit_DMA (&huart1, uint8_t *pData, uint16_t Num); 

        参数分别是选用的串口,数据地址(字符串数字形式的内容),发送的字节数。

        与HAL_UART_Transmit_IT (&huart1,  uint8_t *pData,  uint16_t Num);(中断发送)的区别在于100个字节,会产生100次中断。这个DMA发送函数,全程只产生一次中断。

        与HAL_UART_Transmit (&huart1,  uint8_t *pData,  uint16_t Num,  超时值);(阻塞式发送)区别在于阻塞式发送每发送一个字节,死等,好了继续发下一个,再死等,不断重复。就是以前标准库种那最普通的死等法,只是它增加了一个超时值。其中超时值的功能:如果指定时间内没发送完毕,就直接返回,防止卡死。数据发送通信需时间:1秒 ÷ 波特率 × 字节数 × 10 × 1000ms。举例:115200波特率,100字节,大约用时 9ms

        调用后,函数给DMA数据地址,DMA就自动开始搬砖,它会把数据逐字节搬运到串口的DR寄存器上,等串口发送完这个字节了,再自动搬运下一个,过程完全不占用程序运行资源。搬完了,就产生一个中断,给程序打个招呼。通常,我们程序上,把这个“招呼”也省略了,不用理会它。

        我们在串口的中断回调函数中,直接将标志位清零,然后等待下次将数据发送出去。

这篇关于STM32F103C8T6 HAL库 printf重定向 USART1 DMA方式发送数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045518

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语