打印
[综合信息]

华大MCU HC32L136芯片 使用printf输出

[复制链接]
2013|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yy_yanyu|  楼主 | 2020-6-9 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yy_yanyu 于 2020-7-8 11:04 编辑

#include "bsp_uart.h"   
/*
ddl.c .h 中编译器报错重复的函数语句删除掉。mian.c 中添加#include "stdio.h"
UART初始化的时候一定一定一定要把发送完成中断关闭。//Uart_EnableIrq(M0P_UART0,UartTxIrq);             ///<使能串口接收中断
*/
//加入以下代码,支持printf函数,而不需要选择use MicroLIB         
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
int _sys_exit(int x)
{
        x = x;
    return x;
}
int fputc(int ch, FILE *f)//重定义fputc函数
{      
    M0P_UART0->SCON_f.REN = 1;//M0P_UART0->SCON_f.REN = 0;//修改  0的时候就接受不到数据了..
    M0P_UART0->SBUF = (uint8_t) ch;  
    while (TRUE != M0P_UART0->ISR_f.TC){;}
    M0P_UART0->ICR_f.TCCF = 0;
        return ch;
}
#endif

void App_UART0_Init(uint32_t bound)////App_UART0_Init(115200); 根据自己单片机进行修改
{
// Test uart PB06_UART0_TXD  PB07_UART0_RXD
    stc_gpio_cfg_t    stcGpioCfg;
    stc_uart_cfg_t    stcCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);
    DDL_ZERO_STRUCT(stcCfg);
//串口引脚配置
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///<使能uart1模块时钟
    ///<PB06_UART0_TXD
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin6, GpioAf2);          //配置PA02 端口为URART1_TX

    ///<PB07_UART0_RXD
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin7, GpioAf2);          //配置PA03 端口为URART1_RX
//串口配置
    ///<UART Init
    stcCfg.enRunMode        = UartMskMode3;          ///<模式3
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskEven;           ///<偶检验
    stcCfg.stcBaud.u32Baud  = bound;                  ///<波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART0, &stcCfg);                   ///<串口初始化

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART0,UartRC);                ///<清接收请求
    Uart_ClrStatus(M0P_UART0,UartTC);                ///<清接收请求
    Uart_EnableIrq(M0P_UART0,UartRxIrq);             ///<使能串口接收中断
    //Uart_EnableIrq(M0P_UART0,UartTxIrq);             ///<使能串口接收中断
    EnableNvic(UART0_IRQn, IrqLevel3, TRUE);       ///<系统中断使能

}
//UART0中断函数
void Uart0_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART0, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(M0P_UART0, UartRC);        //清中断状态位
        Uart_ReceiveData(M0P_UART0);   //接收数据字节
    }

    if(Uart_GetStatus(M0P_UART0, UartTC))         //UART1数据发送
    {
        Uart_ClrStatus(M0P_UART0, UartTC);        //清中断状态位
    }

}



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
App_UART0_Init(115200);
    printf("UART Test 115200\r\n");
    //delay1ms(300);
    printf("123456\r\n");
    printf("789\r\n");

    printf("T1 %d\r\n",123);
    printf("T2 %X\r\n",123);
    printf("T3 %s\r\n","123456");

~~~~~~~~~~~~~~~~~~~~~~
串口调试助手  115200  N 8 1  Even校验
UART Test 115200
123456
789
T1 123
T2 7B
T3 123456
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2020年6月10日15:54:02    如果调试有问题可以回复或者发邮件给我  yy_yanyu@126.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上面的程序不能打印输出汉字,打印输出汉字应该需要设置“Target”-“USE Micro LIB”那个库,百度一下。没时间弄。
最近发现这个芯片的串口有BUG,正常找原因。





使用特权

评论回复
沙发
heimaojingzhang| | 2020-7-7 16:16 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
板凳
keaibukelian| | 2020-7-7 16:17 | 只看该作者
调试过程中有需要注意的地方吗

使用特权

评论回复
地板
labasi| | 2020-7-7 16:17 | 只看该作者
楼主方便提供一下硬件图吗

使用特权

评论回复
5
paotangsan| | 2020-7-7 16:17 | 只看该作者
感谢分享代码

使用特权

评论回复
6
renzheshengui| | 2020-7-7 16:17 | 只看该作者
楼主辛苦了

使用特权

评论回复
7
gaoyang9992006| | 2020-7-31 08:53 | 只看该作者
多谢分享,重定向printf。也可以试试移植RTT操作系统。

使用特权

评论回复
8
火火火火豁| | 2021-1-26 14:18 | 只看该作者
本帖最后由 火火火火豁 于 2021-1-26 14:32 编辑

感谢楼主————但我用野火的串口调试助手,115200时接收到的数据都是乱码,115200以下没错,为啥会这样啊?

使用特权

评论回复
9
kcfoo1| | 2021-1-27 12:24 | 只看该作者
火火火火豁 发表于 2021-1-26 14:18
感谢楼主————但我用野火的串口调试助手,115200时接收到的数据都是乱码,115200以下没错,为啥会这样啊 ...

用的是内部4m频率?

使用特权

评论回复
10
martinhu| | 2021-1-27 13:56 | 只看该作者
什么bug?

使用特权

评论回复
11
七毛钱| | 2021-1-27 14:09 | 只看该作者
在调试过程有需要特别注意的地方吗

使用特权

评论回复
12
火火火火豁| | 2021-1-27 16:08 | 只看该作者
kcfoo1 发表于 2021-1-27 12:24
用的是内部4m频率?

PA02_UART1_TXD
PA03_UART1_RXD

我就改了这两个引脚相关的,别的和上面的程序一样

使用特权

评论回复
13
kcfoo1| | 2021-1-28 16:12 | 只看该作者
火火火火豁 发表于 2021-1-27 16:08
PA02_UART1_TXD
PA03_UART1_RXD


官方例程用的是4m,波特率误差太大,只能用较低波特率,改为16m就可以了

使用特权

评论回复
14
ZG11211| | 2021-1-31 17:02 | 只看该作者
将原工程文件夹下的main.c单独用UE或者其它文本编辑器打开,另存时选择ANSI格式保存并替换原文件,再打开工程项目重新编译后即可,估计是工程模板创建时的BUG,没考虑国人感受

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

0

粉丝