MM32F3273G8P火龙果开发板MindSDK开发教程2 - uart1重定向printf的使用
1、管脚配置
使用PB6 PB7作为串口打印的管脚。
而PB6 PB7连接到DAP-Link的虚拟串口上,所以直接用dap的虚拟串口查看mm32
的打印输出即可。
管脚配置代码如下:
static void BOARD_InitUartPins(void)
{
/* Pb6 - UART1_TX. */
GPIO_Init_Type gpio_init;
gpio_init.Pins = CONSOLE_TX_GPIO_PIN;
gpio_init.PinMode = GPIO_PinMode_AF_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(CONSOLE_GPIO_PORT, &gpio_init);
GPIO_PinAFConf(CONSOLE_GPIO_PORT, gpio_init.Pins, GPIO_AF_7);
/* Pb7 - UART1_RX. */
gpio_init.Pins = CONSOLE_RX_GPIO_PIN;
gpio_init.PinMode = GPIO_PinMode_In_Floating;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(CONSOLE_GPIO_PORT, &gpio_init);
GPIO_PinAFConf(CONSOLE_GPIO_PORT, gpio_init.Pins, GPIO_AF_7);
}
2、Uart1的配置
相关代码如下:
void BOARD_InitDebugConsole(void)
{
UART_Init_Type uart_init;
BOARD_InitUartPins();
uart_init.ClockFreqHz = CLOCK_APB2_FREQ;
uart_init.BaudRate = 115200U;
uart_init.WordLength = UART_WordLength_8b;
uart_init.StopBits = UART_StopBits_1;
uart_init.Parity = UART_Parity_None;
uart_init.XferMode = UART_XferMode_RxTx;
uart_init.HwFlowControl = UART_HwFlowControl_None;
uart_init.XferSignal = UART_XferSignal_Normal;
uart_init.EnableSwapTxRxXferSignal = false;
UART_Init(BOARD_DEBUG_UART_PORT, &uart_init);
UART_Enable(BOARD_DEBUG_UART_PORT, true);
}
3、使能UART1以及GPIOB的时钟
/* GPIOB. */
RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOB);
/* UART1. */
RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_UART1, true);
RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_UART1);
4、重定向printf
int fputc(int c, FILE *f)
{
(void)(f);
while ( 0u == (UART_STATUS_TX_EMPTY & UART_GetStatus(UART1)) )
{}
UART_PutData(UART1, (uint8_t)(c));
return c;
}
int fgetc(FILE *f)
{
(void)(f);
while ( 0u == (UART_STATUS_RX_DONE & UART_GetStatus(UART1)) )
{}
return UART_GetData(UART1);
}
5、头文件相关定义
#ifndef __UART_H__
#define __UART_H__
#define CONSOLE_TX_GPIO_PIN GPIO_PIN_6
#define CONSOLE_RX_GPIO_PIN GPIO_PIN_7
#define CONSOLE_GPIO_PORT GPIOB
#define BOARD_DEBUG_UART_PORT UART1
void BOARD_InitDebugConsole(void);
#endif //__UART_H__
6、main函数调用
int main(void)
{
BOARD_InitBootClocks(); // ³õʼ»¯Ê±ÖÓ
BOARD_InitDebugConsole();
LED_Init();
while(1)
{
LED_On();
printf("led on\r\n");
APP_Delay(1000);
LED_Off();
printf("led off\r\n");
APP_Delay(1000);
}
}
7、现象
8、代码路径
https://gitee.com/xiaoguo-tec_0/mm32-f3273.git