打印

GD32F103 108M配置串口乱码解决

[复制链接]
1383|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2015-9-30 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用GD32 108M配置串口的时候出现乱码,于是查找原因。
首先说下108M的时钟配置
根据前人的经验
/*  PLL configuration: PLLCLK = HSE/2 * 30 = 120 MHz */
RCC->CFGR |= (uint32_t)(0x08000000 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL15);
因为GD32的手册里要配置PLLMULL到30倍,用到了CFGR的第27位,所以上面0x08000000把这位置1。
而在STM32里第27位是保留不用的。GD32使用了这个保留位。
但是在串中初始化的时候计算波特率的时候并没有使用第27位,这就倒置计算时候的时候出现了问题,我们看下串口的初始化函数USART_Init
在这个函数里配置波特率的时候用到RCC_GetClocksFreq 这个函数,在进入到这个函数里看下
发现在计算时钟频率的时候是这样子的
/* Get PLL clock source and multiplication factor ----------------------*/
      pllmull = RCC->CFGR & CFGR_PLLMull_Mask; (由于STM32中这里并没有用到第27位)
            .
#ifndef STM32F10X_CL      
      pllmull = ( pllmull >> 18) + 2;
            .
            .
            .
        /* HSE selected as PLL clock entry */
        if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET)
        {/* HSE oscillator clock divided by 2 */
          RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull;
        }
        else
        {
          RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull;
        }
在计算SYSCLK的时候用到PLLMULL,而STM32中CFGR的第27位是保留位,不使用。所以导致计算SYSCLK时出错,在STM32中PLLMULL最大只到16,而GD32中最大到32,
所以在GD23中使用PLLMULL超过16就要小心了。
而108M时候配置PLLMULL是30,超过了16。在STM32里其实PLLMULL是15,正好相差了一倍。

所以在使用GD32串口使用的时候有三种解决方案:

1、使用上面的108M的时钟配置,如果我们串口波特率设置为9600,那么我们在上位机打开串口配置的波特率就应该是9600*2。总之上位机的波特率是MCU的2倍。
2、使用120M的时钟配置,修改上面的108M时钟配置为:
     /*  PLL configuration: PLLCLK = HSE * 15 = 120 MHz */
       RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE | RCC_CFGR_PLLMULL15);
3、我们使用默认的72M时钟配置,啥也不用修改。

致此解决串口乱码问题。

沙发
598330983| | 2015-9-30 16:32 | 只看该作者
频率搞慢点,就更不容易出错。

使用特权

评论回复
板凳
稳稳の幸福| | 2015-9-30 19:46 | 只看该作者
对的,使用默认的能满足就不要乱修改了,完成工作就行了。

使用特权

评论回复
地板
vivilzb1985| | 2015-10-7 16:53 | 只看该作者
这个需要把串口的波特率降低点的看下啊

使用特权

评论回复
5
shenmu2012| | 2015-10-7 17:22 | 只看该作者
一般做好将串口的波特率设置成时钟源频率的公约数的比较好。

使用特权

评论回复
6
shenmu2012| | 2015-10-7 17:22 | 只看该作者
或者是接近公约数的,这样在大数据量传输过程中出现乱码的几率就会很小的。

使用特权

评论回复
7
firstblood| | 2015-10-7 18:06 | 只看该作者
使用108M的频率配置的,对波特率的话就可以用到19200的也可以的

使用特权

评论回复
8
comeon201208| | 2015-10-7 19:02 | 只看该作者
这个波特率的设置很关键。

使用特权

评论回复
9
angerbird| | 2015-10-7 21:10 | 只看该作者
这个采用19200的波特率会比较好些的,,,108000000/19200 =5625

使用特权

评论回复
10
zhangbo1985| | 2015-10-16 19:39 | 只看该作者
这个还是频率跟波特率配置的问题吧

使用特权

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

本版积分规则

212

主题

2427

帖子

7

粉丝