本文介紹海思平臺 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 示例
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 的值:
[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 用戶指南。
https://github.com/Tvirus/hisi_pwm_driver
李遲 2020.6.23 週二 晚