使用 PB8-TX,PB9-RX 实现uart输出log信息,废话不多说直接上代码!
#include "ddl.h"
#include "uart.h"
#include "gpio.h"
#include <stdio.h>
void App_UartCfg(uint32_t baud);
void App_PortInit(void);
void App_LedInit(void);
int32_t main(void)
{
Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
Sysctrl_SetPCLKDiv(SysctrlPclkDiv1);
App_PortInit();
App_UartCfg(115200);
App_LedInit();
while(1)
{
printf("--->uart test\r\n");
Gpio_SetIO(STK_LED_PORT, STK_LED_PIN); //点亮LED
delay1ms(1000);
Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN); //熄灭LED
delay1ms(1000);
}
return 0;
}
//串口引脚配置
void App_PortInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //使能GPIO模块时钟
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortB, GpioPin8, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin8, GpioAf7); //配置PB08 端口为URART0_TX
///<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortB, GpioPin9, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin9, GpioAf7); //配置PB09 端口为URART0_RX
}
//串口配置
void App_UartCfg(uint32_t baud)
{
stc_uart_cfg_t stcCfg;
uint32_t u32Pclk;
DDL_ZERO_STRUCT(stcCfg);
///< 开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0, TRUE); ///<使能uart0模块时钟
u32Pclk = Sysctrl_GetPClkFreq();
if(u32Pclk == 0)
{
while(1); // 时钟错误处理
}
///<UART Init
stcCfg.enRunMode = UartMskMode1; ///<模式1
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.stcBaud.u32Baud = baud; ///<波特率
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = u32Pclk; ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化
}
void App_LedInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
///< 打开GPIO外设时钟门控
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
stcGpioCfg.enDir = GpioDirOut;
///< 端口上下拉配置->下拉
stcGpioCfg.enPu = GpioPuDisable;
stcGpioCfg.enPd = GpioPdEnable;
///< LED关闭
Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
///< GPIO IO LED端口初始化
Gpio_Init(STK_LED_PORT, STK_LED_PIN, &stcGpioCfg);
}
int fputc(int ch, FILE* f)
{
Uart_SendDataPoll(M0P_UART0, ch);
return (ch);
}
注意点:一定要看复用表的对应关系,选择你原理图对应的TX,RX引脚的复用组。