打印

咨询GD32F105RBT6的ucosii下时钟配置

[复制链接]
2476|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvben5d|  楼主 | 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  
沙发
lvben5d|  楼主 | 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天。

使用特权

评论回复
板凳
Houtz| | 2017-10-10 09:26 | 只看该作者
您好,105和107是属于互联型的,编译时选STM32F10X_CL,RCC时钟树和103是有较大区别的,105按STM32的程序通常使用25M的外振这样改动就很少。有问题请联系GD32 技术支持,QQ375880228,给你提供移植好的ucos工程。

使用特权

评论回复
地板
comeon201208| | 2017-10-11 22:09 | 只看该作者
这两点的分享的很好,时钟处理上很详尽的

使用特权

评论回复
5
angerbird| | 2017-10-11 22:40 | 只看该作者
这是种配置的还是蛮重要的,分频倍频处理的还是较复杂

使用特权

评论回复
6
tongbu2015| | 2017-10-23 21:49 | 只看该作者
看来还是晶振的调试分析问题

使用特权

评论回复
7
shenmu2012| | 2017-10-23 22:37 | 只看该作者
时钟的设计还是蛮不错的

使用特权

评论回复
8
zhangbo1985| | 2017-10-24 18:59 | 只看该作者
这个跟晶振有关系的么?

使用特权

评论回复
9
lvben5d|  楼主 | 2018-10-26 00:19 | 只看该作者
zhangbo1985 发表于 2017-10-24 18:59
这个跟晶振有关系的么?

其实就是 官网的例子是按照25MHZ的外部晶振进行PLL的参数配置,我实际焊接的是8MHZ的,所以要改下PLL相关参数。

使用特权

评论回复
10
wanchengjian| | 2019-12-10 16:25 | 只看该作者
/* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */
RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);  

原来针对25M的
那改成8M,那RCU_PREDV1,RCU_PREDV0 RCU_PLL1_MUL 都有自己计算即可?有要求吗?

使用特权

评论回复
11
zeshoufx| | 2019-12-10 17:06 | 只看该作者
谢谢分享,,,,,,,,,,

使用特权

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

本版积分规则

95

主题

746

帖子

12

粉丝