问题描述:
今天调试串口,首先用串口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都没有问题的情况下,串口调试助手还没有输出,最后检查发现问题是线接错了
之前一直使用的USAT1,STM32开发板可以使用u***线和PC通信,换成USART3之后就需要使用PB11和PB10与PC通信,USART3与COM3 在开发板上应该是用跳线帽短接的,所以可以通过USB转串口线进行两者之间的通信,或者去掉跳线帽使用USB转TTL直接接上PB11和PB10.
5.实际今天遇到的问题是比较简单的,只是自己疏忽了,写出来提醒一下大家
问题描述:
今天调试串口,首先用串口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都没有问题的情况下,串口调试助手还没有输出,最后检查发现问题是线接错了
之前一直使用的USAT1,STM32开发板可以使用u***线和PC通信,换成USART3之后就需要使用PB11和PB10与PC通信,USART3与COM3 在开发板上应该是用跳线帽短接的,所以可以通过USB转串口线进行两者之间的通信,或者去掉跳线帽使用USB转TTL直接接上PB11和PB10.
5.实际今天遇到的问题是比较简单的,只是自己疏忽了,写出来提醒一下大家
举报