❤️作者主页:嵌入式_源-CSDN博客
❤️作者简介:嵌入式软件工程师,记录学习
❤️点赞 👍 收藏 ⭐,感谢您的关注
一、前期准备
我用野火开发板做的例程,你们可自行选择现有的硬件进行测试
1、硬件:
- 野火STM32F103ZET6
- DAP下载器
2、软件:
- keil5-IDE
- cubeMX
二、cubeMX配置
1、配置RCC——选择外部时钟源
2、配置SYS—— Serial Wire模式
3、时钟树拉满72M
4、配置串口1
5.创建工程
......
三、keil5代码
1.方式一:将调试信息通过sprintf函数转化为字符串,然后通过串口直接打印
char DebufPrintfBuf[50];
void debugprintf(uint8_t *str,uint16_t len)
{
HAL_UART_Transmit(&huart1,str,len,1000);
}
snprintf(DebufPrintfBuf,50,"key1->>value:%d\r\n",value);
debugprintf(DebufPrintfBuf,strlen(DebufPrintfBuf));
2.方式二:使用keil自带的微库进行打印调试信息
①
#include "stdio.h"
int fputc(int ch, FILE *f)//串口重定向
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
return ch;
}
printf("key2->>value:%d\r\n",value);
② 在Keil5中勾选如下选项
3.方式三 使用c语言完整的库进行打印调试信息。
#include "stdio.h"
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
return ch;
//while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
//USART1->DR = (uint8_t) ch;
//return ch;
}
printf("key3->>value:%d\r\n",value);
4.方式四 使用c语言完整的库+指令进行打印调试信息。 加头文件
#include "stdio.h"
uint16_t DebugPrintfCmd=0x0001;//只有cmd的最低为1时才能启用打印,例如3,二进制0011
//DebugPrintfCmd=0xFFFF;cmd输入除0之外都可打印
void debug_printf(uint16_t cmd, char *fmt, ...)
{
if (cmd & DebugPrintfCmd)
{
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap); //必须用带v的
va_end(ap);
}
}
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
}
debug_printf(3,"key4->>value:%d\r\n",value);
printf("key4->>value:%d\r\n",value);
5.方式五 使用c语言另一种用法+指令进行打印调试信息
#include "string.h"
#include "stdio.h"
uint16_t DebugPrintfCmd=0x0001;
static uint8_t USART1_TX_BUF[50]; //发送缓冲,最大USART1_MAX_SEND_LEN字节
void u1_printf(uint16_t cmd,char* fmt,...)
{
if (cmd & DebugPrintfCmd)
{
uint16_t len;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART1_TX_BUF,fmt,ap);
va_end(ap);
len=strlen((const char*)USART1_TX_BUF);//此次发送数据的长度
HAL_UART_Transmit(&huart1,USART1_TX_BUF,len,1000);
}
}
u1_printf(1,"key5->>value:%d\r\n",value);
6. 方法六 当单片机无串口资源时,使用数组来显示调试信息
#include <stdarg.h>
#include "string.h"
#include "stdio.h"
__align(8) uint8_t USART1_TX_BUF[50]; //发送缓冲,最大USART1_MAX_SEND_LEN字节
uint16_t DebugPrintfCmd=0x0001;
char debugbuf[20][50];//最多存放20组调试信息
void u1_printf(uint16_t cmd,char* fmt,...)
{
if (cmd & DebugPrintfCmd)
{
static uint8_t cmd=0;
uint16_t len;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART1_TX_BUF,fmt,ap);
va_end(ap);
len=strlen((const char*)USART1_TX_BUF);//此次发送数据的长度
memcpy(debugbuf[cmd],USART1_TX_BUF,len);
cmd++;
if(cmd>19)
{
cmd=0;
}
}
}
u1_printf(1,"key6->>value:%d\r\n",value);