3. レジスタでペリフェラルに直接アクセスする方法¶
ESP32 のペリフェラルは、レジスタを直接読み書きして制御できます。そのためには、データシートを読んで、どのレジスタを使用するか、どの値を書き込むかを知る必要があります。次の例では、MCPWM0 ペリフェラルのプリスケーラをオンにして変更する方法を示しています。
from micropython import const
from machine import mem32
# 使うレジスタアドレスを定義。
DR_REG_DPORT_BASE = const(0x3FF00000)
DPORT_PERIP_CLK_EN_REG = const(DR_REG_DPORT_BASE + 0x0C0)
DPORT_PERIP_RST_EN_REG = const(DR_REG_DPORT_BASE + 0x0C4)
DPORT_PWM0_CLK_EN = const(1 << 17)
MCPWM0 = const(0x3FF5E000)
MCPWM1 = const(0x3FF6C000)
# CLK の有効化と RST の無効化。
print(hex(mem32[DPORT_PERIP_CLK_EN_REG] & 0xffffffff))
print(hex(mem32[DPORT_PERIP_RST_EN_REG] & 0xffffffff))
mem32[DPORT_PERIP_CLK_EN_REG] |= DPORT_PWM0_CLK_EN
mem32[DPORT_PERIP_RST_EN_REG] &= ~DPORT_PWM0_CLK_EN
print(hex(mem32[DPORT_PERIP_CLK_EN_REG] & 0xffffffff))
print(hex(mem32[DPORT_PERIP_RST_EN_REG] & 0xffffffff))
# MCPWM0 プリスケーラの変更。
print(hex(mem32[MCPWM0])) # PWM_CLK_CFG_REG (reset value = 0)の読取り
mem32[MCPWM0] = 0x55 # PWM_CLK_PRESCALE の変更
print(hex(mem32[MCPWM0])) # PWM_CLK_CFG_REG の読取り
ペリフェラルを使う前には、そのクロックを有効にし、リセットを解除する必要があります。上記の例では、以下のレジスタがこのために使用されています。
DPORT_PERI_CLK_EN_REG
: ペリフェラルクロックを有効にするために使われていますDPORT_PERI_RST_EN_REG
: ペリフェラルのリセット(またはリセットの無効化)に使われています
MCPWM0 ペリフェラルは上記2つのレジスタの第17ビットすなわち DPORT_PWM0_CLK_EN
の値になります。