单片机/MCU论坛
直播中

孙奕

7年用户 879经验值
私信 关注
[问答]

tc264配置tom产生fxclk无法选择fxu时钟源怎么解决?

目前,我想使用IfxGtm_Cmu_Clk_1(可选 0~7)作为FXU时钟源,然后通过IfxGtm_Tom_Ch_ClkSrc_cmuFxclk1(1/16)分频器产生 pwm。FXU时钟源的选择,无论我选择哪个时钟源,输出 pwm 的时钟源依旧是主要问题就是,我无法选择除了全局时钟以外的时钟作为 FXU 模块的时钟输入。
我知道可以通过MODULE_GTM.CMU.FXCLK.CTRL.B.FXCLK_SEL = pwm_clk+1;配置输入时钟。
以下是我的代码:

static uint32 __tom_pwm_get_clken_mask(IfxGtm_Cmu_Clk pwm_clk){    uint32 __addr = IFXGTM_CMU_CLKEN_CLK0 << pwm_clk * 2;    return __addr;}static void __tom_pwm_clock_config_rrd(IfxGtm_Cmu_Clk pwm_clk,float32 pwm_clk_freq){    if (!IfxGtm_isEnabled( MODULE_GTM))    {        IfxGtm_enable( MODULE_GTM);    }    uint32 clken_mask = __tom_pwm_get_clken_mask(pwm_clk);    IfxGtm_Cmu_setClkFrequency( MODULE_GTM, pwm_clk, pwm_clk_freq);    IfxGtm_Cmu_enableClocks( MODULE_GTM, clken_mask);    // 选择FXU模块的输入时钟    MODULE_GTM.CMU.FXCLK.CTRL.B.FXCLK_SEL = pwm_clk+1;    IfxGtm_Cmu_enableClocks( MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK);}static void __tom_pwm_config_rrd(IfxGtm_Tom_ToutMap *pwm_channel, uint32 pwm_count_period,IfxGtm_Tom_Ch_ClkSrc divider_clk){    IfxGtm_Tom_Pwm_Config tom_config;    IfxGtm_Tom_Pwm_Driver tom_driver;    IfxGtm_Tom_Pwm_initConfig( tom_config,  MODULE_GTM);    tom_config.clock = divider_clk;    tom_config.tom = pwm_channel->tom;    tom_config.period = pwm_count_period;    tom_config.pin.outputPin = pwm_channel;    tom_config.synchronousUpdateEnabled = TRUE;    tom_config.tomChannel = pwm_channel->channel;    IfxGtm_Tom_Pwm_init( tom_driver,  tom_config);    IfxGtm_Tom_Pwm_start( tom_driver, TRUE);}

当我通过串口打印module_gtm.cmu.fxclk.ctrl.b.fxclk_sel的时候,显示模块_gtm.cmu.fxclk.ctrl.b.fxclk_sel是有被配置的。是有被配置的。

    uint8 FXCLK_SEL = MODULE_GTM.CMU.FXCLK.CTRL.B.FXCLK_SEL;    printf("FXCLK_SEL:%drn",FXCLK_SEL);

调试代码:
    printf("===========================rn");    float freq = IfxGtm_Tom_Ch_getClockFrequency( MODULE_GTM, MODULE_GTM.TOM[IfxGtm_TOM1_15_TOUT7_P02_7_OUT.tom],IfxGtm_TOM1_15_TOUT7_P02_7_OUT.channel);    printf("fxclk_freq:%frn",freq);    float g_freq =IfxGtm_Cmu_getGclkFrequency( MODULE_GTM);    printf("global_freq:%frn",g_freq);    float clk_freq = IfxGtm_Cmu_getClkFrequency( MODULE_GTM,IfxGtm_Cmu_Clk_0,TRUE);    printf("clk_freq:%frn",clk_freq);    uint8 FXCLK_SEL = MODULE_GTM.CMU.FXCLK.CTRL.B.FXCLK_SEL;    printf("FXCLK_SEL:%drn",FXCLK_SEL);    uint8 clk = IfxGtm_Tom_Ch_getClockSource( MODULE_GTM.TOM[IfxGtm_TOM1_15_TOUT7_P02_7_OUT.tom],IfxGtm_TOM1_15_TOUT7_P02_7_OUT.channel);    printf("FXCLK_divider_clk:%drn",clk);
调试信息:


手册资料:




回帖(1)

杜云

2024-3-6 16:53:07
根据您提供的代码,您可以通过以下步骤解决问题:

1. 确保IFXGTM_CMU.FXCLK域的配置寄存器被正确配置,并且设置为允许使用非全局时钟(FXCLK_SEL = 0)。
2. 确保正确选择IfxGtm_Cmu_Clk_1作为FXU时钟源,并将其传递给__tom_pwm_get_clken_mask函数。
3. 在__tom_pwm_get_clken_mask函数中,使用正确的寄存器地址和偏移量计算出FXU的时钟使能位域的掩码值。
4. 将计算出的掩码值写入到相关的寄存器中,以将FXU时钟源设置为IfxGtm_Cmu_Clk_1。

请注意,确保在设置输入时钟源之前,先使能并配置好相关的时钟模块和通道。另外,确保在进行时钟切换时,存在足够的延时以保证时钟切换成功。

最后,确认一下您使用的GTM版本和芯片型号是否支持选择除全局时钟以外的时钟作为FXU模块的时钟源。
举报

更多回帖

×
20
完善资料,
赚取积分