xxkj2010 发表于 2026-6-29 13:21:39

请教:用图形化AiCube设置PWM倍频无效

芯片:STC32G144K246

用图形化AiCube设置PWM倍频,具体如图:


这样设置后的PWM频率应该能达到156MHz的,但实测PWM脉冲依然大约是10us(相当于频率48MHz)


这与默认的主频差不多,默认情况下如图:


不知道问题出在哪里。请高手指点,谢谢!
附部分代码:
倍频下的时钟设置:
////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
    CLK_I2S1CLK_Divider(1);             //设置I2S1时钟预分频系数
    CLK_I2S2CLK_Divider(1);             //设置I2S2时钟预分频系数
    CLK_SPI1CLK_Divider(1);             //设置SPI1时钟预分频系数
    CLK_SPI2CLK_Divider(1);             //设置SPI2时钟预分频系数
    CLK_SPI3CLK_Divider(1);             //设置SPI3时钟预分频系数
    CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
    CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
    CLK_PWMCCLK_Divider(1);             //设置PWMC时钟预分频系数
    CLK_PWMDCLK_Divider(1);             //设置PWMD时钟预分频系数
    CLK_PWMECLK_Divider(1);             //设置PWME时钟预分频系数
    CLK_PWMFCLK_Divider(1);             //设置PWMF时钟预分频系数
    CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数

    CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

    HIRC_48M();                         //选择内部预置的频率

    CLK_MCLK_HIRC();                  //选择内部高精度HIRC作为主时钟
    CLK_MCLK2_BYPASS();               //旁路MCLK2,直接使用MCLK选择

    CLK_HPLL1_BASECLK();                //选择内部基本时钟BASECLK作为HPLL1输入时钟
    CLK_HPLL1_PreDivider(8);            //设置HPLL1的输入时钟预分频系数(分频后的频率必须为6MHz左右)
    CLK_HPLL1_Lock312MHz();             //选择HPLL1的锁频目标频率
    CLK_HPLL1_Enable();               //启动HPLL1
    delay_ms(1);                        //等待PLL锁频

    CLK_SYSCLK_Divider(1);            //设置系统时钟分频系数

    CLK_HSI2SCK_HPLL1D2();            //选择HPLL1的输出2分频时钟作为高速I2S时钟源
    CLK_HSIOCK_HPLL1D2();               //选择HPLL1的输出2分频时钟作为高速外设时钟源

    //<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_CLOCK_INITIAL_END>>
}PWMA初始化代码:

void PWMA_Init(void)
{
    PWMA_C5SwitchP46();               //设置PWMA通道5数据端口: PWMA5P (P4.6)

    HSPWMA_Disable();                   //关闭高速模式,使用同步方式进行初始化
    PWMA_InternalClockMode();         //选择内部时钟模式
    PWMA_SetClockDivider(0);            //设置16位预分频
    PWMA_SetReload16(999);            //设置16位重载值
    PWMA_BufferARR();                   //使能重载值寄存器预装载功能
    PWMA_SetCounter(0);               //初始化计数值

    PWMA_CC5PEnable();                  //打开通道
    PWM_UpdateDuty(PWMA_CH5, 500);      //设置通道的PWM占空比
    PWMA_OC5REFPWMMode1();            //设置通道输出参考信号为PWM模式1信号
    PWMA_BufferCCR5();                  //使能CCRn预装载功能
    PWMA_CC5PInverted();                //设置正极通道输出低电平有效
    PWMA_EnablePWM5POutput();         //使能正极通道输出

    PWMA_EnableMainOutput();            //使能PWM主输出

    PWMA_Run();                         //PWMA开始运行

    //<<AICUBE_USER_PWM0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PWM0_INITIAL_END>>
}


32G12K128 发表于 2026-6-29 13:37:10






xxkj2010 发表于 2026-6-29 13:46:10

32G12K128 发表于 2026-6-29 13:37


成功了,谢谢!


xxkj2010 发表于 2026-6-29 14:41:22

请教一下,PWMA_CR1    |= 0x01;//使能计数器
然后等待计数完毕是否可以用:while(PWMA_CR1 &0x01); ?
也就是说,PWM计数完毕后PWMA_CR1 BIT0位是否会自动复位?

狂热主宰 发表于 2026-6-29 15:22:14

xxkj2010 发表于 2026-6-29 14:41
请教一下,PWMA_CR1    |= 0x01;//使能计数器
然后等待计数完毕是否可以用:while(PWMA_CR1 &0x01); ?
也 ...

高速外设的设计
更可能倾向于自动置位
有的寄存器还可以位操作

神农鼎 发表于 2026-6-29 17:10:31

xxkj2010 发表于 2026-6-29 14:41
请教一下,PWMA_CR1    |= 0x01;//使能计数器
然后等待计数完毕是否可以用:while(PWMA_CR1 &0x01); ?
也 ...

将程序或程序的链接直接放到 【AI助手】中问

页: [1]
查看完整版本: 请教:用图形化AiCube设置PWM倍频无效