【前言】
MM32F5260中的示例工程,灵动微的工程师们,编写了非常优秀的示例工程供用户用来验证。但是常用的串口工程师们都是使用开发板的MM32LINK-OB用来连接串口实现打印的。在工程中提供了platform.c用于开发板的LED、Button、uart的初始化,并实现了printf的重定向。我在前面的试用中经查看串口,他使用的是uart2用于输出printf。但是开发板接到MM32LINK的是uart3,在修改后,由于没有注意到给printf重定向的输入函数中,没有修改对应的串口,一上电就卡死,查找了好久才找到原因。因此建议示例模版最好修改为uart3。在这里我也做了修改,希望能帮到以后应用中需要使用MM32LINK直接用于调试打印的工程师朋友们。
【原理图】
在官方给出的原理图中,PC10做为uart3的TX,接到了MM32LINK中,并通过虚拟口串口接到了USB_DEBUG中。
在原理图中,也是注明了UART3,IO复用参数为AF7,经查看产品手册的引脚及复用功能,也是对应的AF7:
【代码修改】
1、首先修改 platform.h对调试打印进行宏定义,方便以后修改:
/* DEBUG UART define begin *************************************************/
#define DEBUG_UART UART3
#define DEBUG_UART_TX_PORT GPIOC
#define DEBUG_UART_TX_PIN_SOURC GPIO_PinSource10
#define DEBUG_UART_RCC RCC_APB1Periph_UART3
#define DEBUG_UART_TX_GPIO_RCC RCC_AHBPeriph_GPIOC
#define DEBUG_UART_GPIO_AF GPIO_AF_7
#define DEBUG_UART_TX_PIN GPIO_Pin_10
/* DEBUG UART define end *************************************************/`
2、修改初始化串口函数:
void PLATFORM_InitConsole(uint32_t Baudrate)
{
GPIO_InitTypeDef GPIO_InitStruct;
UART_InitTypeDef UART_InitStruct;
RCC_APB1PeriphClockCmd(DEBUG_UART_RCC, ENABLE);
UART_StructInit(&UART_InitStruct);
UART_InitStruct.BaudRate = Baudrate;
UART_InitStruct.WordLength = UART_WordLength_8b;
UART_InitStruct.StopBits = UART_StopBits_1;
UART_InitStruct.Parity = UART_Parity_No;
UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
UART_InitStruct.Mode = UART_Mode_Tx;
UART_Init(DEBUG_UART, &UART_InitStruct);
UART_Cmd(DEBUG_UART, ENABLE);
RCC_AHBPeriphClockCmd(DEBUG_UART_TX_GPIO_RCC, ENABLE);
GPIO_PinAFConfig(DEBUG_UART_TX_PORT, DEBUG_UART_TX_PIN_SOURC, DEBUG_UART_GPIO_AF);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = DEBUG_UART_TX_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(DEBUG_UART_TX_PORT, &GPIO_InitStruct);
}
3、修改重定向函数:
/***********************************************************************************************************************
* @brief redefine fputc function
* @note for printf
* @param ch
* @param f
* @retval ch
*********************************************************************************************************************/
int fputc(int ch, FILE *f)
{
UART_SendData(DEBUG_UART, (uint8_t)ch);
while (RESET == UART_GetFlagStatus(DEBUG_UART, UART_FLAG_TXC))
{
}
return (ch);
}
这样后,就可以直接使用MM32LINK进行调试输出了。只需要一根USB线就OK,比较方便。
【总结】
此次修改,花费的时间不多,总体代码结构不变,宏定义了串口的参数,这样如果想修改printf的到其他的串口,也只需要对宏定义进行修改,这样就不会漏掉修改的参数。当然还可以能过ifdef来创建多组宏义来,来选择不同的串口输出,这样就会更简单。