华大单片机
HC32L110
调用printf
和串口接收中断的冲突问题解决,经过查找是官方库 去使能了
串口的接收功能,记录解决问题的过程
目录
- 1.硬件MCU资料
- 2. printf和串口接收中断的冲突解决
- 3.重新封装 fputc 函数
- 4.查找问题,发现是官方库配置有误
- 5. 查找寄存器手册,修改寄存器配置
- 6. 修改 Debug_Output 函数,问题得以解决
- 7.串口0初始化代码,模式1
场景描述: 使能串口接收中断后,未调用 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