STM32以DMA方式实现printf函数
背景
在单片机的开发中,经常需要使用printf函数来监测程序运行中的一些变量,但是在程序中添加printf函数会影响程序的执行速度,尤其在一些对时间要求比较高的函数中,会造成比较大的延时,以9600bps的速度来说,发送一个字节(8位,无奇偶校验)需要 1 * 10 / 9600 = 1.04ms。那发送10个字节就有10ms左右的延时,对于一些函数来说可能无法容忍这么大的延迟。因此使用DMA的方式就显得比较重要。
实现思路
实现printf函数主要就是要改写fputc函数
int fputc(int ch, FILE *f)
但是fputc函数每次只能发送一个字节,如果我们把fputc函数直接改成:
int fputc(int ch, FILE *f)
{HAL_UART_Transmit_DMA(&PrintUartHandle, (uint8_t *)&ch, 1); return (ch);
}
那么至少存在两个问题:
1、DMA每次都发送一个字节,效率比较低。
2、频繁调用fputc,可能DMA上一次的数据还没有发送完,导致这次发送失败。
例如:
printf("HelloWorld\r\n");
printf先发送H,调用fputc函数,此时DMA开始工作。由之前的分析可知,对于9600bps来说,需要1ms才能把字符H发送完成。在这1ms之内elloWolrd\r\n都会调用fputc函数,但由于DMA还没有发送完成,会导致其他的字符发送失败。最终成功发出去的只有第一个字符H。
如果想用调用DMA,就要想其他的办法。因为printf函数最终是调用fputc函数的,所以我们要在fputc函数中想办法。我们需要做以下处理:
1、如果fputc函数中DMA是空闲状态的话,那么向DMA中放入数据,并启动DMA发送。
2、如果fputc函数中的DMA现在忙,那么需要把数据暂时存储起来。
3、如果数据发送完成,那么需要判断暂存区有没有数据,如果有数据则需要把暂存区的所有数据都通过DMA发送出去。
那么现在这个问题的关键是在这个暂存区怎么实现,可以想象的出来的,这个暂存区应该是一个环形队列。
STM32以DMA方式实现printf函数相关推荐
- STM32通过DMA方式实现串口通信
目录 一.DMA工作原理 二.创建工程项目 三.编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码 四.编译烧录 1.编译运行 2.烧录结果 五.总结 六.参考 ...
- WS2812灯珠(三)-- STM32 PWM+DMA方式驱动
WS2812灯珠(三)-- STM32 PWM+DMA方式驱动 文章目录 WS2812灯珠(三)-- STM32 PWM+DMA方式驱动 一.理论 二.代码实践 一.理论 PWM输出就是对外输出脉宽( ...
- STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!
本文转自:http://www.amobbs.com/thread-5530588-2-1.html 一直以来都为串口接收数据所困扰: 1:如果用接收中断的话,每接收1byte就得中断一次.这样太消耗 ...
- STM32:DMA方式接收SPI总线数据,并按照协议进行处理
一.前言 为满足高速数据传输的要求,采用SPI总线.MCU端(STM32F072 Cortex-M0)接收CPU发送的SPI数据(数据18个字节为一包,起始包为0xAA,最后一包为CheckSum校 ...
- 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题
1.开发平台 计算机操作系统:WIN7 64位: 开发环境:Keil MDK 5.14: MCU:STM32F407ZET6: STM32F4xx固件库:STM32F4xx_DSP_StdPeriph ...
- STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)
目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...
- 串口中断方式与DMA方式通信
文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...
- 【嵌入式12】DMA通信原理及编程实验,DMA方式向上位机连续发送数据
本文介绍DMS通信原理,STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据. 一.DMA介绍 什么是DMA? DMA介绍 DMA传输方式 DMA传输参数 DMA数据传输的 ...
- 【STM32H7教程】第94章 STM32H7的SPI总线应用之双机通信(DMA方式)
完整教程下载地址:链接 第94章 STM32H7的SPI总线应用之双机通信(DMA方式) 本章节为大家讲解SPI DMA方式双机通信. 目录 94.1 初学者重要提示 94.2 SPI D ...
- STM32之ADC实例(基于DMA方式)
出处:https://blog.csdn.net/zouleideboke/article/details/75112224?locationNum=9&fps=1 ADC简介: ADC(An ...
最新文章
- 问题:AttributeError: module 'tensorflow' has no attribute 'gfile'
- WSUS2.0数据导入、导出(备份、还原)
- 2022春招马蜂窝旅游网第一轮面试 面经
- Python项目:实现微信聊天机器人
- placeholder和assign速度对比
- 最大公约数(超级好的板子)
- 【ESIM】论文阅读笔记:文本蕴含之ESIM
- Java中print、printf、println的区别(转载)
- web用css做网页实验报告,Web实验报告网页设计与制作
- 聚焦智能制造 香洲区产学研资对接合作活动 盈致科技成功牵手北理珠
- riscv-gnu-toolchain下载安装
- springboot整合腾讯云短信服务
- python爬取京东商品数据要先登录_Python爬虫的起点
- 怎样将Sublime Text 设置成中文版(完整教程)
- paint.net ps证件照背景色
- android检测蜂窝网络,怎么检查您的Android设备蜂窝信号强度?
- vc9.vc11.vc14_vc解释了为什么vc现在如此生气
- 每秒订单数25倍提升,蘑菇街怎样跨过海量服务架构的技术藩篱?
- iOS:error: exportArchive:No certificate for team ‘xxx‘ matching ‘‘xxx found
- MySQL查询优化方法