STM32 printf 重定向 usart3

jiause

问题描述:

      今天调试串口,首先用串口1 printf打印输出,调试成功,在串口1成功的基础上,准备改用串口3 printf结果一直不成功。

串口没有一点反应。

解决过程:

        1.时钟问题 : USART1 和 USART3 挂接的时钟不同

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能GPIOB,USART3

       2.重定向函数 参考正点原子USART1

//加入代码,支持printf函数。并且不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要支持的函数            
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
	while((USART3->SR&0X40)==0);
    USART3->DR = (u8) ch;      
	return ch;
}
#endif 

            3.一般情况下初始化配置没出错,就可以使用printf打印输出了

            4.本人在1和2都没有问题的情况下,串口调试助手还没有输出,最后检查发现问题是线接错了

                                                           STM32 printf 重定向 usart3_第1张图片 

           之前一直使用的USAT1,STM32开发板可以使用usb线和PC通信,换成USART3之后就需要使用PB11和PB10与PC通信,USART3与COM3 在开发板上应该是用跳线帽短接的,所以可以通过USB转串口线进行两者之间的通信,或者去掉跳线帽使用USB转TTL直接接上PB11和PB10.

          5.实际今天遇到的问题是比较简单的,只是自己疏忽了,写出来提醒一下大家

 

 

你可能感兴趣的:(STM32)