极海半导体APM32F103ZET6实现USART格式化输出方法
极海半导体APM32F103ZET6的mini板上实现格式化输出数据的4种方法,配置总结方法如下:
 
  
 
  
包含头文件
Use MicroLib
重定向c库函数
使用半主机
自定义格式化输出函数
直接使用printf
stdio.h
×
×
×
×
自行编写USART1Printf
stdarg.h   
×
×
×
×


1 方法一:printf + Use MicroLIB1.1 配置Keil工程
1.2 在完成好初始化串口的代码上包含头文件、添加代码
#include "stdio.h"
 
//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
     USART_TxData(USART1,(char) ch);
     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);
     return(ch);
}
 
//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
     while(USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
     return(int)USART_RxData(USART1);
}
1.3 编写测试代码,连接好串口,现象如下:
测试代码:printf("begin\n\r");
测试现象:
 
 
2 方法二:pritnf +  Not Use MicroLib2.1 配置Keil工程
 
2.2 在完成好初始化串口的代码上包含头文件、添加代码
#include "stdio.h"
 
#pragma import(__use_no_semihosting) //这条语句可以关闭半主机模式               
//标准库需要的支持函数                 
struct __FILE
{
     inthandle;
};
 
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
     x = x;
}
 
 
//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
     USART_TxData(USART1,(char) ch);
     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);
     return(ch);
}
 
//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
     while(USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
     return(int)USART_RxData(USART1);
}
 
2.3 编写测试代码,连接好串口,现象如下:
测试代码:printf("begin\n\r");
测试现象:
 
 
3 方法三:自行撰写USART1Printf+ Use MicroLIB3.1 配置Keil工程
 
3.2 在完成好初始化串口的代码上包含头文件、添加代码
#include <stdarg.h>   
 
void TP_USART1SendString(char *s)
{
  while (*s!= '\0')
  {
     USART_TxData(USART1,*s);
     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);   
    s++;  
  }
}
 
void USART1Printf(char *fmt,...)
{
     __va_listap;
     charstring[400];
     va_start(ap,fmt);
     vsprintf(string,fmt,ap);   
     TP_USART1SendString(string);
     va_end(ap);   
}
3.3 编写测试代码,连接好串口,现象如下:
测试代码:USART1Printf ("begin\n\r");
测试现象:
 
 
4 方法四:自行编写USART1Printf+ Not Use MicroLIB4.1 配置Keil工程
 
4.2 在完成好初始化串口的代码上包含头文件、添加代码
#include <stdarg.h>   
 
#pragmaimport(__use_no_semihosting) //这条语句可以关闭半主机模式               
//标准库需要的支持函数                 
struct __FILE
{
     inthandle;
};
 
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
     x = x;
}
 
 
void TP_USART1SendString(char *s)
{
  while (*s!= '\0')
  {
     USART_TxData(USART1,*s);
     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);   
    s++;  
  }
}
4.3 编写测试代码,连接好串口:
测试代码:USART1Printf ("begin\n\r");
测试现象