背景

在单片机的开发中,经常需要使用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函数相关推荐

  1. STM32通过DMA方式实现串口通信

    目录 一.DMA工作原理 二.创建工程项目 三.编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码 四.编译烧录 1.编译运行 2.烧录结果 五.总结 六.参考 ...

  2. WS2812灯珠(三)-- STM32 PWM+DMA方式驱动

    WS2812灯珠(三)-- STM32 PWM+DMA方式驱动 文章目录 WS2812灯珠(三)-- STM32 PWM+DMA方式驱动 一.理论 二.代码实践 一.理论 PWM输出就是对外输出脉宽( ...

  3. STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!

    本文转自:http://www.amobbs.com/thread-5530588-2-1.html 一直以来都为串口接收数据所困扰: 1:如果用接收中断的话,每接收1byte就得中断一次.这样太消耗 ...

  4. STM32:DMA方式接收SPI总线数据,并按照协议进行处理

    一.前言 为满足高速数据传输的要求,采用SPI总线.MCU端(STM32F072  Cortex-M0)接收CPU发送的SPI数据(数据18个字节为一包,起始包为0xAA,最后一包为CheckSum校 ...

  5. 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题

    1.开发平台 计算机操作系统:WIN7 64位: 开发环境:Keil MDK 5.14: MCU:STM32F407ZET6: STM32F4xx固件库:STM32F4xx_DSP_StdPeriph ...

  6. STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  7. 串口中断方式与DMA方式通信

    文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...

  8. 【嵌入式12】DMA通信原理及编程实验,DMA方式向上位机连续发送数据

    本文介绍DMS通信原理,STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据. 一.DMA介绍 什么是DMA? DMA介绍 DMA传输方式 DMA传输参数 DMA数据传输的 ...

  9. 【STM32H7教程】第94章 STM32H7的SPI总线应用之双机通信(DMA方式)

    完整教程下载地址:链接 第94章       STM32H7的SPI总线应用之双机通信(DMA方式) 本章节为大家讲解SPI DMA方式双机通信. 目录 94.1 初学者重要提示 94.2 SPI D ...

  10. STM32之ADC实例(基于DMA方式)

    出处:https://blog.csdn.net/zouleideboke/article/details/75112224?locationNum=9&fps=1 ADC简介: ADC(An ...

最新文章

  1. 问题:AttributeError: module 'tensorflow' has no attribute 'gfile'
  2. WSUS2.0数据导入、导出(备份、还原)
  3. 2022春招马蜂窝旅游网第一轮面试 面经
  4. Python项目:实现微信聊天机器人
  5. placeholder和assign速度对比
  6. 最大公约数(超级好的板子)
  7. 【ESIM】论文阅读笔记:文本蕴含之ESIM
  8. Java中print、printf、println的区别(转载)
  9. web用css做网页实验报告,Web实验报告网页设计与制作
  10. 聚焦智能制造 香洲区产学研资对接合作活动 盈致科技成功牵手北理珠
  11. riscv-gnu-toolchain下载安装
  12. springboot整合腾讯云短信服务
  13. python爬取京东商品数据要先登录_Python爬虫的起点
  14. 怎样将Sublime Text 设置成中文版(完整教程)
  15. paint.net ps证件照背景色
  16. android检测蜂窝网络,怎么检查您的Android设备蜂窝信号强度?
  17. vc9.vc11.vc14_vc解释了为什么vc现在如此生气
  18. 每秒订单数25倍提升,蘑菇街怎样跨过海量服务架构的技术藩篱?
  19. iOS:error: exportArchive:No certificate for team ‘xxx‘ matching ‘‘xxx found
  20. MySQL查询优化方法

热门文章

  1. MAC 下如何更改brew源地址
  2. matlab中样本相关系数的计算与测试
  3. CU的递归划分详细介绍
  4. qq说说时间轴php实现,QQ说说时间 qq说说时间轴
  5. 4本图神经网络中文书籍的比较
  6. Spring boot Redis 乱码
  7. 如何使用Python将Word转换为PDF文件?
  8. ios中文字添加删除线
  9. wsl2安装及一些使用技巧
  10. Java个人职业发展方向