STM32下多個串列埠的Printf用法
網上講的新增printf()到程式中一般都是這樣的(簡要提一下):
1.配置GPIO ,USART,RCC 的Configuration
2.勾選usb micro lib
3.在程式中新增:(標頭檔案需要新增#include <stdio.h>)
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1, (u8) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
很明顯這個方法使用printf()只能輸出到usart1,如果需要使用多個usart呢,肯定不能都是用printf()。
方法如下是繼續是用usart2的printf()功能:
1.配置usart2的串列埠配置,gpio,rcc enable,跟上面類似
2.勾選usb micro lib,跟上面類似
3.新增標頭檔案#include <stdarg.h>,編寫USART2的printf函式:
void USART2_printf (char *fmt, ...)
{
char buffer[CMD_BUFFER_LEN+1]; // CMD_BUFFER_LEN長度自己定義吧
u8 i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, CMD_BUFFER_LEN+1, fmt, arg_ptr);
while ((i < CMD_BUFFER_LEN) && buffer)
{
USART_SendData(USART2, (u8) buffer[i++]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
va_end(arg_ptr);
}