【华大 HC32L110】调用`printf`和串口接收中断的冲突问题解决

华大单片机 HC32L110调用printf和串口接收中断的冲突问题解决,经过查找是官方库 去使能了
串口的接收功能,记录解决问题的过程

场景描述: 使能串口接收中断后,未调用 printf 之前,可以正常进接收中断,但是调用 printf 之后,进再也无法进入接收中断了

更多华大单片机的踩坑记录,可参考:
HC32L110入门踩坑记录

1.硬件MCU资料

HC32L110
适用型号:

HC32L110C6PA

HC32L110C6UA

HC32L110C4UA

HC32L110C4PA

HC32L110B6PA

HC32L110B4PA

HC32L110B6YA

网盘下载: https://pan.baidu.com/s/1ZvWNIh5osVosIL8L9xCV3Q 提取码:XYYM

2. printf和串口接收中断的冲突解决

首先,我代码中用的是串口0,IDE 使用的是 keil,调用 printf 函数使用的是微库,在工程属性的 “Target “- >”Code Generation “中勾选 ”Use MicroLIB “
在这里插入图片描述

众所周知,printf 使用微库的 stdio.h 中的接口最终调用了自己写的 fputc 函数,华大官方库的 ddl.c 库中的 fputc 函数是这么写的

以下存在的问题就是:

使能串口接收中断后,未调用 printf 之前,可以正常进接收中断,但是调用 printf 之后,进再也无法进入接收中断了

void Debug_Output(uint8_t u8Data)
{
   
    M0P_UART0->SCON_f.REN = 0; // 华大 ddl 库中的配置
    M0P_UART0->SBUF = u8Data;

    while (TRUE != M0P_UART0->ISR_f.TI)
    {
   
        ;
    }
    M0P_UART0->ICR_f.TICLR = 0;
}

int fputc(int ch, FILE *f)
{
   
    if (((uint8_t)ch) == '\n')
    {
   
        Debug_Output('\r');
    }
    Debug_Output(ch);

    return ch;
}

3.重新封装 fputc 函数

华大官方还有一个函数接口,若重新封装 fputc 函数,则可以正常 printf 之后还能进入接收中断

main 函数中重写函数:

extern int fputc_reverse(int ch,
  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

积跬步、至千里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值