我的内核学习笔记16:海思Hi3516平台PWM使用记录

本文介绍海思平台 Hi3516 的 PWM 使用,包括手册介绍及用户空间控制。

一、PWM 概览

芯片一共提供2路独立的 PWM,分别以 PWM0 和 PWM1 称呼。PWM 时钟有3种选择:3MHz、24MHz 和50MHz。周期和高电平拍数使用 26 比特存储,最高支持 25MHz(即50MHz/2)输出,最低约 0.045Hz(即3MHz/ 67108863)输出。输出脉冲个数可指定,也可一直输出,如是前者,最大个数为 1023,因其计数器为 10 比特。
PWM0 基地址为 0x1207_0000, PWM1 基地址为 0x1207_0020,两者地址相差 0x20。除此外,相关寄存器偏移和控制方式,完全一样,故在驱动中可封装为统一接口(参考文后资源)。

二、PWM 控制

2.1 控制方式

  • 将 PWM0 或 PWM1 引脚复用为 PWM。
  • PWM内部工作于 3MHz或者 24MHz或者 50MHz。
  • 选择合适的时钟源,通过计算得到需要的周期数和高电平拍数。
  • 将对应数据写入PWMX_CFG0、PWMX_CFG1、PWMX_CFG2 寄存器。
  • 对PWMX_CTRL bit[0]写入 1,使能PWM 输出。
  • 如果是一直输出,则 PWMX_CFG2 可不设置,但 PWMX_CTRL bit[2] 需写入 1。
    注意,默认时钟是3MHz,并且默认开启了,其值为0x2dc6c0,可用此计算周期。如果需要高频率的,则需要设置高的时钟源。

2.2 示例

1
2
3
4
5
6
7
8
9
10
11
himm 0x111F0028 0x601  // 复用GPIO6_7为PWM1,其它默认
himm 0x111F0028 0x201 // 复用GPIO6_7为PWM1,切换快 其它默认

## 如果设置时钟,其基地址为0x120101bc 默认是3MHz,打开

默认时钟,频率为1:
CFG0 周期 himm 0x12070020 0x2dc6c0 默认399
CFG1 占空比高电平 himm 0x12070024 0x16E360 默认199
CFG2 个数 himm 0x12070028 0xff
CRTL 控制 himm 0x1207002c 0x1
一直输出:himm 0x1207002c 0x5

编写程序,读取PWM1 状态 2 的值:

1
2
3
4
5
6
7
[1970-01-01 00:40:22] state2: 0xc14ff
[1970-01-01 00:40:26] state2: 0xbd4ff
[1970-01-01 00:41:14] state2: 0x8d4ff
[1970-01-01 00:41:43] state2: 0x6f4ff
[1970-01-01 00:41:47] state2: 0x6c4ff
[1970-01-01 00:42:13] state2: 0x514ff
[1970-01-01 00:42:22] state2: 0x494ff

低3个不变者:
4表示0100 0为固定数目方波,1表示正在输出方波,00和后面的表示数目。
ff:表示数目为255个(用户设定)。

未完事宜

设置频率较低,是因为想利用万用表观察电平变化。在上述示例中,GPIO6_7 由低变高,再由高变,偶尔会出现 0.45 这样的值,由于没有示波器,由于仅作实验,未深入研究波形。仅证明可输出不同电平。

参考资料

海思 Hi3516DV300 SoC 用户指南。

李迟 2020.6.23 周二 晚