GD32F403_Firmware_Library_V2.1.1 时钟初始化是不是有问题?

[复制链接]
3955|7
 楼主| TRUE_ARM 发表于 2021-6-22 09:29 | 显示全部楼层 |阅读模式
用这个官方库文件,使用内部IRC8M 时钟,是正确的,使用外部晶振是错的。

/* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL12);

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

官方代码是按照外部晶振25M 计算的,我使用的是8M:
8M/2 进入PLL

    RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PLL1_MUL8 | RCU_PREDV1_DIV16 | RCU_PREDV0_DIV2);

结果是错的。有点奇怪了?有谁发现这个问题吗?
 楼主| TRUE_ARM 发表于 2021-6-22 09:38 | 显示全部楼层
RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV4 | RCU_PREDV0_DIV4);
8/4 * 8 / 4 = 4M ,也是错的,是不是代码有坑?
 楼主| TRUE_ARM 发表于 2021-6-22 09:40 | 显示全部楼层
补充一下,是串口初始化的波特率不对
 楼主| TRUE_ARM 发表于 2021-6-22 09:41 | 显示全部楼层
void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval)
{
    uint32_t uclk=0U, intdiv=0U, fradiv=0U, udiv=0U;
    switch(usart_periph){
         /* get clock frequency */
    case USART0:
         /* get USART0 clock */
         uclk=rcu_clock_freq_get(CK_APB2);
         break;
    case USART1:
         /* get USART1 clock */
         uclk=rcu_clock_freq_get(CK_APB1);
         break;
    case USART2:
         /* get USART2 clock */
         uclk=rcu_clock_freq_get(CK_APB1);
         break;
    case UART3:
         /* get UART3 clock */
         uclk=rcu_clock_freq_get(CK_APB1);
         break;
    case UART4:
         /* get UART4 clock */
         uclk=rcu_clock_freq_get(CK_APB1);
         break;  
    default:
         break;
    }
    /* oversampling by 16, configure the value of USART_BAUD */
使用外部晶振初始化的时候,这里读到的 uclk 明显不对,
  
    udiv = (uclk+baudval/2U)/baudval;
    intdiv = udiv & 0xfff0U;
    fradiv = udiv & 0xfU;
    USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv));
}
 楼主| TRUE_ARM 发表于 2021-6-22 10:16 | 显示全部楼层

找到问题了,
GD32F403.h

//#define HXTAL_VALUE    ((uint32_t)25000000) /*!< value of the external oscillator in Hz */
#define HXTAL_VALUE    ((uint32_t)8000000)
fishWhy 发表于 2021-6-22 11:45 | 显示全部楼层
minihang 发表于 2021-6-22 17:16 | 显示全部楼层
新手上路,学习中
雨水 发表于 2021-7-1 11:41 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

124

主题

454

帖子

1

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