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 の値になります。