Autosar MCAL-GTM之TOM

前言

在前面的文章中,我们介绍了GTM中的CMU模块,TIM模块,用来进行PWM波的周期与占空比测量。本文将介绍GTM中的另一个模块TOM,该模块是用来产生PWM波的,主要介绍芯片手册中的内容及Davinci CFG中的配置项。

定时器输出模块(TOM)

TOM产生PWM的原理


上图很好的描述了TOM产生PWM的原理,下面用文字进行解释:

CCU0主要用来对CN0计数,该计数的频率取决于CMU_FXCLK时钟,该时钟在CMU模块中配置,具体可以看我之前的CMU文章

寄存器TOMi_CHx_CTRL的配置位RST_CCU0,用来配置Reset CN0,有两种方式,一种为当计数器值等于比较值CM0时,另一种为由前一通道产生的trigger(通道0由通道15)。一般来说,CM0的值作为PWM的周期

当计数器寄存器CN0大于或等于寄存器CM0时,子单元CCU0触发SOU子单元和随后的TOM子模块信道(信号TRIG_CCU0)。

在子单元CCU1中,计数器寄存器CN0与寄存器CM1的值进行比较。如果CN0大于或等于CM1,则子单元CCU1触发SOU子单元(信号TRIG_CCU1)一般来说,CM1的值作为PWM的占空比

如果RST_CCU0配置为由CM0触发,则:

如果CM0=0或CM0=1,则占空比为0%,与CM1无关,CN0不计数

CM1=0的配置表示输出0%占空比

CM1>=CM0的配置表示100%占空比

如果RST_CCU0配置为由前一个通道trigger触发,则:

CM0定义边缘到SL的值,CM1定义边缘到-SL的值,这个不太明白,实际配置为前一个通道触发后还是会按CM0为周期,CM1为占空比来用

如果CM0=CM1,则输出为100%SL(CM0具有更高的优先级)

如果CM0=0,输出保持在其最后值(CN0停止计数)

TOMi_CHx_CTRLSL位用来确认输出的有效电平,SL=0时,CN0计数在CM1前输出低电平,之后翻转为高电平,到达CM0时再翻转为低电平,周期结束。SL=1时,CN0计数在CM1前输出高电平,之后翻转为低电平,到达CM0时再翻转为高电平,周期结束,如下图所示,通过CM0配置周期,CM1配置占空比:

TOM通道输出引脚TOM[i]_CH[x]_OUT上的输出电平被捕获在寄存器TOMi_CHx_STAT的位OL

一般配置为PWM输出的TOM通道,CN0的Reset方式选择CN0达到CM0时触发。

TOM中断

中断使能

TOM中断有两个地方可以产生,一个是CN0计数到达CM0时产生的中断,一般称为Period中断,一个是CN0计数到达CM1时产生的中断,一般称为Duty中断。在Davinci CFG中的配置如下:


对应的寄存器为TOMi_CHx_IRQ_ENCCU0TC_IRQ_EN与CCU1TC_I
RQ_EN位

中断模式

GTM的中断有四种模式:

Level interrupt mode:默认中断模式是电平中断模式。在这种模式下,每个发生的中断事件都被收集在寄存器IRQ_NOTIFY中,与寄存器IRQ_EN和EIRQ_EN的相应启用位无关

Pulse interrupt mode:在脉冲中断模式下,如果IRQ_EN被启用,则每个中断事件将在IRQ_bit信号上产生一个脉冲。

从图中可以看出,如果IRQ_EN或IRQ_EN,IRQ_NOTIFY寄存器中的中断位总是被清除

Pulse-notify interrupt mode:在脉冲通知中断模式下,所有中断事件都被捕获在寄存器IRQ_notify中。如果寄存器IRQ_EN启用中断,则每个中断事件也将在IRQ_bit信号上产生一个脉冲。如果中断在寄存器IRQ_EN中被启用并且寄存器IRQ_NOTIFY的相应位被置位,则信号IRQ_occurred将为高。

这种中断方式在TOM中经常会使用,用来触发对应的回调函数进行相关处理。

Single-pulse interrupt mode:在单脉冲中断模式中,中断事件总是在寄存器IRQ_NOTIFY中捕获,与IRQ_EN的状态无关。然而,只有公共中断集中启用的中断的第一个中断事件被转发到信号IRQ_line。同一中断集的其他中断事件不能在信号IRQ_line上产生脉冲,直到寄存器IRQ_NOTIFY中启用中断的相应位被清除事件清除。如果设置了IRQ_EN和IRQ_NOTIFY寄存器位,则IRQ_occurred信号线将为高电平


在Davinci CFG中的配置如下:


Tom Notification用来配置中断触发的回调函数

中断映射

TOM通道与TOM中断对应关系:

2个通道为一组,最后作为中断源:

该中断源最终与OS中对应的TOM中断对应。同时在Irq模块中也要配置开启对应的中断及配置优先级。

CFG中TOM通道配置

TOM Channel Enable

TomChDisableOnTgcTrigger


该配置表示TOM通道是否在Tgc Trigger触发时禁止计数。如果配置为真,则寄存器TOMi_TGC0_ENDIS_CTRL中的ENDIS_CTRLx位值为01B,Tgc Trigger有三种方式,如下图:

一种为对寄存器TOMi_TGC0/1_GLB_CTRL中的HOST_TRIG写1触发,这个在CFG软件中没有体现。

一种为寄存器TOMi_TGC0/1_INT_TRIG配置。CFG中配置如下图:


一种为TGC Timebase trigger,通过GTM中的TBU模块中的计时器TBU_TS0/1/2与寄存器TOMi_TGC0_ACT_TB中的ACT_TB位比较,大于后触发。CFG中配置如下图:


一个是选择Timebase,与寄存器TOMi_TGC0_ACT_TB中TBU_SEL位对应
一个是使能触发,这个应该是软件做的
一个设置比较值,与寄存器TOMi_TGC0_ACT_TB中的ACT_TB对应,该值的范围为0-0xffffff
这个触发功能很少用到。

TOM Channel Enable

配置通道使能的方式:
一种为AT_START,即在开始时就一直使能,通过寄存器TOMi_TGC0_ENDIS_STAT中的ENDIS_STAT0位配置为10B实现

一种为ON_GLOBAL_TRIGGER,即通过GLOBAL_TRIGGER触发使能,通过寄存器TOMi_TGC0_ENDIS_STAT中的ENDIS_STAT0位配置为00B或11B,且寄存器TOMi_TGC0_ENDIS_CTRL中的ENDIS_CTRLx位值为10B后,即可通过上述的三种trigger方式来使能通道。一般很少用,基本都是用AT_START

CFG中配置如下图:

TOM Channel Output

TomChOutputDisableOnTgcTrig

与上面的TomChDisableOnTgcTrigger类似,这里是禁止通道输出,对应的寄存器为TOMi_TGC0_OUTEN_CTRL中的OUTEN_CTRLx,需要设置为01B
CFG中配置如下图:

TomChannelOutputControl

配置何时使能通道的输出,对应寄存器为TOMi_TGC0_OUTEN_CTRL中的OUTEN_CTRL0及TOMi_TGC0_OUTEN_STAT中的OUTEN_STAT0

CFG中配置如下图:

一般使用时配置为ENABLE_OUTPUT_AT_START.

TomChannelOutputSignalLevel

该配置项为TOM输出的PWM初始电平,为Low时先输出低电平,为High时先输出高电平。对应寄存器为TOMi_CHx_CTRL中的SL位

CFG中配置如下图:

TomChannelPortPinSelect

选择TOM输出的对应PIN角,该配置项需要与硬件原理图对应,关于TOM通道和PIN角的对应,可以直接在手册中搜索对应的Pin角即可找到。

CFG中配置如下图:

TOM Channel Timer parameters

在讲配置参数之前,需要再引入一些概念。在TOM中,两个动作寄存器CM0和CM1可以用影子寄存器SR0和SR1的内容重新加载,此处我们引入占空比同步更新和异步更新。

PWM更新方式

同步更新:如下图所示,通过对SR1寄存器值更新,使得TOM输出在下一个周期才同步一起更新CM1

异步更新:如下图所示,通过直接对CM1寄存器值更新,使得TOM输出可能本次周期内输出就发生改变

PWM输出模式

**连续模式:**如下图所示,该模式下通道使能后,PWM会一直连续输出。


One-shot模式:如下图所示,PWM在write CN0后触发一次,每次对CN0写值才会触发PWM输出,且PWM延时时间由CM0减写入的CN0值决定。

CFG中的配置项:

Tom Ch DCyc Compare Shadow Val Sr1

该配置项为用于更新比较寄存器CM1的TOM通道x影子寄存器SR1,用来更新占空比

Tom Ch Period Compare Shadow Val Sr0

该配置项为用于更新比较寄存器CM0的TOM通道x影子寄存器SR0,用来更新周期

TomChEnableForceUpdate

该配置项是选择是否启用强制更新,该触发来自于TGC中的CTRL_TRIG,通过寄存器TOMi_TGC0_FUPD_CTRL中的FUPD_CTRL0选择是否启用该功能

CFG中的配置:

TomChResetCn0OnForceUpdate

和上面的类似,通过寄存器TOMi_TGC0_FUPD_CTRL中的RSTCN0_CH0选择是否在ForceUpdate触发后Reset CN0.

CFG中的配置:

TomChUpdateEnableOnCn0Reset

配置TOM通道从SR0、SR1和CLK_SRC_SR更新寄存器CM0、CM1和CLK-SRC,对应寄存器TOMi_TGC0_GLB_CTRL中的UPEN_CTRL0


CFG中的配置:

TomChannelBitReversalMode

启用信道的位反转模式。设置通道的BITREV位。这仅适用于通道15。基本没用过

CFG中的配置:

TomChannelClockSelect(重要)

选择Tom通道的时钟,该时钟作为CN0计数的频率,例如此处选择的Fixed Clock 0为100M,则当CM0设置为50000时,PWM频率为2Khz

TomChannelCounterCn0Reset(重要)

选择CN0 Reset的方式,一般作为PWM输出时选择CN0到达CM0时触发。一般在需要PWM错相位时,会用到由前一个通道的trigger触发。

TomChannelCounterValCn0

配置CN0的值,一般在PWM连续模式下不用设置

TomChannelDutyCycleCompareValCm1(重要)

配置占空比的值CM1,此处TOM中我们没有配置,后面通过PWM模块来设置

TomChannelPeriodCompareValCm0

配置周期CM0的值,此处TOM中我们没有配置,后面通过PWM模块来设置

TomChannelGatedCounterMode

启用通道的门控计数器模式。对应寄存器TOMi_CHx_CTRL中的GCM位。这仅适用于通道0至7,仅适用于连接到SPE模块的TOM实例。目前没有用过

TomChannelOneShotMode

选择PWM输出模式为One-shot模式,该模式在前面有介绍过了。对应寄存器中TOMi_CHx_CTRL中的OSM

TomChannelSpeMode

启用/禁用通道的传感器模式评估模式。这将设置通道的SPE位。这仅适用于通道0至7。对应寄存器TOMi_CHx_CTRL中的SPEM位。目前没有用过

TomChannelTriggerOutput(重要)

配置TOM通道的trigger触发选择,有两种选择:

TRIG_FROM_PREVIOUS_CHANNEL:trigger来源于上个一个通道的trigger

CCU0_TRIG_OF_CHANNEL:CN0到达CM0时产生的trigger
对于连续的TOM通道,使用TRIG_FROM_PREVIOUS_CHANNEL,以达到PWM错相的功能。(需要引入一个Timer的TOM通道,用来作为Trigger)

TOM Channel Usage

USED_BY_OTHER_DRIVERS_OR_UNUSED: 指定此通道未使用或由其他模块(GPT/PWM)配置。使用CFG中的PWM模块以实现后面的PWM功能

USED_BY_GTM_DRIVER:指定将此通道配置为复杂驱动程序。在使用TOM中断及回调函数时,需要配置为USED_BY_GTM_DRIVER

总结

以上,TOM的配置就介绍完了。如果需要使用中断,还需要配置Irq模块及OS中添加对应的中断及中断源。TOM往上的模块为PWM,实际使用时调用的PWM模块中的函数来设置占空比。后面会继续介绍PWM模块的配置及使用。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赞哥哥s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值