STM32F407的USART1只能映射到PB6-7,如果选择PA9-10就乱码

2019-07-14 17:03发布


    完成1个工程项目设计,使用STM32F407VGT6芯片,USART1选用了PA9,PA10,板子完成后串口调试总是过不了。不得已使用STM32F4-DISCOVERY通过RS232电平转换连接到PC机串口进行RS232通讯验证。
    首先使用GPIOA-PA9,PA10映射USART1,初始化代码如下:
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = bound;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
       USART_Init(USART1, &USART_InitStructure);
       USART_Cmd(USART1, ENABLE);

     PC机方使用SSCOM,通讯结果是一片乱码。
   后改用PB6,PB7映射USART1,修改相关语句:
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //对不起12楼,我粘贴错了
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);


        GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

       USART初始化相同,不重复了。


从PB口进行,通讯结果一切正常,
查看手册:USART1可以映射到PA9,PA10或PB6,PB7,手册并未特别说明两者使用在USART1有何区别或初始化时需要做何特殊处理。百思不得其解。由于PCB版图已经制作完成,使用PA了口,现在如果从软件方面无法纠正将造成不少的浪费。
由于工程板与STM32F4-DISCOVERY板的PA口在USART1工作时出现同样故障,2片板的PA口同时损坏的机率很小,并且2片板的PA9,PA10配置为非USART1模式时工作均正常。
希望得到专家的解答。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
TOPCB
1楼-- · 2019-07-16 12:05
现在用排除法来判断,先通过短接A9 A10,自测收发数据是否正常。
通过代码配置,没有4XX的板子帮忙测试。只能通过代码分析,也可以参考网友用STM32CubeMX测试一下。
318lxy
2楼-- · 2019-07-16 15:05
时钟打开了么
ctwewer
3楼-- · 2019-07-16 19:31
318lxy 发表于 2018-10-10 23:11
时钟打开了么

由于我是在同一块板上只改变PA和PB口来连接USART1,PB口工作正常,PA口也可以发送,只不过错码,时钟肯定是打开的,没有打开是无法发送的。
ctwewer
4楼-- · 2019-07-16 22:40
 精彩回答 2  元偷偷看……
maggie1
5楼-- · 2019-07-17 01:44
1。首先确认一下,初始化的都初始化了,ST的库函数,真正使用起来,很少使用断言函数来检查其输入的有效性,这就要求你除非你定义的是静态变量,否则,一定要是其处于你的可控状态。
2.既然楼主都说了,是乱码,那证明数据是有发送出来,那就看一下,是不是因为缺省了某些东西造成初始化的结果不理想。进入调试模式,一看便有结论
3.不要太相信库函数,即便是一行代码都有可能存在BUG,何况一堆,哈哈 希望对楼主有所帮助
ctwewer
6楼-- · 2019-07-17 03:40
本帖最后由 wenyangzeng 于 2015-7-6 09:50 编辑

发现STM32F4-DISCOVERY的PA口数据出错后,认为还是用数据来说话。临时编写一段代码,每隔0.1秒从发送端发送一次0x55,然后用示波器来观察数据发送状况。
    先在正常的PB口测试,结果见图1。

            图1  STM32F4-DISCOVERY PB口正常的发送波形
    而从非正常的PA口发送,结果见图2.

  图2  STM32F4-DISCOVERY PA口非正常的发送波形
    可以看到从PA口发送的数据严重变形,当然出现错码。查STM32F4-DISCOVERY手册,PA9,PA10是可以映射到USART1的,见图3。但是查看原理图,发现PA9在STM32F4-DISCOVERY板上已经外挂了不少外设,让它工作在USART1,不把这些外设断开肯定不行的。

       图3  STM32F4-DISCOVERY PA口说明         



                图4  STM32F4-DISCOVERY PA9
    从以上实验可以得出第一个结论:
    关于在STM32F4-DISCOVERY上使用PA口工作在USARU1不成功的原因是由于PA9上已经外挂了其他外设,发送端发送的数据在低电平时被这些外设拉高,从而出现图2所示非正常波形而导致通讯失败。
    教训:花点时间读读手册是很有用的,如果先读了手册再来调试,就不会走那么多弯路,时间反而会节省不少。
    接下来还要解决工程板的故障,才是最终目的。
同样对工程板的USART1发送端进行测试,发送0X55时的波形见图5,从图5中我们可以看出,发送的波形基本是正常的,但周期确比图2(3.8格)的要短(3.4格)。

  图5 工程板的波形
   可见工程板工作不正常的原因是波特率偏高了。本例中波特率设定为9600,于是试将工程板的波特率降低看看,当降到9000时,USART的工作竟然正常了。天哪:竟然误差16%。先看看晶振再说。
图6  STM32F4-DISCOVERY上的晶振频率8.00063 MHZ

图7 工程板上的晶振频率 8.00065 MHZ
    晶振误差很小呀!这16%的波特率误差从何而来一时无法理解,如果找到原因一定再贴上来与大家分享。哪位网友有高招也欢迎赐教。
结论2:工程板上的通讯乱码是由于波特率误差太大所引起的,但同样的配置,误差达到16%确实从来没遇到过。而当在用 STM32F4-DISCOVERY验证时,恰好也是PA口的外挂引起工作不正常,让我误认为STM32F407的PA口用在USART1上会有问题,才有本帖的主题出现,按理应该改成《STM32F407 串行通讯USART1故障排除一例》,算了,就保持原来的也无妨。

一周热门 更多>