打印
[STM32F4]

《STM32F429I之USART1-波特率不对问题调试》

[复制链接]
4182|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xsophiax 于 2015-8-31 10:44 编辑

采用STM32F429I进行串口通信测试验证,因为初学这个,采用都是网上成熟的CODE验证,首先使用跳线把Tx/Rx短接

上,数据都正确,而后采用串口助手接收,发现不管弄,感觉串口波特率就是不对,后面使用示波器抓线上的数据,

发现是对的(后面有图),但是其波特率差异就有点大(没有修改过开发板的任何部件),现在想请教各位大侠,接下

来怎么调。

【此问题已解决,后面有就此问题的解决步骤及其途径,期望对大家有点作用,在此感谢关注此贴的人,谢谢!】。

1. 采用如下CODE,加入到官方的Demo程序里进行调试验证。
void NVIC_Config()
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
   
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
    NVIC_InitStructure.NVIC_IRQChannel  = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        
    NVIC_Init(&NVIC_InitStructure);
}
void USART_Gpio_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE);
   
    //PB6->TX  PB7->Rx
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
}

void USART_Config(void)
{
    USART_Gpio_Config();
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    USART_InitTypeDef USART_InitStructure;

    USART_InitStructure.USART_BaudRate = 115200;
    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_ITConfig(USART1,USART_IT_RXNE,ENABLE);
   
    USART_Cmd(USART1,ENABLE);   
}

void USART1_IRQHandler(void)
{
    char c;
    if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
    {
        c = USART_ReceiveData(USART1);
        USART_SendData(USART1,c);
    }
}

int main(void)
{
    NVIC_Config();
    USART_Config();

    while(1)
    {
        while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
        USART_SendData(USART1,0x55);

        while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
        USART_SendData(USART1,0xAA);

        Delay_us(1000);
    }
}
​2. 持续的发送0x55AA,采用串口助手收数据,收到的数据完全与0x55AA不搭边(0xB5 0x35)。


【分析】上图显示是波特率不对的,然后查发现HSE_VALUE 为25M晶振配置(这是网上Down的【STM32F429I-Discovery_FW_V1.0.1】,没有进行任何修改),再查是否还有其它地方也要修改的,发现PLL_M也要修改为8.

3.而采用示波器抓取的数据如下图所示:


【分析】通过上图分析得出波特率为106666bps,明显不对。大家看出来了么,这是TTL电平呀。

4.时钟&串口寄存器信息


【分析】如果采用的外部8M的晶振,CLK取值就应该和上面一样的,如果不一样的亲们,请注意了。

5.底板



【分析】这部分接线要注意了,因为板子出去的TTL电平,直接连到串口上Tx/Rx是不对的,因为串口是RS232电平。所以需要一个电平转换IC。我之前就是没有注意这块,所以搞错了,这贴出分析,希望大家不要再走弯路,费时费脑。。

5.PNG (31.69 KB )

usart

usart
沙发
yangxijun1992| | 2015-8-28 16:08 | 只看该作者
可能是信号线的问题

使用特权

评论回复
板凳
xsophiax|  楼主 | 2015-8-28 16:13 | 只看该作者
yangxijun1992 发表于 2015-8-28 16:08
可能是信号线的问题

哪根信号线呢,求指点。

使用特权

评论回复
地板
湛只为无双| | 2015-8-28 16:36 | 只看该作者
你用的晶振是哪个?8M的还是25M的,不同的晶振是需要在程序里面修改的。

使用特权

评论回复
5
yangxijun1992| | 2015-8-28 16:36 | 只看该作者
xsophiax 发表于 2015-8-28 16:13
哪根信号线呢,求指点。

也有可能是你串口调试助手的波特率和程序里面的波特率不一样,

使用特权

评论回复
6
vivisph| | 2015-8-28 16:44 | 只看该作者
本帖最后由 vivisph 于 2015-8-28 16:46 编辑

从波形看,明显是你发的不对,第一帧还没发完就被下一帧打断了。把程序改成这样试试:
USART_SendData(USART1, 0xaa);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}

while这句是来判断数据是否发送完成的,放在下面比较好,而且标志位用的是USART_FLAG_TC

使用特权

评论回复
7
xsophiax|  楼主 | 2015-8-28 16:59 | 只看该作者
本帖最后由 xsophiax 于 2015-8-28 17:49 编辑
湛只为无双 发表于 2015-8-28 16:36
你用的晶振是哪个?8M的还是25M的,不同的晶振是需要在程序里面修改的。

:$
1.外部不就是只有一个晶振(8M的)么?另外在PRJ里也配置为8M。  (这个修改了两个地方,HSE_VALUE = 8M, PLL_M = 8)
2.在RCC_GetClocksFreq这个函数里,我跟到tmp=8了,这是为什么呢?

也不行的,还是不对。不过现在收到的数据变成 0x15 0x55了。




使用特权

评论回复
8
xsophiax|  楼主 | 2015-8-28 17:09 | 只看该作者
vivisph 发表于 2015-8-28 16:44
从波形看,明显是你发的不对,第一帧还没发完就被下一帧打断了。把程序改成这样试试:
USART_SendData(USAR ...

修改后,数据依然跟原来一样样.....

使用特权

评论回复
9
mintspring| | 2015-8-28 18:05 | 只看该作者
这么多天都没弄好,我也是醉了。

使用特权

评论回复
10
湛只为无双| | 2015-8-28 18:15 | 只看该作者
xsophiax 发表于 2015-8-28 16:59
1.外部不就是只有一个晶振(8M的)么?另外在PRJ里也配置为8M。  (这个修改了两个地方,HSE_VALUE = 8M,  ...

那你的HSE_VALUE=8M 还是HSE_VALUE ((uint32_t)8000000)

使用特权

评论回复
11
yiyigirl2014| | 2015-8-28 18:21 | 只看该作者
你用的晶振是哪个?8M的还是25M的,不同的晶振是需要在程序里面修改的。需要选择一下。

使用特权

评论回复
12
mmuuss586| | 2015-8-28 18:37 | 只看该作者

系统时钟倍频不对;

使用特权

评论回复
13
迪卡| | 2015-8-30 21:36 | 只看该作者
串口调试助手的波特率和程序里面的波特率一致吗

使用特权

评论回复
14
xsophiax|  楼主 | 2015-8-31 10:40 | 只看该作者
mintspring 发表于 2015-8-28 18:05
这么多天都没弄好,我也是醉了。

我已解决,请参考。

使用特权

评论回复
15
xsophiax|  楼主 | 2015-8-31 10:41 | 只看该作者
mmuuss586 发表于 2015-8-28 18:37
系统时钟倍频不对;

是对的。

使用特权

评论回复
16
xsophiax|  楼主 | 2015-8-31 10:41 | 只看该作者
迪卡 发表于 2015-8-30 21:36
串口调试助手的波特率和程序里面的波特率一致吗

一致

使用特权

评论回复
17
mintspring| | 2015-9-4 22:04 | 只看该作者
楼主还是很强大的,能力很强。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝