热度 3
2012-5-18 21:01
5249 次阅读|
0 个评论
在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,但是把.hex文件烧写进板子后却发现串口接收不到任何数据。用Keil仿真是,串口可以正确的输出。有点纳闷,然后调用USART_SendData()函数,发现串口可以接收到正确的数据,证明串口配置没有问题,问题应该是出在printf()函数上,参照ST公司的printf例子也不能在串口输出数据。由此可知应该是软件配置的原因。后面,百度,再AVR论坛上找到了答案。 如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选” Use MicroLIB “ 进行如上设置后编译一下,串口输出正确的数据。 /*************************************************************************************** *说明:用于STM32F10XXX串口UART1通讯,可以将printf scanf等重定向到串口 *环境:KEIL FOR ARM MDK3.11 *硬件:对应PA9-UART1TX PA10-UART1RX,使用USART1 *版本:V0.1 *作者:alien2006 *备注:对应的PA9/PA10以及USART1已由UART_Init函数自身初始化,无需在程序中完成 ***************************************************************************************/ #ifndef __UART_INTERFACE_H #define __UART_INTEFFACE_H #include "stm32f10x_lib.h" #include "stdio.h" /*私有变量----------------------------------------------------------------------------*/ /*函数声明----------------------------------------------------------------------------*/ void UART_Init(unsigned long UART_baud); //波特率,如115200 int fputc(int ch, FILE *f); //fputc重定向 int fgetc(FILE *f); //fgetc重定向 #endif 下面是.C的部分内容,省去了初始化的部分,自己看着写好了 /******************************************************************************* * Function Name : int fputc(int ch, FILE *f) * Description : Retargets the C library printf function to the USART.printf重定向 * Input : None * Output : None * Return : None *******************************************************************************/ int fputc(int ch, FILE *f) { /* Write a character to the USART */ USART_SendData(USART1, (u8) ch); /* Loop until the end of transmission */ while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET)) { } return ch; } /******************************************************************************* * Function Name : int fgetc(FILE *f) * Description : Retargets the C library printf function to the USART.fgetc重定向 * Input : None * Output : None * Return : 读取到的字符 *******************************************************************************/ int fgetc(FILE *f) { /* Loop until received a char */ while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)) { } /* Read a character from the USART and RETURN */ return (USART_ReceiveData(USART1)); } 科技成就生活,创新源自智拓 www.ourjcdz.com