打印

GD不靠谱啊!

[复制链接]
2746|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我花了大半天移植到GD,结果发现GD 时钟配置,居然连内部时钟倍频到72M都没有。只有HSE。
移植过程中发现些不痛不痒的问题,我也忍了,现在还要自己写,这个是什么意思。好蛋疼!
沙发
菜鸟同学|  楼主 | 2015-12-1 16:25 | 只看该作者
以为官方库要靠谱点!

使用特权

评论回复
板凳
shdjdq| | 2015-12-1 16:28 | 只看该作者
还行吧,基本和STM32通用

使用特权

评论回复
地板
晓枫VS枯叶| | 2015-12-1 16:34 | 只看该作者
GD官方库都能倍频到108M

使用特权

评论回复
5
whz913399088| | 2015-12-1 16:49 | 只看该作者
楼主什么意思。GD的103系列最高时钟能配置到108M呢,直接使用GD的官方固件库怎么会没有内部时钟72M的配置呢。不过你要是使用ST的固件库,那你就不能说GD的问题了。还有移植的过程中发现不同不痒的问题,既然是移植那就是要解决这些不同不痒的问题的,不然怎么叫移植呢。我这边有一些GD的示例程序,以及ST与GD间移植的资料。有需要可以加我QQ:913399088

使用特权

评论回复
6
菜鸟同学|  楼主 | 2015-12-1 16:51 | 只看该作者
whz913399088 发表于 2015-12-1 16:49
楼主什么意思。GD的103系列最高时钟能配置到108M呢,直接使用GD的官方固件库怎么会没有内部时钟72M的配置呢 ...

我用的GD150,我也无语了,不折腾了。

使用特权

评论回复
7
whz913399088| | 2015-12-1 16:59 | 只看该作者
菜鸟同学 发表于 2015-12-1 16:51
我用的GD150,我也无语了,不折腾了。

额额,如果是150的那确实有点麻烦了,毕竟GD150的和st不太兼容,使用的是自己的固件库。对了,我认识有个GD的FAE你可以让他给你提供点帮助。他QQ是:2853951856

使用特权

评论回复
8
mumu3013| | 2015-12-3 11:26 | 只看该作者
菜鸟同学 发表于 2015-12-1 16:25
以为官方库要靠谱点!

用GD自己家的库函数就行,时钟选择一下,很简单的,

使用特权

评论回复
9
Ketose| | 2015-12-3 20:30 | 只看该作者
我用150挺好的啊。要用GD32自己的库。你用ST的库,当然有问题了。

使用特权

评论回复
10
perry_peng| | 2015-12-4 09:43 | 只看该作者
试试我写的代码,gd的库确实不靠谱,所以我只好参考datasheet自己写了。

官方的那个库太复杂了。我来个精简版的::lol, 使用内部HSI作为PLL时钟源,系统时钟输出为72MHz,

HSI = 8MHz,  HSI / 2 * 18 = 72MHz.  

GD32F150上测试OK。


void System_Init (void)
{
  /* [31:26]      Reserved.
     [25]      r  PLLSTB          PLL稳定标志, 0表示未稳定。
     [24]      rw PLLEN    = 0,   PLL开关。
     [23:20]      Reserved.
     [19]      rw CKMEN    = 0,   关闭外部时钟(HSE) monitor.
     [18]      rw HSEBPS   = 0,   Bypass HSE.
     [17]      r  HSESTB          外部时钟(HSE)稳定标志, 0表示未稳定
     [16]      rw HSEEN    = 0,   关闭外部时钟(HSE).
     [15:8]    r  HSICALIB
     [7:3]     rw HSIADJ
     [2]          Reserved.
     [1]       r  HSISTB          内部时钟(HSI)稳定标志, 0表示未稳定。
     [0]       rw HSIEN           打开外部时钟(HSE).
   */
  RCC->GCCR = RCC_GCCR_HSIEN;                 // 启用内部8MHz RC oscillator。
  while (!(RCC->GCCR & RCC_GCCR_HSISTB));     // 等待直到内部RC oscillator稳定。

  /* [31]      rw PLLDV    = 0,   CK_OUT的输入分频系数CK_PLL divide by 2.
     [30:28]   rw CKOUTDIV = 0,   CK_OUT的输出分频系数。
     [26:24]   rw CKOUTSRC = 0,   CKOUT时钟输出PIN的输出频率(No clock selected).
     [23:22]   rw USBPS    = 0,   USB时钟等于CK_PLL / 1.5
     [27,21:18]rw PLLMF   = 0x12, PLL倍频系数是18x.
     [17]      rw PLLPREDV = 0,   PLL时钟源选用HSE时钟(PLLSEL=1时有效).
     [16]      rw PLLSEL   = 0,   PLL时钟源等于HSI时钟除2(8MHz / 2)
     [15:14]   rw ADCPS    = 0,   ADC时钟等于CK_APB2 / 2.
     [13:11]   rw APB2PS   = 0,   APB2时钟等于CK_AHB.
     [10:8]    rw APB1PS   = 0,   APB1时钟等于CK_AHB.
     [7:4]     rw AHBPS    = 0,   AHB时钟等于CK_SYS.
     [3:2]     r  SCSS            System clock switch status(Read only).
     [1:0]     rw SCS      = 0,   CK_SYS时钟来自CK_HSI
   */
  RCC->GCFGR = 0x808000C;

  RCC->GCCR |= RCC_GCCR_PLLEN;                // 启用PLL。
  while(!(RCC->GCCR & RCC_GCCR_PLLSTB));      // 等待PLL稳定。

  RCC->GCFGR |= RCC_GCFGR_SCS_PLL;            // 切换CK_SYS时钟为CK_PLL
  while ((RCC->GCFGR & RCC_GCFGR_SCSS) != RCC_GCFGR_SCSS_PLL);  // 等待切换完成。
}

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
菜鸟同学 + 4 赞一个!
11
user110| | 2015-12-4 10:15 | 只看该作者
下面的代码是GDF3210x库里的,可以直接复制到GDF321x0的库中直接使用
/**
  * @brief  Set System clock frequency to 72MHz and configure AHB, APB1, and APB2 prescalers.
  * @NOTE   This function should be used only after reset.
  * @param  None
  * @retval None
  */
static void SetSysClockTo72HSI(void)
{
  /* CK_SYS, AHB, APB2 and APB1 configuration ---------------------------*/   

    /* AHB = CK_SYS not divided */
    RCC->GCFGR |= (uint32_t)RCC_GCFGR_AHBPS_DIV1;
      
    /* APB2 = AHB not divided */
    RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB2PS_DIV1;
   
    /* APB1 = AHB is divided 2 */
    RCC->GCFGR |= (uint32_t)RCC_GCFGR_APB1PS_DIV2;

    /* Configure PLLs ------------------------------------------------------*/
   
    /* PLL configuration: PLLCLK = (HSI/2) * 18 = 72 MHz */
    RCC->GCFGR &= (uint32_t)((uint32_t)~(RCC_GCFGR_PLLSEL | RCC_GCFGR_PLLMF));
    RCC->GCFGR |= (uint32_t)( RCC_GCFGR_PLLSEL_HSI_DIV2 | RCC_GCFGR_PLLMF18);

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

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

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

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

使用特权

评论回复
12
user110| | 2015-12-4 10:31 | 只看该作者
GDF3210x和GD32F20x的库中都有使用HSI配置系统时钟的代码,GDF321x0中没有,可能是因为GDF321x0的库做的比较早吧,不过可以直接把GDF3210x中关于使用HSI配置系统时钟的代码直接复制到GDF321x0的系统文件中,已经测试过可以直接使用。

1.png (17.98 KB )

1.png

2.png (19.93 KB )

2.png

使用特权

评论回复
13
zhuyjgh| | 2015-12-9 14:41 | 只看该作者
用GD的库吧,再看一下用户手册时钟那部分,配置应该没问题的,

使用特权

评论回复
14
vivilzb1985| | 2015-12-10 14:21 | 只看该作者
这个你在设计的时候需要多注意下的。

使用特权

评论回复
15
vivilzb1985| | 2015-12-10 14:21 | 只看该作者
另外时钟的是比较高的,没有你说的那么糟糕的,最高都可以达到108MHz的。

使用特权

评论回复
16
shenmu2012| | 2015-12-10 15:03 | 只看该作者
怎了,楼主,是你在设计的时候没注意啥细节上的问题的吧。

使用特权

评论回复
17
angerbird| | 2015-12-13 17:55 | 只看该作者
这个多请教已经用过该芯片的工程师的吧。

使用特权

评论回复
18
zhengbo7hui| | 2015-12-13 20:23 | 只看该作者
不会吧,官网说是比STM1系列要高一个级别

使用特权

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

本版积分规则

35

主题

707

帖子

8

粉丝