详情地址:https://fengke.club/GeekMart/views/offline/ai
购买链接:https://fengke.club/GeekMart/su_fKw7Nb7oC.jsp
视频地址:https://fengke.club/GeekMart/su_f9cTSxNsp.jsp
官方QQ群:457586268
PWMPWM(Pulse Width Modulation)即脉冲宽度调制。PWM运用非常的广泛,大到航天飞船,小到便携式USB风扇都可以见到PWM的身影。
许多MCU的定时器均带有PWM模式,CC3200也不例外。
1.1寄存器CC3200通用定时器支持PWM模式。在PWM模式下,定时器被配置为一个24位的减计数器,初始值在GPTMTnILR和GPTMTnPR寄存器中进行定义。在该模式中,PWM频率和周期是同步事件,这样可以消除毛刺。PWM模式可以通过向寄存器 GPTMTnMR中的TnAMS位写入0x01,TnCMR位写入0x00,TnMR位写入0x02。当定时器使能时,装载到定时器寄存器中的值如表1.0.1所示。
表1.0.1 装载到定时器的值
寄存器 | 向下计数模式 | 向上计数模式 |
GPTMTnR | GPTMTnILR | |
GPTMTnV | GPTMTnILR |
当通过软件写GPTMCTL寄存器中的TnEN位时,计数器开始进行减计数直到0。在周期模式中的下一个计数循环,计数器从GPTMTnILR和GPTMTnPR寄存器中装载初始值,并重新开始计数直到通过软件清除GPTMCTL寄存器中的TnEN位进行关闭。该定时器可以通过上升沿、下降沿和边沿触发这3种类型的事件来产生中断。事件类型通过GPTMCTL寄存器中的TnEVENT位来进行配置。中断通过
GPTMTnMR寄存器中的TnPEMIE位来进行使能。当事件发生时,GPTMRIS寄存器中的CnERIS位被置位。并且一直保持到通过GPTMICR寄存器来进行清除。如果捕捉模式事件中断通过GPTMIMR寄存器进行使能,则通用定时器也要置位GPTMMIS寄存器中的CnEMIS位。需要注意的是中断状态只有在TnPWMIE被置位时才会更新。
另外,通过置位GPTMCTL寄存器中的TnOTE位和GPTMDMAEV寄存器中的
CnEDMAEN位使能DMA触发模式,则当TnPWMIE被置位并且发生捕捉时间时, 定时器自动产生DMA的触发事件。
在PWM模式中,GPTMTnR和GPTMTnV寄存器始终保持相同的值。
当计数器的值等于GPTMTnILR和GPTMTnPR寄存器的值时,输出PWM信号, 当计数器的值等于GPTMTnMATCHR和GPTMTnPMR寄存器的值时,信号进行翻转。可以通过软件设置GPTMCTL寄存器中的TnPWML位,来对PWM信号的电平进行翻转。这里要注意的是如果PWM输出翻转使能了,那么边沿检测的行为就会相反,本来上升沿有效的,现在就变成了下降沿有效。
如图1.0.1就是一个产生PWM信号的例子。
图1.0.1 产生PWM信号的例子
GPTMCFG寄存器配置通用定时器模块的全局操作。确定通用定时器工作于32位模式还是16位模式。该寄存器中的值只能是在GPTMCTL寄存器中的TAEN和TBEN 两位被清零时改变。如图1.0.2所示为该寄存器及其位定义。
图1.0.2 GPTMCFG寄存器及其位定义
即把2~0 位写入0,配置为32位定时器模式;写入4,配置为16位定时器模式。
GPTMTAMR寄存器的配置是基于GPTMCFG寄存器的配置来进行选择的。在 PWM模式中,置位TAAMS位、清除TACMR位和配置TAMR为0x01或者0x02。如图1.0.3所示为GPTMTAMR寄存器,如图1.0.4为其位定义。
图1.0.3 GPTMTAMR寄存器
|
图1.0.4 GPTMTAMR寄存器 |
GPTMTBMR寄存器控制独立定时器B的工作模式。当定时器A和定时器B一起使用时,该寄存器被忽略,而是通过GPTMTAMR来控制定时器A和定时器B的工作模式。注意:除了TCACT位,其它位都必须在GPTMCTL寄存器中的TBEN 位清零时进行配置。如图1.0.5所示为GPTMTBMR寄存器,如图1.0.6为其位定义。
图1.0.5 GPTMTBMR寄存器
|
图1.0.6 GPTMTBMR寄存器位定义 |
GPTMCTL寄存器为定时器的控制寄存器,如图1.0.7为GPTMCTL寄存器,如图1.0.8为其位定义。
图1.0.7 GPTMCTL寄存器
|
图1.0.8 GPTMCTL寄存器位定义 |
GPTMIMR寄存器可以软件使能/关闭定时器的控制电平中断。置位可以打开对应的中断,清零可以关闭对应的中断,如图1.0.9所示为GPTMIMR寄存器,如图1.1.0为其位定义。
图1.0.9 GPTMIMR寄存器
|
图1.1.0 GPTMIMR寄存器位定义 |
GPTMRIS寄存器为中断源状态寄存器,通过该寄存器可以获取中断源。如图1.1.1为GPTMRIS寄存器,如图1.1.2为其位定义。
图1.1.1 GPTMRIS寄存器
|
图1.1.2GPTMRIS寄存器位定义 |
GPTMMIS寄存器为中断掩码状态寄存器,可以检测是否产生中断。如图1.1.3所示为GPTMMIS寄存器,如图1.1.4为其位定义。
图1.1.3 GPTMMIS寄存器
|
图1.1.4 GPTMMIS寄存器位定义 |
GPTMICR寄存器用于清除GPTMRIS和GPTMIS寄存器中的状态位,写入1则清除对应的中断。如图1.1.5所示为GPTMICR寄存器,如图1.1.6所示为其位定义。
图1.1.5 GPTMICR寄存器
|
图1.1.6 GPTMICR寄存器位定义 |
当通用定时器被配置为32位模式,GPTMTAILR作为一个32位的寄存器(高16位对应与定时器B装载值寄存器的内容)。在16位模式,寄存器高16位读取值为0,并且对GPTMTBILR寄存器的状态没有影响。如图1.1.7所示为GPTMTAILR寄存器及其位定义。
图1.1.7 GPTMTAILR寄存器及其位定义
当通用定时器配置为32位模式时,GPTMTBILR寄存器中[15:0]位的内容被装载到GPTMTAILR寄存器的高16位。读取GPTMTBILR寄存器,则返回定时器B的当前值,写操作无效。在16位模式,[15:0]位用于装载值。[31:16]位保留不使用。如图1.1.8所示为GPTMTBILR寄存器及其位定义。
图1.1.8 GPTMTBILR寄存器及其位定义
当通用定时器被配置为32位模式时,GPTMTAMATCHR作为32位寄存器(高16位对应与GPTMTBMATCHR寄存器的内容)。在16位模式,寄存器的高16位读取为0,并且对GPTMTBMATCHR的状态没有影响。如图1.1.9所示为寄存器GPTMTAMATCHR及其位定义。
图1.1.9 GPTMTAMATCHR及其位定义
当通用定时器配置为32位模式时,GPTMTBMATCHR寄存器的[15:0]位被装载到寄存器GPTMTAMATCHR寄存器的高16位。读取GPTMTBMATCHR寄存器得到定时器B的当前值,写操作无效。在16位模式中,[15:0]位用于匹配值。[31:16]位保留不使用。如图1.2.0所示为GPTMTBMATCHR寄存器及其位定义。
图1.2.0 GPTMTBMATCHR寄存器及其位定义
GPTMTAPR寄存器通过软件来扩展独立定时器的范围。在单次或者周期减计数模式下该寄存器作为定时计数器的预分频器。如图1.2.1所示为GPTMTAPR寄存器及其位定义。
图1.2.1 GPTMTAPR寄存器及其位定义
GPTMTBPR寄存器通过软件来扩展独立定时器的范围,在单次或者周期减计数模式下该寄存器作为定时计数器的预分频器。如图1.2.2所示为GPTMTBPR寄存器及其位定义。
图1.2.2 GPTMTBPR寄存器及其位定义
GPTMTAPMR寄存器扩展独立定时器GPTMTAMATCHR的范围。当寄存器工作于16位模式时,该寄存器表示[23:16]位。如图1.2.3所示为GPTMTAPMR寄存器及其位定义。
图1.2.3 GPTMTAPMR寄存器及其位定义
GPTMTBPMR寄存器扩展独立定时器GPTMTAMATCHR的范围。当寄存器工作于16位模式时,该寄存器表示[23:16]位。如图1.2.4所示为GPTMTBPMR寄存器及其位定义。
图1.2.4 GPTMTBPMR寄存器及其位定义
当定时器配置为32位模式时,GPTMTAR作为32位寄存器使用(高16位对应 GPTMTBR寄存器的内容)。在16位输入边沿计数,输入边沿定时和PEM模式,[15:0]位包含计数器的值,[23:16]位包含预分频高8位的值。[31:24]位读取值始终为0。可以读取[GPTMTAV]的[23:16]位来获取16位模式单次和周期模式的预分频值。读取GPTMTAPS寄存器可以获取定期快照模式下的预分频值。如图1.2.5所示为GPTMTAR寄存器及其位定义。
图1.2.5 GPTMTAR寄存器及其位定义
当通用定时器配置为32位模式时,GPTMTBR寄存器的[15:0]位被装载到 GPTMTAR寄存器的高16位。读取GPTMTBR寄存器得到定时器B的当前值。在16位模式下,[15:0]位包含计数器的值,[23:16]位包含在输入边沿计数、边沿定时和PWM模式下的预分频。[31:24]位读取为0。可以通过读取GPTMTBV寄存器中的[23:16]位可以获取16位单次和周期模式的预分频值。读取GPTMTBPS寄存器可以获取周期快照模式下的预分频。如图1.2.6所示为GPTMTBR寄存器及其位定义。
图1.2.6 GPTMTBR寄存器及其位定义
当定时器配置为32位模式时,GPTMTAV作为32位寄存器(高16位对应GPTMTBV寄存器的内容)。在16位模式,[15:0]位包含计数器的值,[23:16]位包含分频值。在单次或周期减计数模式,[23:16]位存储真实的预分频值,意味着在减[15:0]位的值之前,先减[23:16]位的值,[31:24]位读取始终为0。如图1.2.7所示为GPTMTAV寄存器及其位定义。
图1.2.7 GPTMTAV寄存器及其位定义
当通用定时器配置为32位模式,GPTMTBV寄存器[15:0]位的值被装载到 GPTMTAV寄存器的高16位。读取GPTMTBV寄存器,则返回定时器B的当前值。在16位模式,[15:0]位包含计数器的值,[23:16]位包含当前的预分频值。在单次或周期模式,[23:16]位为真实的预分频值,意味着在[15:0]位减数之前,[23:16]位先进行减数。[31:24]位读取值为0。如图1.2.8所示为GPTMTBV寄存器及其位定义。
图1.2.8 GPTMTBV寄存器及其位定义
GPTMDMAEV寄存器允许软件使能和关闭定时器DMA触发事件。置位则对应的DMA触发使能,清零则关闭。如图1.2.9所示为GPTMDMAEV寄存器,如图1.3.0所示为其位定义。
图1.2.9 GPTMDMAEV寄存器
|
图1.3.0 GPTMDMAEV寄存器位定义 |
打开Pwm_Demo,在该次工程中主要是实现板子上三颗LED的“呼吸灯”效果,即要把GPIO_9、GPIO_10、GPIO_11三个IO口配置为PWM模式,逐次增加或降低该些端口的占空比即可使LED“呼吸”。如图1.3.1为Pwm_Demo的main函数。
图1.3.1 Pwm_Demo的main函数
首先看到mian函数中的PinMuxConfig()函数,如图2.x所示为该函数的代码。
在该代码中,先使能时钟,然后把Pin64(GPIO_9)、Pin01(GPIO_10)、Pin02(GPIO11)分别配置为模式3,即PWM模式。为什么呢?在datasheet中可以里看到,如图1.3.2所示的端口复用图,在该图中可以看到Pin64(GPIO_9)在模式3下会被复用为PWM_05;Pin01(GPIO_10)在模式3下会被复用为PWM_06;Pin02(GPIO_11)在模式3下会被复用为PWM_07。
图1.3.2 PinMuxConfig0函数代码
|
图1.3.3 端口复用图 |
配置好PWM输出引脚后,就该把定时器与该输出引脚关联起来,在main函数中的InitPWMModules()函数是关键,如图1.3.4为InitPWMModules()函数。
图1.3.4 InitPWMModules()函数
在该函数中的SetupTimerPWMMode()把Timer2的Timer B与PWM_5即GPIO_9关联起来;把Timer3的Timer B与PWM_6即GPIO_10关联起来;把Timer3的Timer A与PWM_7即GPIO_11关联起来。问题来了,为什么这样就能关联起来了呢?打开CC3200的《Technical Reference Manual》即常说的参考手册,可以看到一个定时器与引脚映射图,如图1.3.5所示。
图1.3.5 定时器与引脚映射图
在该图中可以清楚的看到PWM_5正是对应着Timer2的Timer B;PWM_6正是对应着Timer3的Timer A;PWM_7正是对应着Timer3的Timer B。
回到main函数中,实现LED呼吸的部分代码,如图1.3.6所示。
图1.3.6 LED“呼吸”实现部分代码
该代码主要就是不断地改变输出端的占空比,从而实现LED的“呼吸”。编译代码,打开UniFlash,把Bin文件下载到板子上(参考GPIO小节)。把拨码开关D5、D6、D7拨到“ON”,按下复位,可以看到如图1.3.7所示的LED“呼吸”效果。
图1.3.7 LED“呼吸”效果