docs/esp32/tutorial: Add example for pin access via registers.
Synchronous access to pins directly via registers. Signed-off-by: Ihor Nehrutsa <Ihor.Nehrutsa@gmail.com>
This commit is contained in:
parent
304f13a74e
commit
1a5bfa5024
Binary file not shown.
After Width: | Height: | Size: 200 KiB |
|
@ -42,3 +42,83 @@ for this:
|
|||
|
||||
The MCPWM0 peripheral is in bit position 17 of the above two registers, hence
|
||||
the value of ``DPORT_PWM0_CLK_EN``.
|
||||
|
||||
Synchronous access to pins directly via registers
|
||||
-------------------------------------------------
|
||||
|
||||
The following code shows how to access pins directly via registers. It has been
|
||||
tested on a generic ESP32 board. It configures pins 16, 17, 32 and 33 in output
|
||||
mode via registers, and switches pin output values via registers. Pins 16 and
|
||||
17 are switched simultaneously.
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
from micropython import const
|
||||
from machine import mem32, Pin
|
||||
|
||||
GPIO_OUT_REG = const(0x3FF44004) # GPIO 0-31 output register
|
||||
GPIO_OUT1_REG = const(0x3FF44010) # GPIO 32-39 output register
|
||||
|
||||
GPIO_ENABLE_REG = const(0x3FF44020) # GPIO 0-31 output enable register
|
||||
GPIO_ENABLE1_REG = const(0x3FF4402C) # GPIO 32-39 output enable register
|
||||
|
||||
M16 = 1 << 16 # Pin(16) bit mask
|
||||
M17 = 1 << 17 # Pin(17) bit mask
|
||||
|
||||
M32 = 1 << (32-32) # Pin(32) bit mask
|
||||
M33 = 1 << (33-32) # Pin(33) bit mask
|
||||
|
||||
# Enable pin output mode like
|
||||
# p16 = Pin(16, mode=Pin.OUT)
|
||||
# p17 = Pin(17, mode=Pin.OUT)
|
||||
# p32 = Pin(32, mode=Pin.OUT)
|
||||
# p33 = Pin(33, mode=Pin.OUT)
|
||||
mem32[GPIO_ENABLE_REG] = mem32[GPIO_ENABLE_REG] | M16 | M17
|
||||
mem32[GPIO_ENABLE1_REG] = mem32[GPIO_ENABLE1_REG] | M32 | M33
|
||||
|
||||
print(hex(mem32[GPIO_OUT_REG]), hex(mem32[GPIO_OUT1_REG]))
|
||||
|
||||
# Set outputs to 1 like
|
||||
# p16(1)
|
||||
# p17(1)
|
||||
# p32(1)
|
||||
# p33(1)
|
||||
mem32[GPIO_OUT_REG] = mem32[GPIO_OUT_REG] | M16 | M17
|
||||
mem32[GPIO_OUT1_REG] = mem32[GPIO_OUT1_REG] | M32 | M33
|
||||
|
||||
print(hex(mem32[GPIO_OUT_REG]), hex(mem32[GPIO_OUT1_REG]))
|
||||
|
||||
# Set outputs to 0 like
|
||||
# p16(0)
|
||||
# p17(0)
|
||||
# p32(0)
|
||||
# p33(0)
|
||||
mem32[GPIO_OUT_REG] = mem32[GPIO_OUT_REG] & ~(M16 | M17)
|
||||
mem32[GPIO_OUT1_REG] = mem32[GPIO_OUT1_REG] & ~(M32 | M33)
|
||||
|
||||
print(hex(mem32[GPIO_OUT_REG]), hex(mem32[GPIO_OUT1_REG]))
|
||||
|
||||
while True:
|
||||
# Set outputs to 1
|
||||
mem32[GPIO_OUT_REG] = mem32[GPIO_OUT_REG] | M16 | M17
|
||||
mem32[GPIO_OUT1_REG] = mem32[GPIO_OUT1_REG] | M32 | M33
|
||||
|
||||
# Set outputs to 0
|
||||
mem32[GPIO_OUT_REG] = mem32[GPIO_OUT_REG] & ~(M16 | M17)
|
||||
mem32[GPIO_OUT1_REG] = mem32[GPIO_OUT1_REG] & ~(M32 | M33)
|
||||
|
||||
|
||||
Output is::
|
||||
|
||||
0x0 0x0
|
||||
0x30000 0x3
|
||||
0x0 0x0
|
||||
|
||||
Pins 16 and 17 are switched synchronously:
|
||||
|
||||
.. image:: img/mem32_gpio_output.jpg
|
||||
|
||||
Same image on pins 32 and 33.
|
||||
|
||||
Note that pins 34-36 and 39 are inputs only. Also pins 1 and 3 are Tx, Rx of the REPL UART,
|
||||
pins 6-11 are connected to the built-in SPI flash.
|
||||
|
|
Loading…
Reference in New Issue