在前面的文章中,我们介绍了GTM中的CMU模块,TIM模块,用来进行PWM波的周期与占空比测量。本文将介绍GTM中的另一个模块TOM,该模块是用来产生PWM波的,主要介绍芯片手册中的内容及Davinci CFG中的配置项。
上图很好的描述了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_CTRL的SL位用来确认输出的有效电平,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中断有两个地方可以产生,一个是CN0计数到达CM0时产生的中断,一般称为Period中断,一个是CN0计数到达CM1时产生的中断,一般称为Duty中断。在Davinci CFG中的配置如下:
对应的寄存器为TOMi_CHx_IRQ_EN的CCU0TC_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信号线将为高电平
Tom Notification用来配置中断触发的回调函数。
2个通道为一组,最后作为中断源:
该中断源最终与OS中对应的TOM中断对应。同时在Irq模块中也要配置开启对应的中断及配置优先级。
该配置表示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
这个触发功能很少用到。
配置通道使能的方式:
一种为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中配置如下图:
与上面的TomChDisableOnTgcTrigger类似,这里是禁止通道输出,对应的寄存器为TOMi_TGC0_OUTEN_CTRL中的OUTEN_CTRLx,需要设置为01B
CFG中配置如下图:
配置何时使能通道的输出,对应寄存器为TOMi_TGC0_OUTEN_CTRL中的OUTEN_CTRL0及TOMi_TGC0_OUTEN_STAT中的OUTEN_STAT0
CFG中配置如下图:
一般使用时配置为ENABLE_OUTPUT_AT_START.
该配置项为TOM输出的PWM初始电平,为Low时先输出低电平,为High时先输出高电平。对应寄存器为TOMi_CHx_CTRL中的SL位
CFG中配置如下图:
选择TOM输出的对应PIN角,该配置项需要与硬件原理图对应,关于TOM通道和PIN角的对应,可以直接在手册中搜索对应的Pin角即可找到。
CFG中配置如下图:
在讲配置参数之前,需要再引入一些概念。在TOM中,两个动作寄存器CM0和CM1可以用影子寄存器SR0和SR1的内容重新加载,此处我们引入占空比同步更新和异步更新。
同步更新:如下图所示,通过对SR1寄存器值更新,使得TOM输出在下一个周期才同步一起更新CM1
异步更新:如下图所示,通过直接对CM1寄存器值更新,使得TOM输出可能在本次周期内输出就发生改变。
**连续模式:**如下图所示,该模式下通道使能后,PWM会一直连续输出。
One-shot模式:如下图所示,PWM在write CN0后触发一次,每次对CN0写值才会触发PWM输出,且PWM延时时间由CM0减写入的CN0值决定。
CFG中的配置项:
该配置项为用于更新比较寄存器CM1的TOM通道x影子寄存器SR1,用来更新占空比
该配置项为用于更新比较寄存器CM0的TOM通道x影子寄存器SR0,用来更新周期
该配置项是选择是否启用强制更新,该触发来自于TGC中的CTRL_TRIG,通过寄存器TOMi_TGC0_FUPD_CTRL中的FUPD_CTRL0选择是否启用该功能
CFG中的配置:
和上面的类似,通过寄存器TOMi_TGC0_FUPD_CTRL中的RSTCN0_CH0选择是否在ForceUpdate触发后Reset CN0.
CFG中的配置:
配置TOM通道从SR0、SR1和CLK_SRC_SR更新寄存器CM0、CM1和CLK-SRC,对应寄存器TOMi_TGC0_GLB_CTRL中的UPEN_CTRL0
CFG中的配置:
启用信道的位反转模式。设置通道的BITREV位。这仅适用于通道15。基本没用过
CFG中的配置:
选择Tom通道的时钟,该时钟作为CN0计数的频率,例如此处选择的Fixed Clock 0为100M,则当CM0设置为50000时,PWM频率为2Khz
选择CN0 Reset的方式,一般作为PWM输出时选择CN0到达CM0时触发。一般在需要PWM错相位时,会用到由前一个通道的trigger触发。
配置占空比的值CM1,此处TOM中我们没有配置,后面通过PWM模块来设置
配置周期CM0的值,此处TOM中我们没有配置,后面通过PWM模块来设置
启用通道的门控计数器模式。对应寄存器TOMi_CHx_CTRL中的GCM位。这仅适用于通道0至7,仅适用于连接到SPE模块的TOM实例。目前没有用过
选择PWM输出模式为One-shot模式,该模式在前面有介绍过了。对应寄存器中TOMi_CHx_CTRL中的OSM位
启用/禁用通道的传感器模式评估模式。这将设置通道的SPE位。这仅适用于通道0至7。对应寄存器TOMi_CHx_CTRL中的SPEM位。目前没有用过
配置TOM通道的trigger触发选择,有两种选择:
TRIG_FROM_PREVIOUS_CHANNEL:trigger来源于上个一个通道的trigger
CCU0_TRIG_OF_CHANNEL:CN0到达CM0时产生的trigger。
对于连续的TOM通道,使用TRIG_FROM_PREVIOUS_CHANNEL,以达到PWM错相的功能。(需要引入一个Timer的TOM通道,用来作为Trigger)
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模块的配置及使用。