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

[复制链接]
4693|16
 楼主| xsophiax 发表于 2015-8-28 15:38 | 显示全部楼层 |阅读模式
本帖最后由 xsophiax 于 2015-8-31 10:44 编辑

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

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

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

来怎么调。

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

1. 采用如下CODE,加入到官方的Demo程序里进行调试验证。
  1. void NVIC_Config()
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5.    
  6.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
  7.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  8.     NVIC_InitStructure.NVIC_IRQChannel  = USART1_IRQn;
  9.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.         
  11.     NVIC_Init(&NVIC_InitStructure);
  12. }
  13. void USART_Gpio_Config(void)
  14. {
  15.     GPIO_InitTypeDef GPIO_InitStructure;
  16.    
  17.     RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE);
  18.    
  19.     //PB6->TX  PB7->Rx
  20.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  22.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  23.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  24.    
  25.     GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
  26.     GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
  27. }

  28. void USART_Config(void)
  29. {
  30.     USART_Gpio_Config();
  31.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  32.     USART_InitTypeDef USART_InitStructure;

  33.     USART_InitStructure.USART_BaudRate = 115200;
  34.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  35.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  36.     USART_InitStructure.USART_Parity = USART_Parity_No;
  37.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  38.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  39.    
  40.     USART_Init(USART1,&USART_InitStructure);   
  41.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  42.    
  43.     USART_Cmd(USART1,ENABLE);   
  44. }

  45. void USART1_IRQHandler(void)
  46. {
  47.     char c;
  48.     if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
  49.     {
  50.         c = USART_ReceiveData(USART1);
  51.         USART_SendData(USART1,c);
  52.     }
  53. }

  54. int main(void)
  55. {
  56.     NVIC_Config();
  57.     USART_Config();

  58.     while(1)
  59.     {
  60.         while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  61.         USART_SendData(USART1,0x55);

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

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

收到的乱数据

收到的乱数据


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

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

抓开发板发送的数据

抓开发板发送的数据


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

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

clock

clock


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

5.底板
8.PNG


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

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的,不同的晶振是需要在程序里面修改的。
yangxijun1992 发表于 2015-8-28 16:36 | 显示全部楼层
xsophiax 发表于 2015-8-28 16:13
哪根信号线呢,求指点。

也有可能是你串口调试助手的波特率和程序里面的波特率不一样,
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
 楼主| 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了,这是为什么呢?
6.PNG
也不行的,还是不对。不过现在收到的数据变成 0x15 0x55了。




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

修改后,数据依然跟原来一样样.....
mintspring 发表于 2015-8-28 18:05 | 显示全部楼层
这么多天都没弄好,我也是醉了。
湛只为无双 发表于 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)
yiyigirl2014 发表于 2015-8-28 18:21 | 显示全部楼层
你用的晶振是哪个?8M的还是25M的,不同的晶振是需要在程序里面修改的。需要选择一下。
mmuuss586 发表于 2015-8-28 18:37 | 显示全部楼层

系统时钟倍频不对;
迪卡 发表于 2015-8-30 21:36 | 显示全部楼层
串口调试助手的波特率和程序里面的波特率一致吗
 楼主| xsophiax 发表于 2015-8-31 10:40 | 显示全部楼层
mintspring 发表于 2015-8-28 18:05
这么多天都没弄好,我也是醉了。

我已解决,请参考。
 楼主| xsophiax 发表于 2015-8-31 10:41 | 显示全部楼层
mmuuss586 发表于 2015-8-28 18:37
系统时钟倍频不对;

是对的。
 楼主| xsophiax 发表于 2015-8-31 10:41 | 显示全部楼层
迪卡 发表于 2015-8-30 21:36
串口调试助手的波特率和程序里面的波特率一致吗

一致
mintspring 发表于 2015-9-4 22:04 | 显示全部楼层
楼主还是很强大的,能力很强。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部