AURIX-TC3xx-GTM详解十-TOM(Timer Output Module)
·
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;更多推荐


所有评论(0)