STM32
直播中

小组店小二

9年用户 929经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[问答]

怎样使用Sprintf函数去代替printf函数呢

为什么要去重定义Sprintf函数呢?怎样使用Sprintf函数去代替printf函数呢?

回帖(1)

段朝思

2021-11-30 10:16:27
Printf函数采用阻塞式发送,不建议使用DMA方式发送,日志不能丢失,且DMA会刷新发送区域造成丢帧的问题,且如果串口和DMA共同使用则DMA发送的数据包会将日志数据冲掉.调试输出慢点没有关系
   
  问题:在使用STM32F105printf数据时如果在ADC初始化前使用printf输出日志(勾选MicroLib)时则出现不能进入ADCDMA采样中断的情况
  解决办法:重定义Sprintf函数,使用Sprintf函数代替printf函数
  1.去掉 Use MicroLIB
  
  

  

  2.重定义printf函数

#include "stdarg.h"

/**
* @brief 串口printf
* @note  数据长度不要超过string长度
*/
void Sprintf(const char *format,...)
{
    static char string[255];
    uint32_t uLen,i;
    va_list arg;
   
    //Start String Conver
    va_start(arg,format);
    uLen = vsnprintf(string,sizeof(string),(char*)format,arg);
    va_end(arg);
   
    //Start Usart Send
    for(i=0;i         while((USART3->SR.Bits.TXE)==0);//循环发送,直到发送完毕   
        USART3->DR = string;
    }
}
3.使用宏定义PRINTF代替printf
  #define PRINTF(fmt,arg...)   Sprintf(fmt,##arg)
举报

更多回帖

×
20
完善资料,
赚取积分