雨果喝水 发表于 2021-9-28 20:51

华大单片机HC32L136实现printf

一、华大的库
hc32l13x_ddl_Rev1.9.2 Lite
1.打开 hc32l13x_ddl_Rev1.9.2 Lite\driver\src\ddl.c 约208行
#if defined (__CC_ARM)          //KEIL
#pragma import(__use_no_semihosting)
void _sys_exit(int x)
{
    x = x;
}
struct __FILE
{
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef?d in stdio.h. */
FILE __stdout;

#endif

#ifdef __DEBUG
/**
******************************************************************************
** \briefRe-target putchar function
******************************************************************************/
int fputc(int ch, FILE *f)
{

    if (((uint8_t)ch) == '\n')
    {
      Debug_Output('\r');
    }
    Debug_Output(ch);

    return ch;
}
#endif


雨果喝水 发表于 2021-9-28 20:52

修改fputc函数

雨果喝水 发表于 2021-9-28 20:52

int fputc(int ch, FILE *f)
{
        Uart_SendDataPoll(M0P_UART0,ch);        
    return ch;
}

雨果喝水 发表于 2021-9-28 20:53

二、初始化串口

只是要串口0就行,和上面的fputc要对应.由于hc32l136k8有多pin都可以配置为串口0,所以用宏来定义,决定用哪个pin。
新建usart.h
//#define DEBUG_UART0_B6B7          //测试成功
#define DEBUG_UART0_B8B9            //测试成功
//#define DEBUG_UART0_A9A10         //测试成功

雨果喝水 发表于 2021-9-28 20:54

三个pin随便用一个

usart.c//串口引脚配置
void UART0_PortInit(void)
{
        stc_gpio_cfg_t stcGpioCfg;
    DDL_ZERO_STRUCT(stcGpioCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
    stcGpioCfg.enDir = GpioDirOut;       
#if defined(DEBUG_UART0_B6B7)                       
    Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin6, GpioAf2);          //配置Pb6 端口为 010 ---- UART0_TXD UART0模块TXD信号       
#elif defined(DEBUG_UART0_B8B9)
        Gpio_Init(GpioPortB, GpioPin8, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin8, GpioAf7);          //配置Pb8 端口为 ---- UART0_TXD UART0模块TXD信号       
#elif defined(DEBUG_UART0_A9A10)
        Gpio_Init(GpioPortA, GpioPin9, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin9, GpioAf1);   
#endif
       
    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
#if defined(DEBUG_UART0_B6B7)               
    Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin7, GpioAf2);          //配置Pb7 端口010 ---- UART0_RXD UART0模块RXD信号
#elif defined(DEBUG_UART0_B8B9)
        Gpio_Init(GpioPortB, GpioPin9, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin9, GpioAf7);          //配置Pb9 端口 ---- UART0_RXD UART0模块RXD信号                       
#elif defined(DEBUG_UART0_A9A10)
        Gpio_Init(GpioPortA, GpioPin10, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin10, GpioAf1);
#endif       
               
}

雨果喝水 发表于 2021-9-28 20:54

三、测试
int32_t main(void)
{
        UART0_PortInit();
        Uart0Cfg(38400);
        printf("HC32L136K8TA-MINI \r\n");
        while(1)
        {
                printf("+++......\r\n");
                delay1ms(1000);
        }
}


雨果喝水 发表于 2021-9-28 20:57

kkzz 发表于 2021-10-2 15:57

printf的声明如下:

int printf(const char *format, ...);

hudi008 发表于 2021-10-2 15:57

在C语言中,变参函数的声明是放在atdarg.h标准库中的

lzmm 发表于 2021-10-2 15:58

#include<stdin.h>

minzisc 发表于 2021-10-2 15:58

rintf(char* ForMat,...)

selongli 发表于 2021-10-2 15:59

标准库中的printf 函数原型   

fentianyou 发表于 2021-10-2 15:59

自己实现printf函数

xiaoyaodz 发表于 2021-10-2 15:59

这个重映射了吗   

febgxu 发表于 2021-10-2 16:00

fput这个代码吗?   

sdlls 发表于 2021-10-2 16:00

做一个简单的类似于printf的实现

pixhw 发表于 2021-10-2 16:00

如何实现Printf()

jimmhu 发表于 2021-10-4 22:19

需要重新映射吗   

cemaj 发表于 2021-10-4 22:19

好像是fput重新写就行。   

youtome 发表于 2021-10-4 22:19

用studio.h   
页: [1] 2
查看完整版本: 华大单片机HC32L136实现printf