本文主要是介绍串口打印函数引起芯片工作异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在调试供应商提供的SDK源码时发现,在某个初始化函数中添加printf
函数打印调试信息会导致原本正常工作的芯片无法工作。在其他函数使用printf
函数则不会出现该问题,说明串口功能的配置以及printf
函数的重定向均没有问题。
经过在线调试发现,程序卡死在printf
函数重定向中判断串口标志位的while
循环中,因此导致其他功能为正常工作。
int fputc(int ch, FILE *f)
{/* 将printf内容发往串口 */USART_SendData(USART1, (unsigned char) ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 卡死位置return (ch);
}
据此判断,该问题的出现跟串口有关。回到main
函数时猛然发现如下代码:
int main()
{// ...dev_init(); // 在函数中添加printf函数就会导致上述问题usart_config();printf("demo application starting ... \r\n");while(1){// ...}
}
好家伙~原来是因为在串口初始化完成之前调用了dev_init();
函数,正是在dev_init();
函数中调用printf
函数导致芯片工作异常。原因是显而易见的,是因为在串口初始化完成之前调用了串口输出函数,相应的串口标志位一直为RESET
,导致程序陷入死循环。问题找到了,解决方案也自然明了了,将dev_init();
函数调整到usart_config();
后面即可。
【敲黑板】
- 串口相关函数自身(如
printf
函数)及其调用者(如本文中的dev_init();
函数)应当在串口初始化完成之后被调用。 - 不要因为是原厂提供的SDK就默认其代码是没有问题的。
这篇关于串口打印函数引起芯片工作异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!