1、主要框图

主要用途产生PWM波形

1)共有5组TOM,每组TOM有16个通道,总数达80个通道,用途是产生PWM信号;

2)每组TOM里分TGC1和TGC2分别控制TOM本组内的低8通道和TOM本组内的高8通道;

3)可使用TBU_TS0、TBU_TS1或TBU_TS2作为同步时钟产生同步PWM信号

4)可使用5个专用的CMU_FxCLK作为输出模块的时钟

2、TOM全局通道控制 (TGC0, TGC1)

主要有3种TRIG源:

1)CPU主机TRIG,只需往TOM[i]_TGC[y]_GLB_CTRL)的HOST_TRIG位写入1就可产生TRIG

2)TBU_TSx与ACT_TB[23:0]比较,TBU_TSx到达ACT_TB[23:0]的设定值,发生TRIG

3)内部TOM通道的内部TRIG信号

3、TOM通道

3.1、TOM CH0~CH7通道

1)CNT0的计数时钟来源可以为如下:

CMU_CLK0~CMU_CLK7;

上一个TOM通道的TRIG信号;

TIM_EXT_CAPTRUE;

CMU_FXCLK0~5。

2)UPEN和FUPD可以独立控制CM0和CM1寄存器的更新

3)CM0寄存器村存的是周期的比较值;

4)CM1寄存器存的是占空比的比较值;

3.2、TOM CH8~CH14通道

与TOM CH0~CH7通道对比,少了SPE模块的相关功能

3.3、TOM CH15通道

与TOM CH0~CH7通道对比,少了SPE模块的相关功能,多了BITREV(CNT0的位反向)功能

4、补充说明

对于占空比的同步或异步更新,计数模式区别非本文重点,看规格不难理解,此处不赘述。

5、中断

后续与其他模块的配合或应用,这个中断比较有用。

5.1、CCT0TC(bit0)

CCU0触发条件中断。

当CN0计数大于等于CM0发生中断。

5.2、CCT1TC(bit1)

CCU1触发条件中断。

当CN0计数大于等于CM1发生中断。

6、代码范例

输出100Hz 30%到P10.7 port。

IfxGtm_Tom_Pwm_Config g_tomConfig;     
IfxGtm_Tom_Pwm_Driver g_tomDriver;          

/* 初始化TOM0 CH1. */
void Init_Tom0CH0(void)
{
    IfxGtm_enable(&MODULE_GTM);  /* 使能GTM模块. */
    IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK); /* 使能固定时钟. */

    /* 初始化g_tomConfig结构体 */
    IfxGtm_Tom_Pwm_initConfig(&g_tomConfig, &MODULE_GTM);

    g_tomConfig.tom = IfxGtm_Tom_0;  /* 选择TOM0 */

    g_tomConfig.tomChannel = IfxGtm_Tom_Ch_0;  /* 选择CHl. */
    g_tomConfig.period                   = 100;       /* 设置周期,此处可反算频率.*/
    g_tomConfig.dutyCycle                = 30;        /* 设置占空比.*/
    g_tomConfig.pin.outputPin            = &IfxGtm_TOM0_0_TOUT109_P10_7_OUT;       
    /* 选择输出到哪个port,有好多输出port可选,根据实际选择即可. */

    g_tomConfig.synchronousUpdateEnabled = TRUE;  /* 使能同步更新. */

    IfxGtm_Tom_Pwm_init(&g_tomDriver, &g_tomConfig);  /* 初始化写入寄存器. */
    IfxGtm_Tom_Pwm_start(&g_tomDriver, TRUE);  /* 启动PWM输出. */
}

另外还有一些参数未用到,可参照以下说明

    config->gtm                      = gtm;
    config->tom                      = IfxGtm_Tom_0;
    config->tomChannel               = IfxGtm_Tom_Ch_0;
    config->clock       = IfxGtm_Tom_Ch_ClkSrc_cmuFxclk0;     /*选择CNT0的计数时钟*/
    config->period                   = 20;
    config->dutyCycle                = 10;
    config->signalLevel              = Ifx_ActiveState_high;  /*占空比高低有效设置*/
    config->oneShotModeEnabled       = FALSE;  
    /*只输出一次PWM波形 参照手册28.14.3.4One-shot Counting Up Mode章节 */

    config->synchronousUpdateEnabled = FALSE;  
    /*是否同步,参照28.14.3.1.1 Synchronous Update Of Duty Cycle Only和28.14.3.1.2         
     Asynchronous Update Of Duty Cycle Only章节,区别就是如果CM0/CM1发生改后否在本周期内更新     
     还是下一个周期内更新*/

    config->immediateStartEnabled    = TRUE; /* HOST_TRIG是否可以控制*/
    config->interrupt.ccu0Enabled    = FALSE; /*CN0>=CM0时中断使能*/
    config->interrupt.ccu1Enabled    = FALSE; /*CN0>=CM1时中断使能*/
    config->interrupt.mode           = IfxGtm_IrqMode_pulseNotify; /*中断模式选择*/
    config->interrupt.isrProvider    = IfxSrc_Tos_cpu0; /*中断在哪个CPU里处理选择*/
    config->interrupt.isrPriority    = 0; /* 中断优先级设置*/
    config->pin.outputPin            = NULL_PTR; 
    config->pin.outputMode           = IfxPort_OutputMode_pushPull;
    config->pin.padDriver            = IfxPort_PadDriver_cmosAutomotiveSpeed1;
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐