查看: 229|回复: 7
收起左侧

咨询GD32F105RBT6的ucosii下时钟配置

[复制链接]
     

4

主题

26

帖子

78

积分

初级技术员

 楼主| 发表于 2017-10-4 14:46 | 显示全部楼层 |返回版面|阅读模式
本帖最后由 lvben5d 于 2017-10-4 14:48 编辑

      之前从FAE获得的GD32F130 移植ucosii 官网模版在我的板子上跑成功了,原因是Firw Lib 需要使用V2.0版,我从论坛和百度下到的V1.01版的固件股应该是存在某种问题导致ucosii跑起来晶振比较慢。  
      我现在使用GD32F105RBT6,FAE跟我说,这个IC 是要GD32F10X_CL  这个宏定义,坑爹啊,哈哈, 128MFLASH,按照STM32的命名规则应该是MD, 呵呵。 不过先按照官方FAE的说法做吧。 现在,我自己把之前已经OK的130工程中的库以及启动文件更换成了105的并且硬件仿真,发现了2个问题,
第1,我外部焊接的是8M晶振 晶振丝印明确标记着8MHZ 并且在另外1个项目用了这个晶振。(避免丝印是8M实际是其他)
       /* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined  HXTAL_VALUE   
#ifdef GD32F10X_CL   
#define HXTAL_VALUE    ((uint32_t)8000000)  //这里我修改了8000 000
#else
#define HXTAL_VALUE    ((uint32_t)8000000) /* !< from 4M to 16M *!< value of the external oscillator in Hz*/
#endif /* HXTAL_VALUE */
#endif /* high speed crystal oscillator value */
      #define __SYSTEM_CLOCK_36M_PLL_HXTAL            (uint32_t)(8000000)    打算倍频使用36MHZ, 观察结果    c = rcu_system_clock_source_get();   //  结果为8            时钟源选择是PLL EN后的 没错
                   c = rcu_clock_freq_get(CK_SYS);  //这里读到的是  11520000   
                   c = rcu_clock_freq_get(CK_AHB); //这里读到的是  11520000   
                  最后得到的结果是晶振闪烁的灯 明显不对。
2. void MySysTickInitForUCosii()
{  
    u32 fcpu=4500000;    //36M /   8分频   
    SysTick_Config(fcpu/100);  //这个函数包括了配置系统时钟优先级、时钟源、使能中断,启用系统定时器。
}

在ucosii主任务里,我为了测试时间的快慢, OSTimeDlyHMSM(0,1,0,0);   也就是1分钟 进1次来观察时间,结果发现时间不对。 请问哪位用过GD32F105的兄弟 指点下迷津。
如果,我把
#define HXTAL_VALUE    ((uint32_t)25000000) /*!< value of the external oscillator in Hz */
结果   
        c = rcu_clock_freq_get(CK_SYS);  //这里读到的是  36000000   
        c = rcu_clock_freq_get(CK_AHB); //这里读到的是  36000000  
     

4

主题

26

帖子

78

积分

初级技术员

 楼主| 发表于 2017-10-4 15:20 | 显示全部楼层 |返回版面
本帖最后由 lvben5d 于 2017-10-5 19:26 编辑

目前,我经过处理得到LED闪烁的时间是OK的配置如下: 外部HSE晶振 焊接的是8MHZ, 因为定义了宏 GD32F10X_CL , 所以红色地方修改的数值跟外部晶振一致,#if !defined  HXTAL_VALUE   
#ifdef GD32F10X_CL   
#define HXTAL_VALUE    ((uint32_t)8000000)  //这里我修改了8000 000    我终于发现官网只对晶振25MHZ做了PLL相关的乘除,如果你使用外部晶振,并且倍频后的时钟作为主时钟,请开始你的 乘除吧。 修改system_clock_36m_hxtal()红色这里方便 ^_^
#else
#define HXTAL_VALUE    ((uint32_t)8000000) /* !< from 4M to 16M *!< value of the external oscillator in Hz*/
#endif /* HXTAL_VALUE */
#endif /* high speed crystal oscillator value */
设置systick的时间间隔函数里,我做了如下处理。
void MySysTickInitForUCosii()
{         
     u32 fcpu = rcu_clock_freq_get(CK_AHB);   
     SysTick_Config(fcpu/100);  //  /100  就是10ms 1次systick中断时间,这个符合STM32和GD32的工程示范的设置方式。
}
#elif defined(GD32F10X_CL)  
static void system_clock_36m_hxtal(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;

    /* enable HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

    /* if fail */
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
        while(1){
        }
    }

    /* HXTAL is stable */
    /* AHB = SYSCLK */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2 = AHB/1 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
    /* APB1 = AHB/2 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;

#if (defined(GD32F10X_MD) || defined(GD32F10X_HD) || defined(GD32F10X_XD))
    /* select HXTAL/2 as clock source */
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_CFG0_PREDV0);

    /* CK_PLL = (CK_HXTAL/2) * 9 = 36 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
    RCU_CFG0 |= RCU_PLL_MUL9;

#elif defined(GD32F10X_CL)
    /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9);


    /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */
    RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);
    RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);        

    /* enable PLL1 */
    RCU_CTL |= RCU_CTL_PLL1EN;
    /* wait till PLL1 is ready */
    while((RCU_CTL & RCU_CTL_PLL1STB) == 0){
    }
#endif /* GD32F10X_MD and GD32F10X_HD and GD32F10X_XD */

    /* enable PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* wait until PLL is stable */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
    }

    /* select PLL as system clock */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLL;

    /* wait until PLL is selected as system clock */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
    }
}Pa:  坑爹啊, GD32F10x手册的HSE晶振范围是4~16MHZ, 105不属于10X系列啊??。。资料也不写清楚点。 呵呵, 找到问题了。耽误了我1天。

     

0

主题

64

帖子

210

积分

中级技术员

发表于 2017-10-10 09:26 | 显示全部楼层 |返回版面
您好,105和107是属于互联型的,编译时选STM32F10X_CL,RCC时钟树和103是有较大区别的,105按STM32的程序通常使用25M的外振这样改动就很少。有问题请联系GD32 技术支持,QQ375880228,给你提供移植好的ucos工程。

68

主题

3675

帖子

1万

积分

资深工程师

发表于 2017-10-11 22:09 | 显示全部楼层 |返回版面
这两点的分享的很好,时钟处理上很详尽的

78

主题

3565

帖子

1万

积分

资深工程师

发表于 2017-10-11 22:40 | 显示全部楼层 |返回版面
这是种配置的还是蛮重要的,分频倍频处理的还是较复杂

24

主题

1420

帖子

4261

积分

中级工程师

发表于 2017-10-23 21:49 | 显示全部楼层 |返回版面
看来还是晶振的调试分析问题

74

主题

3890

帖子

1万

积分

资深工程师

发表于 2017-10-23 22:37 | 显示全部楼层 |返回版面
时钟的设计还是蛮不错的

28

主题

1392

帖子

4186

积分

中级工程师

发表于 2017-10-24 18:59 | 显示全部楼层 |返回版面
这个跟晶振有关系的么?
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

分享 快速回复 返回顶部 返回列表