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)
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)
举报