请教:用图形化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
成功了,谢谢!
请教一下,PWMA_CR1 |= 0x01;//使能计数器
然后等待计数完毕是否可以用:while(PWMA_CR1 &0x01); ?
也就是说,PWM计数完毕后PWMA_CR1 BIT0位是否会自动复位? xxkj2010 发表于 2026-6-29 14:41
请教一下,PWMA_CR1 |= 0x01;//使能计数器
然后等待计数完毕是否可以用:while(PWMA_CR1 &0x01); ?
也 ...
高速外设的设计
更可能倾向于自动置位
有的寄存器还可以位操作
xxkj2010 发表于 2026-6-29 14:41
请教一下,PWMA_CR1 |= 0x01;//使能计数器
然后等待计数完毕是否可以用:while(PWMA_CR1 &0x01); ?
也 ...
将程序或程序的链接直接放到 【AI助手】中问
页:
[1]