RISC-V MCU中文社区

【分享】 HbirdV2-SoC自带pwm配置介绍

发表于 全国大学生集成电路创新创业大赛 2021-06-09 22:46:49
1
2940
2

1    队伍介绍

参赛队名:0 ERROR         队伍编号:CICC1957

本篇主要介绍蜂鸟HbirdV2-SoC自带外设PWM的配置

2    PWM寄存器介绍

在芯来的e203官方手册中,外设部分对PWM进行了详细的介绍。有STM32系列不同,e203TIMPWM整合为同一个硬件模块,4TIM能同时输出PWM波或作为定时器使用。e203中对PWM的寄存器定义如下所示。


但是,相比于gpiouart等,芯来提供的源码并没有对PWM部分进行详尽的代码封装,因此,想要使用PWM,就必须先对PWM寄存器详细解读。下图展示了源码中部分PWM函数。


对于e203PWM,其总线地址为0x1001_5000(已经在hbirdv2.hdefinePWM_BASE)。接下来以4TIM中的TIM0为例,介绍TIMx各个寄存器。

2.1    TIMx_CMD寄存器

官方手册中,对TIMx_CMD寄存器中各域的定义如下:


该寄存器仅低5位为有效位,控制TIMx的运行。配置该寄存器为0x1表示启动TIMx计数;配置为0x2表示暂停TIMx计数;配置为0x4表示更新TIMx的其它寄存器配置;配置为0x8表示重置TIMx的计数值。(0x10暂时没用上,效果不明)

2.2    TIMx_CFG寄存器

官方手册中,对TIMx_CFG寄存器中各域的定义如下:


[23:16]bit为预分频寄存器;实际计数的频率为

 


   

其中,orig_freq由第11bitCLKSEL域决定,该域为0时,选择主时钟(16MHz)作为计数源;该域为1时,选择RTC32.768KHz)作为计数源。因此,可以利用主时钟来达到微秒级的计数。

12bitUPDOWNSEL域,该域用于控制TIMx计数到阈值时的行为。为0时,TIMx向上计数到阈值后继续向下计数;为1时,TIMx向上计数到阈值后将计数值重置为0,继续向上计数。

[10:8]bit用于配置TIMx的启动方式,其中,设置为0x0时比较实用,此时,TIMx在每一个时钟都触发事件,进行计数;其它值的效果也如图中描述所示。

[7:0]bit用于配置TIMx的输入源,用于触发事件,进行计数。

2.3    TIMx_TH寄存器

官方手册中,对TIMx_TH寄存器中各域的定义如下:


该寄存器比较简单,用于设置TIMx的计数初值和阈值。

2.4    TIMx_CHn_TH寄存器

作为PWMTIMx4路输出通道ch0ch1ch2ch3,可以用于输出不同的PWM。这些输出通道复用于GPIO引脚,具体复用情况见官方手册的GPIO章节。对于每一个TIM的每一个通道,都有独立的寄存器可以进行配置。

官方手册对于TIMx_CH0_TH的描述如下:

其中,[15:0]bitTH域,用于配置该通道的触发计数值。TIMx的计数值达到该值后,会触发MODE域的事件。

[18:16]bitMOD域,用于配置达到计数值后进行的事件。0x0表示触发后,将CH0的输出置数为1(可以用于设置PWM波);0x1表示触发后,将CH0的输出翻转,在下一次达到触发条件口,置0(该模式目前没有尝试过);其他模式同理。


2.5    TIMx_CNT寄存器

官方手册中,对TIMx_CFG寄存器中各域的定义如下:

该寄存器为只读寄存器,存储则TIMx当前的计数值(可以用于计算程序的运行时间等)


2.6    PWM_ENT_CFGPWM_TIMER_EN寄存器

这两个寄存器用于配置PWM的中断状态,官方手册中也给出的详细定义,这里不再赘述。部分定义如下图所示。


3    重构PWM相关函数

了解以上寄存器定义后,就可以编写PWM相关函数。这里对几个比较实用的函数进行重构编写,基本覆盖了PWM所有功能。由于相关函数文字较多,不在正文中列出,具体文件文件及函数介绍均在附件中给出,建议以UTF-8格式打开,防止乱码。

下载:timer





喜欢2
用户评论 (1)
陈洪玮

陈洪玮 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板