HC32L196 芯片 串口输出 printf

1. 首先 配置 keil 项目 option 

选择 Code Generation ARM Compiler :Use default compiler version 5

2. 取消 Use MicroLIB 选项

3. 在uart 代码中 增加


/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)

/* 定义 _sys_exit() 以避免使用半主机模式 */
void _sys_exit(int x)
{
    x = x;
}

/* 标准库需要的支持类型 */
struct __FILE
{
    int handle;
};

FILE __stdout;

int fputc(int ch, FILE *f)
{
    (void)f;

	Uart_SendDataPoll(M0P_UART3,ch);
	
	return ch;
}

 4. 提供一下完整的uart 配置文件

/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)

/* 定义 _sys_exit() 以避免使用半主机模式 */
void _sys_exit(int x)
{
    x = x;
}

/* 标准库需要的支持类型 */
struct __FILE
{
    int handle;
};

FILE __stdout;

int fputc(int ch, FILE *f)
{
    (void)f;

	Uart_SendDataPoll(M0P_UART3,ch);
	
	return ch;
}

void uart_init(){

	//串口引脚配置
    App_PortInit();
    
    //串口配置
    App_UartCfg();
}

//UART1中断函数
void Uart3_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART3, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(M0P_UART3, UartRC);        //清中断状态位
       
    }

}

//串口引脚配置
void App_PortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    
    DDL_ZERO_STRUCT(stcGpioCfg);
    
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
    
    ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortC, GpioPin7, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortC, GpioPin7, GpioAf6);          //配置PA02 端口为URART1_TX
    
    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortC, GpioPin6, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortC, GpioPin6, GpioAf6);          //配置PA03 端口为URART1_RX
}

//串口配置
void App_UartCfg(void)
{
    stc_uart_cfg_t    stcCfg;

    DDL_ZERO_STRUCT(stcCfg);
    
    ///< 开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart3,TRUE);///<使能uart1模块时钟
    
    ///<UART Init
    stcCfg.enRunMode        = UartMskMode3;          ///<模式3
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskDataOrAddr;           ///<偶检验
    stcCfg.stcBaud.u32Baud  = 9600;                  ///<波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART3, &stcCfg);                   ///<串口初始化
    
    ///<UART中断使能
    Uart_ClrStatus(M0P_UART3,UartRC);                ///<清接收请求
    Uart_ClrStatus(M0P_UART3,UartTC);                ///<清接收请求
	
//	Uart_DisableIrq(M0P_UART1,UartRxIrq);             ///<使能串口接收中断
//  Uart_DisableIrq(M0P_UART1,UartTxIrq);             ///<使能串口接收中断
	
//    Uart_EnableIrq(M0P_UART3,UartRxIrq);             ///<使能串口接收中断
//    Uart_EnableIrq(M0P_UART3,UartTxIrq);             ///<使能串口接收中断    
//    EnableNvic(UART1_3_IRQn, IrqLevel3, TRUE);       ///<系统中断使能

}

以上步骤就可以完成 串口的格式化打印输出

如果还需要串口接收,那么就把 RX 的 中断开启,使能中断 

测试效果:

int i = 0 ;
while(1){

	printf("i:%d \r\n",i++);
	
	delay1ms(1000);
		
		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hotter23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值