参赛队名:0 ERROR 队伍编号:CICC1957
本篇主要介绍蜂鸟HbirdV2-SoC自带外设PWM的配置
在芯来的e203官方手册中,外设部分对PWM进行了详细的介绍。有STM32系列不同,e203将TIM和PWM整合为同一个硬件模块,4路TIM能同时输出PWM波或作为定时器使用。e203中对PWM的寄存器定义如下所示。
但是,相比于gpio,uart等,芯来提供的源码并没有对PWM部分进行详尽的代码封装,因此,想要使用PWM,就必须先对PWM寄存器详细解读。下图展示了源码中部分PWM函数。
对于e203的PWM,其总线地址为0x1001_5000(已经在hbirdv2.h中define为PWM_BASE)。接下来以4路TIM中的TIM0为例,介绍TIMx各个寄存器。
官方手册中,对TIMx_CMD寄存器中各域的定义如下:
该寄存器仅低5位为有效位,控制TIMx的运行。配置该寄存器为0x1表示启动TIMx计数;配置为0x2表示暂停TIMx计数;配置为0x4表示更新TIMx的其它寄存器配置;配置为0x8表示重置TIMx的计数值。(0x10暂时没用上,效果不明)。
官方手册中,对TIMx_CFG寄存器中各域的定义如下:
[23:16]bit为预分频寄存器;实际计数的频率为
|
|
|
其中,orig_freq由第11bit,CLKSEL域决定,该域为0时,选择主时钟(16MHz)作为计数源;该域为1时,选择RTC(32.768KHz)作为计数源。因此,可以利用主时钟来达到微秒级的计数。
第12bit为UPDOWNSEL域,该域用于控制TIMx计数到阈值时的行为。为0时,TIMx向上计数到阈值后继续向下计数;为1时,TIMx向上计数到阈值后将计数值重置为0,继续向上计数。
[10:8]bit用于配置TIMx的启动方式,其中,设置为0x0时比较实用,此时,TIMx在每一个时钟都触发事件,进行计数;其它值的效果也如图中描述所示。
[7:0]bit用于配置TIMx的输入源,用于触发事件,进行计数。
官方手册中,对TIMx_TH寄存器中各域的定义如下:
该寄存器比较简单,用于设置TIMx的计数初值和阈值。
作为PWM,TIMx有4路输出通道ch0,ch1,ch2和ch3,可以用于输出不同的PWM。这些输出通道复用于GPIO引脚,具体复用情况见官方手册的GPIO章节。对于每一个TIM的每一个通道,都有独立的寄存器可以进行配置。
官方手册对于TIMx_CH0_TH的描述如下:
其中,[15:0]bit为TH域,用于配置该通道的触发计数值。TIMx的计数值达到该值后,会触发MODE域的事件。
[18:16]bit为MOD域,用于配置达到计数值后进行的事件。0x0表示触发后,将CH0的输出置数为1(可以用于设置PWM波);0x1表示触发后,将CH0的输出翻转,在下一次达到触发条件口,置0(该模式目前没有尝试过);其他模式同理。
官方手册中,对TIMx_CFG寄存器中各域的定义如下:
该寄存器为只读寄存器,存储则TIMx当前的计数值(可以用于计算程序的运行时间等)。
这两个寄存器用于配置PWM的中断状态,官方手册中也给出的详细定义,这里不再赘述。部分定义如下图所示。
了解以上寄存器定义后,就可以编写PWM相关函数。这里对几个比较实用的函数进行重构编写,基本覆盖了PWM所有功能。由于相关函数文字较多,不在正文中列出,具体文件文件及函数介绍均在附件中给出,建议以UTF-8格式打开,防止乱码。