CH32V307VCT6 RCC配置问题

手头没有8MHz晶振,焊接了个20MHZ的;

把ch32v30x.h里的#define HSE_VALUE    ((uint32_t)8000000) /* Value of the External oscillator in Hz */

改成了#define HSE_VALUE    ((uint32_t)20000000) /* Value of the External oscillator in Hz */

其它用系统默认的,

结果系统并没有自动将SYSCLK配置为72MHZ。

不知道是库函数没有做成足够智能,还是我没有找到相关解释的文章。

您好,当外部晶振大小改变时,系统主频肯定会跟着改变。其次当外接晶振大小为20M时,因为都是整数倍频或6.5倍频,是无法倍频到72 M的。由于CH32V307主频最大为144MHz,当外部晶振大小为20M时,最大倍频为7倍频,可通过修改system_ch32v30x.c文件中的SetSysClockTo72函数来改变系统主频,即改变函数中倍频大小,如下图。


image.png


谢谢。

我昨晚试着在static void SetSysClockTo72(void)里将RCC_PLLMULL9_EXTEN改成了RCC_PLLMULL6_EXTEN,

本意是想做成120MHz的HCLK的,结果定时器实验出来,验证并不是120MHz。

image.pngimage.png


正确的话应该是0.5S打印一次,结果差不多4.5s才打印一次。


您好,注意下正常运行时中断中最好不要加打印,此外,我看你程序中配置并不是一进中断就打印,需要进行++运算,这个if判断是否也需要时间,要>=100,是否是进100次中断打印一次。你可以在main函数中添加下图配置,将系统主频打印出来看一下具体大小。后续若有问题,可通过邮箱(lzs@wch.cn)沟通。

image.png


可以根据这几步检查:

第一步,增加晶体启振超时阈值,即HSE_STARTUP_TIMEOUT从0x500增到到0x5000试试;

第二步,检查晶体输出,锁相环输出和主频选择是否正常。在程序中增加如下函数,使用示波器检查PA8的输出波形频率:

void SET_MCO(void)
{
    GPIO_InitTypeDef GPIO;

    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

    GPIO.GPIO_Pin = GPIO_Pin_8;
    GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO);

    RCC_MCOConfig(RCC_MCO_SYSCLK);
}

理论上按照你的配置,这时PA8的输出频率应该是主频,也就是120MHz。如果不对将函数中的RCC_MCO_SYSCLK换成RCC_MCO_PLLCLK_Div2和RCC_MCO_HSE,查看锁相环2分频输出是否正常,以及外部晶体振荡输出频率是否正常,理论上RCC_MCO_PLLCLK_Div2应该输出60MHz,RCC_MCO_HSE应该输出20MHz。如果的板子的RCC_MCO_SYSCLK为8MHz,即为你的主频被设为8MHz了,你的锁相环的时钟源或者主频的来源都有问题。

注意留意RCC->CFG0寄存器的SWS域的值,这指示你的主频实际来源。

image.png

可以将RCC->CFG0里的值都打印出来,结合CH32V307的时钟树分析:

image.png

可以看出外部晶体频率输出经过PREDIVSCR到PREDIV1,分频后经PLLSCR到PLL1,经倍频后到SW即成为系统主频,理论上只要外部晶体启振正常,PREDIVSCRPLLSCR和SW这三个来源选择器选择正常,PREDIV1分频正确,PLLMUX倍频正确,目标系统频率不超出144MHz,那么你想使用什么系统主频都随意。我用过25MHz的晶体是没有问题的。PA8作为MCO输出可以输出HSE、PLL/2和SYSCLK,协助调查应该会比较简单。

祝好。


 感谢 4楼、5楼 的热心帮助。

问题已经破防了。

确定是以下问题:

***、SMT选错了物料,设计使用的是无源晶振,SMT的时候选了有源晶振。***

今天做了从头到尾的检查,才查出这么个疏忽,

更换了个8MHZ,现在跑120MHZ HCLK,没问题了。

image.png



只有登录才能回复,可以选择微信账号登录