打印

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

[复制链接]
3260|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));
}

使用特权

评论回复
5
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)

使用特权

评论回复
6
fishWhy| | 2021-6-22 11:45 | 只看该作者
路过

使用特权

评论回复
7
minihang| | 2021-6-22 17:16 | 只看该作者
新手上路,学习中

使用特权

评论回复
8
雨水| | 2021-7-1 11:41 | 只看该作者

使用特权

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

本版积分规则

124

主题

454

帖子

1

粉丝