GD32F103 HSI 时钟上不了108MHZ,为啥?

[复制链接]
4236|13
 楼主| apachectl 发表于 2016-10-5 21:42 | 显示全部楼层 |阅读模式
用的固件库:
**
  ******************************************************************************
  * @file    system_GD32f10x.c
  * @author  MCU SD
  * @version V1.0.1
  * @date    6-Sep-2014
  * @brief   CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.
  ******************************************************************************
  */

都没有改:只是修改了:
* Uncomment the corresponding line to configure system clock that you need  */
/* The clock is from HSE oscillator clock  */
//#define SYSCLK_FREQ_HSE    HSE_VALUE
//#define SYSCLK_FREQ_24MHz  24000000
//#define SYSCLK_FREQ_36MHz  36000000
//#define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
//#define SYSCLK_FREQ_72MHz  72000000
//#define SYSCLK_FREQ_96MHz  96000000
//#define SYSCLK_FREQ_108MHz  108000000

/* Uncomment the corresponding line to configure system clock that you need  */
/* The clock is from HSI oscillator clock  */
//#define SYSCLK_FREQ_48MHz_HSI  48000000
//#define SYSCLK_FREQ_72MHz_HSI  72000000
#define SYSCLK_FREQ_108MHz_HSI  108000000

结果我测试:systick时,按理说,设置10ms一中断,需要:
SysTick_Config(108000000/100)                //10ms  108000000/100
而实际,必须设置成:
SysTick_Config(480000)
也就是说,系统跑在48M的主频上,运行测试,和stm32f030跑48M  的程序速度差不多,证实在48M上,这GD32不是在坑爹么。全部程序费了N大劲全部移植过来(可恶的库函数和stm32的完全不一样,得一个一个的对名称);

有谁知道什么情况么?
 楼主| apachectl 发表于 2016-10-5 21:44 | 显示全部楼层
  1. static void SetSysClockTo108HSI(void)
  2. {
  3.   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  4.   
  5.   /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/   

  6.     /* AHB = CK_SYS not divided */
  7.     RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
  8.       
  9.     /* APB2 = AHB not divided */
  10.     RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
  11.    
  12.     /* APB1 = AHB is divided 2 */
  13.     RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;

  14.     /* Configure PLLs ------------------------------------------------------*/
  15.    
  16.     /* PLL configuration: PLLCLK = (HSI/2) * 27 = 108 MHz */
  17.     RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
  18.     RCC->GCFGR |= (uint32_t)( RCC_GCFGR_PLLSEL_HSI_DIV2 | RCC_GCFGR_PLLMF27);

  19.     /* Enable PLL */
  20.     RCC->GCCR |= RCC_GCCR_PLLEN;

  21.     /* Wait till PLL is ready */
  22.     while((RCC->GCCR & RCC_GCCR_PLLSTB) == 0)
  23.     {
  24.     }

  25.     /* Select PLL as system clock source */
  26.     RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_SCS));
  27.     RCC->GCFGR |= (uint32_t)RCC_GCFGR_SCS_PLL;   

  28.     /* Wait till PLL is used as system clock source */
  29.     while ((RCC->GCFGR & (uint32_t)RCC_GCFGR_SCSS) != (uint32_t)0x08)
  30.     {
  31.     }
  32. }


这是官方的初始化库,目前看得没什么问题,就是不干活
CP19940613 发表于 2016-10-6 09:50 | 显示全部楼层
本帖最后由 CP19940613 于 2016-10-6 09:51 编辑

不管怎么说还是推荐使用外部晶振,Keil里面Target也要设置一下Xtal,顺便打个广告,这个核心板我用GD和ST的库都能跑108MHz,需要可以联系
 楼主| apachectl 发表于 2016-10-6 10:05 | 显示全部楼层
IO不够,连SWD接口都省了,当然晶振那几个IO也是要用到的
huarana 发表于 2016-10-6 10:59 | 显示全部楼层
本帖最后由 huarana 于 2016-10-6 11:01 编辑



stm32103的 内部连72都跑不到。

具体看时钟树
GD32是否能跑还得看看他的时钟树
菜鸟同学 发表于 2016-10-6 11:33 来自手机 | 显示全部楼层
怎么可能,自己对着GD数据手册看看,和ST不一样,
jcdzxh 发表于 2016-10-6 14:22 | 显示全部楼层
GD RCC  PLL配置多一 bit
 楼主| apachectl 发表于 2016-10-6 15:34 | 显示全部楼层
本帖最后由 apachectl 于 2016-10-6 19:25 编辑

考虑到GD可能有坑,因此考虑使用他的类库比较好些,类库的定义:
  /* PLL configuration: PLLCLK = (HSI/2) * 27 = 108 MHz */
    RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLPREDV | RCC_GCFGR_PLLMF));
    RCC->GCFGR |= (uint32_t)( RCC_GCFGR_PLLSEL_HSI_DIV2 | RCC_GCFGR_PLLMF27);

#define  RCC_GCFGR_PLLMF27                          ((uint32_t)0x20280000)      

类库总不会错吧,有没有人弄明白什么情况?


elfin_xpp 发表于 2016-10-10 21:04 | 显示全部楼层
systick可以是1/8的系统时钟,或者系统时钟,而且时钟树上的好多衍生时钟都有最高要求,你提高系统时钟时,其他衍生时钟也要进行正确的配置。
vivilzb1985 发表于 2016-10-16 08:54 | 显示全部楼层
这个运行频率也太高了吧
shenmu2012 发表于 2016-10-16 12:47 | 显示全部楼层
这用不到那么高的时钟频率的吧
steven_fae 发表于 2016-10-25 09:29 | 显示全部楼层
#define  RCC_GCFGR_PLLMF27                          ((uint32_t)0x08280000)
 楼主| apachectl 发表于 2016-12-5 20:56 | 显示全部楼层
steven_fae 发表于 2016-10-25 09:29
#define  RCC_GCFGR_PLLMF27                          ((uint32_t)0x08280000)

高手,看来原始固件bug不少,原来都准备放弃gd了,现在重新评估;
修改后速度明显提升,但是串口速率测底乱了,需要重新适配
comeon201208 发表于 2016-12-7 22:40 | 显示全部楼层
108MHz的是极限情况的。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

3

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