# --- gpio_sio.py - 088.09.2022 # def gpio_info(pin, show_regs = True): # Liefert zu dem gewählten Pin die Information zu: # - input oder output, high oder low # - Pullups, funcsel # show_regs: zeigt zusätzlich die Registerinhalte an status = _gpio_status_reg(pin) ctrl = _gpio_ctrl_reg(pin) pad_ctrl = _gpio_pad_ctrl_reg(pin) print(f"\nPin '{pin:2}' is - ", end = "") if status & 0x3000: print("Output: ", end = "") if status & 0x300: print("high", end = "") else: print("low ", end = "") else: print("Input : ", end = "") if status & 0x000E_0000: print("high", end = "") else: print("low ", end = "") print(", Pull_Up: ", end = "") if pad_ctrl & 0x08: print("enabled ", end = "") else: print("disabled", end = "") print(", Pull_Down: ", end = "") if pad_ctrl & 0x04: print("enabled ", end = "") else: print("disabled", end = "") print(f", FUNCSEL: 0x{ctrl & 0x1F:02X}") if show_regs: print("Pin_Status - Pin_Ctrl - Pad_Ctrl") print(f"0x{status:08x} - 0x{ctrl:08x} - 0b{pad_ctrl:08b}") @micropython.asm_thumb # Status-Register = IO_BASE + 8 * pin + offset 0 # _gpio_status_reg(pin) def _gpio_status_reg(r0): # Liefert für den gewählten Pin den Inhalt des Status Registers zurück align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0x4000, 0x4001) label(START) ldr(r7, [r7, 0]) # r7 = IO_BASE mov(r3, 8) # pin offset mul(r3, r0) # offset * pin add(r7, r7, r3) ldr(r0, [r7, 0]) # register offset 0 @micropython.asm_thumb # Ctrl-Register - IO_BASE + 8 * pin + offset 4 # _gpio_ctrl_reg(pin) def _gpio_ctrl_reg(r0): # Liefert für den gewählten Pin den Inhalt des Ctrl-Registers zurück align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0x4000, 0x4001) label(START) ldr(r7, [r7, 0]) # r7 = IO_BASE mov(r3, 8) # pin offset mul(r3, r0) # offset * pin add(r7, r7, r3) ldr(r0, [r7, 4]) # ctrl-register offset 4 @micropython.asm_thumb # Pad-Ctrl-Register = PAD_BASE + 4 * pin + offset 4 # _gpio_pad_ctrl_reg(pin) def _gpio_pad_ctrl_reg(r0): # Liefert für den gewählten Pin den Inhalt des pad-ctrl-Registers zurück align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0xC000, 0x4001) label(START) ldr(r7, [r7, 0]) # r7 = PAD_BASE mov(r3, 4) # pin offset mul(r3, r0) # offset * pin add(r7, r7, r3) # pin adr ldrb(r0, [r7, 4]) # byte offset 4 @micropython.asm_thumb # Pad-Ctrl-Register = PAD_BASE + 4 * pin + offset 4 # gpio_pulls(pin, 0|1) def gpio_pulls(r0, r1): # Setzt für den gewähtlen Pin Pullup | Pulldown align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0xC000, 0x4001) label(START) ldr(r7, [r7, 0]) # r7 = PAD_BASE # r1 -> 0 = PULLDOWN, > 0 = PULLUP mov(r3, 4) # pin offset mul(r3, r0) # offset * pin add(r7, r7, r3) # pin adr ldrb(r3, [r7, 4]) # byte offset 4 mov(r4, 0b1111_0011)# maskout pullup + pulldown bit and_(r3, r4) cmp(r1, 0) beq(PULLDOWN) mov(r4, 0b0000_1000)# pullup b(NEXT) label(PULLDOWN) mov(r4, 0b0000_0100)# puLLDOWN = default label(NEXT) orr(r3, r4) strb(r3, [r7, 4]) @micropython.asm_thumb # Ctrl-Register - IO_BASE + 8 * pin + offset 4 # gpio_init(pin, funcsel) def gpio_init(r0, r1): # Setzt dengewählten Pin als input mit funcsel = r1 align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0x4000, 0x4001) label(START) ldr(r7, [r7, 0]) # r7 = IO_BASE mov(r3, 8) # pin offset mul(r3, r0) # offset * pin add(r7, r7, r3) str(r1, [r7, 4]) # FUNCSEL r1 # --- SIO -- GPIO_IN ----------------------------------------- @micropython.asm_thumb # gpio_in() def gpio_in(): # Gibt den Input-Status aller Pins zurück align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE ldr(r0, [r7, 0x04]) @micropython.asm_thumb # gpio_in_pin(Pin_Nr) def gpio_in_pin(r0): # Gibt den Input-Status eines einzigen Input-Pins zurück align(4) mov(r7, pc) # r7 = star_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE ldr(r1, [r7, 0x04]) lsr(r1, r0) mov(r2, 1) and_(r1, r2) mov(r0, r1) # --- SIO -- GPIO_OUT ---------------------------------------- @micropython.asm_thumb # gpio_out(mask) def gpio_out(r0): # Setzt die Output-Pins auf den Wert der Maske align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x10]) @micropython.asm_thumb # gpio_out_set(mask) def gpio_out_set(r0): # Setzt die Output-Pins der Maske auf High align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x14]) @micropython.asm_thumb # gpio_out_clr(mask) def gpio_out_clr(r0): # Setzt die Output-Pins der Maske auf LOW align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x18]) @micropython.asm_thumb # gpio_out_xor(mask) def gpio_out_xor(r0): # Toggled die maskierten Output-Pins align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x1C]) # --- SIO -- GPIO_OE ---------------------------------------- @micropython.asm_thumb # gpio_oe(mask) def gpio_oe(r0): # Output Enable: Konfiguriert die gesetzten Pins als Output # die nicht gestzten Pins als Input align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x20]) @micropython.asm_thumb # gpio_oe_set(mask) def gpio_oe_set(r0): # Output Enable: Konfiguriert die gesetzten Pins als Output align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x24]) @micropython.asm_thumb # gpio_oe_set(mask) def gpio_oe_clr(r0): # Output Enable: Konfiguriert die gesetzten Pins als Imput align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x28]) @micropython.asm_thumb # gpio_oe_set(mask) def gpio_oe_xor(r0): # Output Enable: toggled die Output-Dir der gesetzten Pins align(4) mov(r7, pc) # r7 = start_adr of data b(START) data(2, 0x0000, 0xD000) label(START) ldr(r7, [r7, 0]) # r7 = SIO_BASE str(r0, [r7, 0x2C]) # ----------------------------------------------- if __name__ == "__main__": import time # """ # Pin 25 = onboard LED gpio_init(25, 5) # FUNCSEL = 5 gpio_pulls(25, 0) # default Pullup low gpio_oe_set(1<<25) # Output gpio_out_clr(1<<25) # low gpio_info(25) for i in range(20): time.sleep(.3) gpio_out_xor(1<<25) gpio_info(25) gpio_oe_clr(1<<25) # input gpio_pulls(25, 1) # Pullup nach High gpio_info(25) print(f"\ngpio_in: {gpio_in():032b}") print(f"Pin 25 is *{gpio_in_pin(25)}'") # gpio_info(26) # """ """ for i in range(5): gpio_init(i, 5) # funcsel 5 gpio_oe_set(0x0F) mask = 1 for _ in range(50): gpio_out(mask) mask <<= 1 mask &= 0x1F if mask == 0: mask = 1 time.sleep(.2) """