From 992b3c5b97c597fbe55c2c58ec70c1fb9cb95597 Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Wed, 1 Jan 2025 12:23:18 +0100 Subject: [PATCH] Add `gpio_set_af` to set alternative function of a pin --- build/final.elf | Bin 55056 -> 55328 bytes build/final.elf.map | 74 ++--- build/gpio.S | 769 +++++++++++++++++++++++++++----------------- build/gpio.i | 21 +- build/gpio.o | Bin 42288 -> 42920 bytes build/main.S | 2 +- build/main.i | 5 +- build/main.o | Bin 48580 -> 48580 bytes src/gpio.c | 12 + src/gpio.h | 1 + 10 files changed, 549 insertions(+), 335 deletions(-) diff --git a/build/final.elf b/build/final.elf index b9785a129d8f271da41924eecd43cf9001d5c69e..4974603064a1839a673dbabdba1e2aa6d0587b2f 100755 GIT binary patch delta 18219 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 diff --git a/build/final.elf.map b/build/final.elf.map index 5718856..2a42ce1 100644 --- a/build/final.elf.map +++ b/build/final.elf.map @@ -18,6 +18,8 @@ Discarded input sections .text 0x00000000 0x0 build/gpio.o .data 0x00000000 0x0 build/gpio.o .bss 0x00000000 0x0 build/gpio.o + .text.gpio_set_af + 0x00000000 0x98 build/gpio.o .group 0x00000000 0xc build/main.o .group 0x00000000 0xc build/main.o .group 0x00000000 0xc build/main.o @@ -261,38 +263,38 @@ LOAD build/timer.o OUTPUT(build/final.elf elf32-littlearm) LOAD linker stubs -.debug_info 0x00000000 0xb10 - .debug_info 0x00000000 0x205 build/gpio.o - .debug_info 0x00000205 0x44e build/main.o - .debug_info 0x00000653 0x188 build/startup.o - .debug_info 0x000007db 0x335 build/timer.o +.debug_info 0x00000000 0xb6d + .debug_info 0x00000000 0x262 build/gpio.o + .debug_info 0x00000262 0x44e build/main.o + .debug_info 0x000006b0 0x188 build/startup.o + .debug_info 0x00000838 0x335 build/timer.o -.debug_abbrev 0x00000000 0x439 - .debug_abbrev 0x00000000 0x119 build/gpio.o - .debug_abbrev 0x00000119 0x144 build/main.o - .debug_abbrev 0x0000025d 0x127 build/startup.o - .debug_abbrev 0x00000384 0xb5 build/timer.o +.debug_abbrev 0x00000000 0x43d + .debug_abbrev 0x00000000 0x11d build/gpio.o + .debug_abbrev 0x0000011d 0x144 build/main.o + .debug_abbrev 0x00000261 0x127 build/startup.o + .debug_abbrev 0x00000388 0xb5 build/timer.o -.debug_aranges 0x00000000 0xa8 +.debug_aranges 0x00000000 0xb0 .debug_aranges - 0x00000000 0x28 build/gpio.o + 0x00000000 0x30 build/gpio.o .debug_aranges - 0x00000028 0x28 build/main.o + 0x00000030 0x28 build/main.o .debug_aranges - 0x00000050 0x30 build/startup.o + 0x00000058 0x30 build/startup.o .debug_aranges - 0x00000080 0x28 build/timer.o + 0x00000088 0x28 build/timer.o .debug_rnglists - 0x00000000 0x6c + 0x00000000 0x73 .debug_rnglists - 0x00000000 0x19 build/gpio.o + 0x00000000 0x20 build/gpio.o .debug_rnglists - 0x00000019 0x1b build/main.o + 0x00000020 0x1b build/main.o .debug_rnglists - 0x00000034 0x1f build/startup.o + 0x0000003b 0x1f build/startup.o .debug_rnglists - 0x00000053 0x19 build/timer.o + 0x0000005a 0x19 build/timer.o .debug_macro 0x00000000 0x3ba0 .debug_macro 0x00000000 0xb56 build/gpio.o @@ -321,20 +323,20 @@ LOAD linker stubs .debug_macro 0x00002f20 0xb5c build/timer.o .debug_macro 0x00003a7c 0x124 build/timer.o -.debug_line 0x00000000 0x4b3 - .debug_line 0x00000000 0x116 build/gpio.o - .debug_line 0x00000116 0x1d4 build/main.o - .debug_line 0x000002ea 0xea build/startup.o - .debug_line 0x000003d4 0xdf build/timer.o +.debug_line 0x00000000 0x516 + .debug_line 0x00000000 0x179 build/gpio.o + .debug_line 0x00000179 0x1d4 build/main.o + .debug_line 0x0000034d 0xea build/startup.o + .debug_line 0x00000437 0xdf build/timer.o -.debug_str 0x00000000 0x5eba - .debug_str 0x00000000 0x5375 build/gpio.o - 0x551d (size before relaxing) - .debug_str 0x00005375 0xab1 build/main.o +.debug_str 0x00000000 0x5ed0 + .debug_str 0x00000000 0x538b build/gpio.o + 0x553b (size before relaxing) + .debug_str 0x0000538b 0xab1 build/main.o 0x5f7e (size before relaxing) - .debug_str 0x00005e26 0x88 build/startup.o + .debug_str 0x00005e3c 0x88 build/startup.o 0x3cdc (size before relaxing) - .debug_str 0x00005eae 0xc build/timer.o + .debug_str 0x00005ec4 0xc build/timer.o 0x5b16 (size before relaxing) .comment 0x00000000 0x45 @@ -370,8 +372,8 @@ LOAD linker stubs 0x00000278 0x8 build/timer.o 0x25b (size before relaxing) -.debug_frame 0x00000000 0x16c - .debug_frame 0x00000000 0x60 build/gpio.o - .debug_frame 0x00000060 0x50 build/main.o - .debug_frame 0x000000b0 0x6c build/startup.o - .debug_frame 0x0000011c 0x50 build/timer.o +.debug_frame 0x00000000 0x194 + .debug_frame 0x00000000 0x88 build/gpio.o + .debug_frame 0x00000088 0x50 build/main.o + .debug_frame 0x000000d8 0x6c build/startup.o + .debug_frame 0x00000144 0x50 build/timer.o diff --git a/build/gpio.S b/build/gpio.S index 499cfd0..9e89fa0 100644 --- a/build/gpio.S +++ b/build/gpio.S @@ -102,16 +102,16 @@ gpio_set_mode: .cfi_endproc .LFE0: .size gpio_set_mode, .-gpio_set_mode - .section .text.gpio_write,"ax",%progbits + .section .text.gpio_set_af,"ax",%progbits .align 1 - .global gpio_write + .global gpio_set_af .syntax unified .thumb .thumb_func - .type gpio_write, %function -gpio_write: + .type gpio_set_af, %function +gpio_set_af: .LFB1: - .loc 1 13 40 + .loc 1 13 44 .cfi_startproc @ args = 0, pretend = 0, frame = 16 @ frame_needed = 1, uses_anonymous_args = 0 @@ -138,30 +138,80 @@ gpio_write: lsls r3, r3, #10 .loc 1 14 16 str r3, [r7, #12] - .loc 1 15 32 + .loc 1 15 17 ldrh r3, [r7, #6] + .loc 1 15 7 and r3, r3, #15 - .loc 1 15 24 - movs r2, #3 - lsls r2, r2, r3 - .loc 1 15 55 - ldrb r3, [r7, #5] @ zero_extendqisi2 - cmp r3, #0 - beq .L3 - .loc 1 15 55 is_stmt 0 discriminator 1 - movs r3, #0 - b .L4 -.L3: - .loc 1 15 55 discriminator 2 - movs r3, #16 -.L4: - .loc 1 15 43 is_stmt 1 discriminator 4 - lsl r3, r2, r3 - mov r2, r3 - .loc 1 15 14 discriminator 4 + str r3, [r7, #8] + .loc 1 16 6 + ldr r3, [r7, #8] + cmp r3, #7 + bgt .L3 + .loc 1 17 6 ldr r3, [r7, #12] - str r2, [r3, #24] - .loc 1 16 1 discriminator 4 + ldr r3, [r3, #32] + .loc 1 17 32 + ldr r2, [r7, #8] + lsls r2, r2, #2 + .loc 1 17 25 + movs r1, #15 + lsl r2, r1, r2 + .loc 1 17 16 + mvns r2, r2 + .loc 1 17 13 + ands r2, r2, r3 + ldr r3, [r7, #12] + str r2, [r3, #32] + .loc 1 18 6 + ldr r3, [r7, #12] + ldr r3, [r3, #32] + .loc 1 18 20 + ldrb r2, [r7, #5] @ zero_extendqisi2 + and r1, r2, #15 + .loc 1 18 37 + ldr r2, [r7, #8] + lsls r2, r2, #2 + .loc 1 18 30 + lsl r2, r1, r2 + .loc 1 18 13 + orrs r2, r2, r3 + ldr r3, [r7, #12] + str r2, [r3, #32] + .loc 1 23 1 + b .L5 +.L3: + .loc 1 20 6 + ldr r3, [r7, #12] + ldr r3, [r3, #36] + .loc 1 20 32 + ldr r2, [r7, #8] + lsls r2, r2, #2 + .loc 1 20 25 + movs r1, #15 + lsl r2, r1, r2 + .loc 1 20 16 + mvns r2, r2 + .loc 1 20 13 + ands r2, r2, r3 + ldr r3, [r7, #12] + str r2, [r3, #36] + .loc 1 21 6 + ldr r3, [r7, #12] + ldr r3, [r3, #36] + .loc 1 21 20 + ldrb r2, [r7, #5] @ zero_extendqisi2 + and r1, r2, #15 + .loc 1 21 37 + ldr r2, [r7, #8] + lsls r2, r2, #2 + .loc 1 21 30 + lsl r2, r1, r2 + .loc 1 21 13 + orrs r2, r2, r3 + ldr r3, [r7, #12] + str r2, [r3, #36] +.L5: + .loc 1 23 1 nop adds r7, r7, #20 .cfi_def_cfa_offset 4 @@ -174,6 +224,79 @@ gpio_write: bx lr .cfi_endproc .LFE1: + .size gpio_set_af, .-gpio_set_af + .section .text.gpio_write,"ax",%progbits + .align 1 + .global gpio_write + .syntax unified + .thumb + .thumb_func + .type gpio_write, %function +gpio_write: +.LFB2: + .loc 1 25 40 + .cfi_startproc + @ args = 0, pretend = 0, frame = 16 + @ frame_needed = 1, uses_anonymous_args = 0 + @ link register save eliminated. + push {r7} + .cfi_def_cfa_offset 4 + .cfi_offset 7, -4 + sub sp, sp, #20 + .cfi_def_cfa_offset 24 + add r7, sp, #0 + .cfi_def_cfa_register 7 + mov r3, r0 + mov r2, r1 + strh r3, [r7, #6] @ movhi + mov r3, r2 + strb r3, [r7, #5] + .loc 1 26 83 + ldrh r3, [r7, #6] + lsrs r3, r3, #8 + uxth r3, r3 + .loc 1 26 38 + add r3, r3, #1048576 + adds r3, r3, #128 + lsls r3, r3, #10 + .loc 1 26 16 + str r3, [r7, #12] + .loc 1 27 32 + ldrh r3, [r7, #6] + and r3, r3, #15 + .loc 1 27 24 + movs r2, #3 + lsls r2, r2, r3 + .loc 1 27 55 + ldrb r3, [r7, #5] @ zero_extendqisi2 + cmp r3, #0 + beq .L7 + .loc 1 27 55 is_stmt 0 discriminator 1 + movs r3, #0 + b .L8 +.L7: + .loc 1 27 55 discriminator 2 + movs r3, #16 +.L8: + .loc 1 27 43 is_stmt 1 discriminator 4 + lsl r3, r2, r3 + mov r2, r3 + .loc 1 27 14 discriminator 4 + ldr r3, [r7, #12] + str r2, [r3, #24] + .loc 1 28 1 discriminator 4 + nop + adds r7, r7, #20 + .cfi_def_cfa_offset 4 + mov sp, r7 + .cfi_def_cfa_register 13 + @ sp needed + ldr r7, [sp], #4 + .cfi_restore 7 + .cfi_def_cfa_offset 0 + bx lr + .cfi_endproc +.LFE2: .size gpio_write, .-gpio_write .text .Letext0: @@ -182,16 +305,16 @@ gpio_write: .file 4 "src/gpio.h" .section .debug_info,"",%progbits .Ldebug_info0: - .4byte 0x201 + .4byte 0x25e .2byte 0x5 .byte 0x1 .byte 0x4 .4byte .Ldebug_abbrev0 - .uleb128 0x8 - .4byte .LASF894 + .uleb128 0xa + .4byte .LASF898 .byte 0x1d - .4byte .LASF895 - .4byte .LASF896 + .4byte .LASF899 + .4byte .LASF900 .4byte .LLRL0 .4byte 0 .4byte .Ldebug_line0 @@ -200,6 +323,12 @@ gpio_write: .byte 0x1 .byte 0x6 .4byte .LASF863 + .uleb128 0x2 + .4byte .LASF866 + .byte 0x2 + .byte 0x2b + .byte 0x17 + .4byte 0x3d .uleb128 0x1 .byte 0x1 .byte 0x8 @@ -208,187 +337,191 @@ gpio_write: .byte 0x2 .byte 0x5 .4byte .LASF865 - .uleb128 0x3 - .4byte .LASF868 + .uleb128 0x2 + .4byte .LASF867 .byte 0x2 .byte 0x39 .byte 0x1c - .4byte 0x4b + .4byte 0x57 .uleb128 0x1 .byte 0x2 .byte 0x7 - .4byte .LASF866 + .4byte .LASF868 .uleb128 0x1 .byte 0x4 .byte 0x5 - .4byte .LASF867 - .uleb128 0x3 .4byte .LASF869 + .uleb128 0x2 + .4byte .LASF870 .byte 0x2 .byte 0x4f .byte 0x1b - .4byte 0x65 + .4byte 0x71 .uleb128 0x1 .byte 0x4 .byte 0x7 - .4byte .LASF870 - .uleb128 0x1 - .byte 0x8 - .byte 0x5 .4byte .LASF871 .uleb128 0x1 .byte 0x8 - .byte 0x7 + .byte 0x5 .4byte .LASF872 - .uleb128 0x9 + .uleb128 0x1 + .byte 0x8 + .byte 0x7 + .4byte .LASF873 + .uleb128 0xb .byte 0x4 .byte 0x5 .ascii "int\000" - .uleb128 0x3 - .4byte .LASF873 + .uleb128 0x2 + .4byte .LASF874 .byte 0x2 .byte 0xe8 .byte 0x16 - .4byte 0x8d + .4byte 0x99 .uleb128 0x1 .byte 0x4 .byte 0x7 - .4byte .LASF874 - .uleb128 0x3 .4byte .LASF875 + .uleb128 0x2 + .4byte .LASF876 + .byte 0x3 + .byte 0x18 + .byte 0x13 + .4byte 0x31 + .uleb128 0x2 + .4byte .LASF877 .byte 0x3 .byte 0x24 .byte 0x14 - .4byte 0x3f - .uleb128 0x3 - .4byte .LASF876 + .4byte 0x4b + .uleb128 0x2 + .4byte .LASF878 .byte 0x3 .byte 0x30 .byte 0x14 - .4byte 0x59 - .uleb128 0xa - .4byte 0xa0 - .uleb128 0x3 - .4byte .LASF877 + .4byte 0x65 + .uleb128 0xc + .4byte 0xb8 + .uleb128 0x2 + .4byte .LASF879 .byte 0x3 .byte 0x52 .byte 0x15 - .4byte 0x81 - .uleb128 0xb - .4byte .LASF893 + .4byte 0x8d + .uleb128 0xd + .4byte .LASF896 .byte 0x28 .byte 0x4 .byte 0x7 .byte 0x8 - .4byte 0x139 - .uleb128 0x2 - .4byte .LASF878 - .byte 0x8 - .4byte 0xac - .byte 0 - .uleb128 0x2 - .4byte .LASF879 - .byte 0x9 - .4byte 0xac - .byte 0x4 - .uleb128 0x2 + .4byte 0x151 + .uleb128 0x3 .4byte .LASF880 - .byte 0xa - .4byte 0xac .byte 0x8 - .uleb128 0x2 + .4byte 0xc4 + .byte 0 + .uleb128 0x3 .4byte .LASF881 + .byte 0x9 + .4byte 0xc4 + .byte 0x4 + .uleb128 0x3 + .4byte .LASF882 + .byte 0xa + .4byte 0xc4 + .byte 0x8 + .uleb128 0x3 + .4byte .LASF883 .byte 0xb - .4byte 0xac + .4byte 0xc4 .byte 0xc - .uleb128 0x6 + .uleb128 0x7 .ascii "IDR\000" .byte 0xc - .4byte 0xac + .4byte 0xc4 .byte 0x10 - .uleb128 0x6 + .uleb128 0x7 .ascii "ODR\000" .byte 0xd - .4byte 0xac + .4byte 0xc4 .byte 0x14 - .uleb128 0x2 - .4byte .LASF882 - .byte 0xe - .4byte 0xac - .byte 0x18 - .uleb128 0x2 - .4byte .LASF883 - .byte 0xf - .4byte 0xac - .byte 0x1c - .uleb128 0x2 + .uleb128 0x3 .4byte .LASF884 - .byte 0x10 - .4byte 0xac - .byte 0x20 - .uleb128 0x2 + .byte 0xe + .4byte 0xc4 + .byte 0x18 + .uleb128 0x3 .4byte .LASF885 + .byte 0xf + .4byte 0xc4 + .byte 0x1c + .uleb128 0x3 + .4byte .LASF886 + .byte 0x10 + .4byte 0xc4 + .byte 0x20 + .uleb128 0x3 + .4byte .LASF887 .byte 0x11 - .4byte 0xac + .4byte 0xc4 .byte 0x24 .byte 0 - .uleb128 0xc + .uleb128 0xe .byte 0x7 .byte 0x1 - .4byte 0x31 + .4byte 0x3d .byte 0x4 .byte 0x21 .byte 0xe - .4byte 0x160 - .uleb128 0x4 - .4byte .LASF886 - .byte 0 - .uleb128 0x4 - .4byte .LASF887 - .byte 0x1 - .uleb128 0x4 + .4byte 0x178 + .uleb128 0x5 .4byte .LASF888 - .byte 0x2 - .uleb128 0x4 + .byte 0 + .uleb128 0x5 .4byte .LASF889 + .byte 0x1 + .uleb128 0x5 + .4byte .LASF890 + .byte 0x2 + .uleb128 0x5 + .4byte .LASF891 .byte 0x3 .byte 0 - .uleb128 0x3 - .4byte .LASF890 + .uleb128 0x2 + .4byte .LASF892 .byte 0x4 .byte 0x26 .byte 0x3 - .4byte 0x139 - .uleb128 0xd - .4byte .LASF897 - .byte 0x1 - .byte 0xd - .byte 0x6 - .4byte .LFB1 - .4byte .LFE1-.LFB1 + .4byte 0x151 + .uleb128 0x8 + .4byte .LASF894 + .byte 0x19 + .4byte .LFB2 + .4byte .LFE2-.LFB2 .uleb128 0x1 .byte 0x9c - .4byte 0x1ac - .uleb128 0x5 + .4byte 0x1c2 + .uleb128 0x4 .ascii "pin\000" - .byte 0xd + .byte 0x19 .byte 0x1a - .4byte 0x94 + .4byte 0xac .uleb128 0x2 .byte 0x91 .sleb128 -18 - .uleb128 0x5 + .uleb128 0x4 .ascii "val\000" - .byte 0xd + .byte 0x19 .byte 0x23 - .4byte 0x1ac + .4byte 0x1c2 .uleb128 0x2 .byte 0x91 .sleb128 -19 - .uleb128 0x7 - .4byte .LASF893 - .byte 0xe - .4byte 0x1b3 + .uleb128 0x6 + .4byte .LASF896 + .byte 0x1a + .4byte 0x1c9 .uleb128 0x2 .byte 0x91 .sleb128 -12 @@ -396,12 +529,51 @@ gpio_write: .uleb128 0x1 .byte 0x1 .byte 0x2 - .4byte .LASF891 - .uleb128 0xe - .byte 0x4 - .4byte 0xbd + .4byte .LASF893 .uleb128 0xf - .4byte .LASF898 + .byte 0x4 + .4byte 0xd5 + .uleb128 0x8 + .4byte .LASF895 + .byte 0xd + .4byte .LFB1 + .4byte .LFE1-.LFB1 + .uleb128 0x1 + .byte 0x9c + .4byte 0x218 + .uleb128 0x4 + .ascii "pin\000" + .byte 0xd + .byte 0x1b + .4byte 0xac + .uleb128 0x2 + .byte 0x91 + .sleb128 -18 + .uleb128 0x4 + .ascii "af\000" + .byte 0xd + .byte 0x28 + .4byte 0xa0 + .uleb128 0x2 + .byte 0x91 + .sleb128 -19 + .uleb128 0x6 + .4byte .LASF896 + .byte 0xe + .4byte 0x1c9 + .uleb128 0x2 + .byte 0x91 + .sleb128 -12 + .uleb128 0x9 + .ascii "pn\000" + .byte 0xf + .4byte 0x86 + .uleb128 0x2 + .byte 0x91 + .sleb128 -16 + .byte 0 + .uleb128 0x10 + .4byte .LASF901 .byte 0x1 .byte 0x6 .byte 0x6 @@ -409,36 +581,34 @@ gpio_write: .4byte .LFE0-.LFB0 .uleb128 0x1 .byte 0x9c - .uleb128 0x5 + .uleb128 0x4 .ascii "pin\000" .byte 0x6 .byte 0x1d - .4byte 0x94 + .4byte 0xac .uleb128 0x2 .byte 0x91 .sleb128 -18 - .uleb128 0x10 - .4byte .LASF892 + .uleb128 0x11 + .4byte .LASF897 .byte 0x1 .byte 0x6 .byte 0x2c - .4byte 0x160 + .4byte 0x178 .uleb128 0x2 .byte 0x91 .sleb128 -19 - .uleb128 0x7 - .4byte .LASF893 + .uleb128 0x6 + .4byte .LASF896 .byte 0x7 - .4byte 0x1b3 + .4byte 0x1c9 .uleb128 0x2 .byte 0x91 .sleb128 -12 - .uleb128 0x11 + .uleb128 0x9 .ascii "pn\000" - .byte 0x1 .byte 0x8 - .byte 0x7 - .4byte 0x7a + .4byte 0x86 .uleb128 0x2 .byte 0x91 .sleb128 -16 @@ -458,6 +628,21 @@ gpio_write: .byte 0 .byte 0 .uleb128 0x2 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x39 + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3 .uleb128 0xd .byte 0 .uleb128 0x3 @@ -476,31 +661,7 @@ gpio_write: .uleb128 0xb .byte 0 .byte 0 - .uleb128 0x3 - .uleb128 0x16 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x39 - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 .uleb128 0x4 - .uleb128 0x28 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x1c - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x5 .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -518,26 +679,16 @@ gpio_write: .uleb128 0x18 .byte 0 .byte 0 - .uleb128 0x6 - .uleb128 0xd + .uleb128 0x5 + .uleb128 0x28 .byte 0 .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0x21 - .sleb128 4 - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x39 - .uleb128 0x21 - .sleb128 21 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 + .uleb128 0xe + .uleb128 0x1c .uleb128 0xb .byte 0 .byte 0 - .uleb128 0x7 + .uleb128 0x6 .uleb128 0x34 .byte 0 .uleb128 0x3 @@ -556,7 +707,74 @@ gpio_write: .uleb128 0x18 .byte 0 .byte 0 + .uleb128 0x7 + .uleb128 0xd + .byte 0 + .uleb128 0x3 .uleb128 0x8 + .uleb128 0x3a + .uleb128 0x21 + .sleb128 4 + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x39 + .uleb128 0x21 + .sleb128 21 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x8 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0x21 + .sleb128 1 + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x39 + .uleb128 0x21 + .sleb128 6 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x6 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x7a + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x9 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0x21 + .sleb128 1 + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x39 + .uleb128 0x21 + .sleb128 7 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0xa .uleb128 0x11 .byte 0x1 .uleb128 0x25 @@ -577,7 +795,7 @@ gpio_write: .uleb128 0x17 .byte 0 .byte 0 - .uleb128 0x9 + .uleb128 0xb .uleb128 0x24 .byte 0 .uleb128 0xb @@ -588,14 +806,14 @@ gpio_write: .uleb128 0x8 .byte 0 .byte 0 - .uleb128 0xa + .uleb128 0xc .uleb128 0x35 .byte 0 .uleb128 0x49 .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0xb + .uleb128 0xd .uleb128 0x13 .byte 0x1 .uleb128 0x3 @@ -612,7 +830,7 @@ gpio_write: .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0xc + .uleb128 0xe .uleb128 0x4 .byte 0x1 .uleb128 0x3e @@ -631,34 +849,7 @@ gpio_write: .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0xd - .uleb128 0x2e - .byte 0x1 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x39 - .uleb128 0xb - .uleb128 0x27 - .uleb128 0x19 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x12 - .uleb128 0x6 - .uleb128 0x40 - .uleb128 0x18 - .uleb128 0x7a - .uleb128 0x19 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0xe + .uleb128 0xf .uleb128 0xf .byte 0 .uleb128 0xb @@ -667,7 +858,7 @@ gpio_write: .uleb128 0x13 .byte 0 .byte 0 - .uleb128 0xf + .uleb128 0x10 .uleb128 0x2e .byte 0x1 .uleb128 0x3f @@ -692,7 +883,7 @@ gpio_write: .uleb128 0x19 .byte 0 .byte 0 - .uleb128 0x10 + .uleb128 0x11 .uleb128 0x5 .byte 0 .uleb128 0x3 @@ -709,26 +900,9 @@ gpio_write: .uleb128 0x18 .byte 0 .byte 0 - .uleb128 0x11 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x39 - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x18 - .byte 0 - .byte 0 .byte 0 .section .debug_aranges,"",%progbits - .4byte 0x24 + .4byte 0x2c .2byte 0x2 .4byte .Ldebug_info0 .byte 0x4 @@ -739,6 +913,8 @@ gpio_write: .4byte .LFE0-.LFB0 .4byte .LFB1 .4byte .LFE1-.LFB1 + .4byte .LFB2 + .4byte .LFE2-.LFB2 .4byte 0 .4byte 0 .section .debug_rnglists,"",%progbits @@ -756,6 +932,9 @@ gpio_write: .byte 0x7 .4byte .LFB1 .uleb128 .LFE1-.LFB1 + .byte 0x7 + .4byte .LFB2 + .uleb128 .LFE2-.LFB2 .byte 0 .Ldebug_ranges3: .section .debug_macro,"",%progbits @@ -3587,8 +3766,8 @@ gpio_write: .ascii "__SCN32FAST(x) __FAST32 __STRINGIFY(x)\000" .LASF318: .ascii "__LLACCUM_MIN__ (-0X1P31LLK-0X1P31LLK)\000" -.LASF381: - .ascii "__GCC_DESTRUCTIVE_SIZE 64\000" +.LASF338: + .ascii "__UHQ_FBIT__ 16\000" .LASF310: .ascii "__LACCUM_EPSILON__ 0x1P-31LK\000" .LASF809: @@ -3597,7 +3776,7 @@ gpio_write: .ascii "__PTRDIFF_MAX__ 0x7fffffff\000" .LASF541: .ascii "_LONG_DOUBLE long double\000" -.LASF893: +.LASF896: .ascii "gpio\000" .LASF591: .ascii "INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1)\000" @@ -3605,7 +3784,7 @@ gpio_write: .ascii "_UINT32_T_DECLARED \000" .LASF90: .ascii "__INTMAX_MAX__ 0x7fffffffffffffffLL\000" -.LASF888: +.LASF890: .ascii "GPIO_MODE_AF\000" .LASF335: .ascii "__TQ_IBIT__ 0\000" @@ -3719,7 +3898,7 @@ gpio_write: .ascii "__need_wchar_t\000" .LASF199: .ascii "__FLT32_MIN_EXP__ (-125)\000" -.LASF894: +.LASF898: .ascii "GNU C2X 12.3.1 20230626 -mcpu=cortex-m4 -mthumb -mf" .ascii "loat-abi=hard -mfpu=fpv4-sp-d16 -march=armv7e-m+fp " .ascii "-g3 -ggdb -O0 -std=c2x -ffunction-sections -fdata-s" @@ -3788,8 +3967,8 @@ gpio_write: .ascii "__LACCUM_IBIT__ 32\000" .LASF592: .ascii "INT_LEAST8_MAX (__INT_LEAST8_MAX__)\000" -.LASF559: - .ascii "__EXP\000" +.LASF866: + .ascii "__uint8_t\000" .LASF81: .ascii "__SCHAR_WIDTH__ 8\000" .LASF455: @@ -3838,9 +4017,7 @@ gpio_write: .ascii "__ACCUM_FBIT__ 15\000" .LASF791: .ascii "PRId64 __PRI64(d)\000" -.LASF302: - .ascii "__UACCUM_IBIT__ 16\000" -.LASF867: +.LASF869: .ascii "long int\000" .LASF818: .ascii "PRIXFAST64 __PRI64FAST(X)\000" @@ -3936,7 +4113,7 @@ gpio_write: .ascii "PRIoLEAST16 __PRI16LEAST(o)\000" .LASF458: .ascii "__NEWLIB__ 4\000" -.LASF886: +.LASF888: .ascii "GPIO_MODE_INPUT\000" .LASF720: .ascii "SCNi16 __SCN16(i)\000" @@ -3950,15 +4127,17 @@ gpio_write: .ascii "signed char\000" .LASF805: .ascii "PRIuLEAST64 __PRI64LEAST(u)\000" +.LASF876: + .ascii "uint8_t\000" .LASF704: .ascii "SCNoFAST8 __SCN8FAST(o)\000" .LASF625: .ascii "INTMAX_MIN (-INTMAX_MAX - 1)\000" .LASF431: .ascii "__ARM_FEATURE_FMA 1\000" -.LASF364: - .ascii "__GNUC_STDC_INLINE__ 1\000" -.LASF890: +.LASF466: + .ascii "_HAVE_LONG_DOUBLE 1\000" +.LASF892: .ascii "GPIO_MODE\000" .LASF256: .ascii "__FRACT_FBIT__ 15\000" @@ -4024,19 +4203,17 @@ gpio_write: .ascii "__PRI16LEAST(x) __LEAST16 __STRINGIFY(x)\000" .LASF494: .ascii "__POSIX_VISIBLE 0\000" -.LASF466: - .ascii "_HAVE_LONG_DOUBLE 1\000" .LASF584: .ascii "__int_fast64_t_defined 1\000" .LASF837: .ascii "__PRIPTR(x) __STRINGIFY(x)\000" -.LASF875: +.LASF877: .ascii "uint16_t\000" .LASF417: .ascii "__thumb2__ 1\000" .LASF321: .ascii "__ULLACCUM_FBIT__ 32\000" -.LASF891: +.LASF893: .ascii "_Bool\000" .LASF366: .ascii "__STRICT_ANSI__ 1\000" @@ -4056,7 +4233,7 @@ gpio_write: .ascii "__WCHAR_TYPE__ unsigned int\000" .LASF859: .ascii "PORT(port) (((port) - 'A') << 8)\000" -.LASF887: +.LASF889: .ascii "GPIO_MODE_OUTPUT\000" .LASF357: .ascii "__USA_IBIT__ 16\000" @@ -4094,7 +4271,7 @@ gpio_write: .ascii "__SCN64(x) __INT64 __STRINGIFY(x)\000" .LASF646: .ascii "_GCC_WRAP_STDINT_H \000" -.LASF868: +.LASF867: .ascii "__uint16_t\000" .LASF224: .ascii "__FLT64_EPSILON__ 2.2204460492503131e-16F64\000" @@ -4304,7 +4481,7 @@ gpio_write: .ascii "___int8_t_defined 1\000" .LASF248: .ascii "__SFRACT_MIN__ (-0.5HR-0.5HR)\000" -.LASF870: +.LASF871: .ascii "long unsigned int\000" .LASF349: .ascii "__SA_IBIT__ 16\000" @@ -4320,7 +4497,7 @@ gpio_write: .ascii "__ARM_FP16_FORMAT_IEEE\000" .LASF48: .ascii "__UINT16_TYPE__ short unsigned int\000" -.LASF897: +.LASF894: .ascii "gpio_write\000" .LASF569: .ascii "__int32_t_defined 1\000" @@ -4364,7 +4541,7 @@ gpio_write: .ascii "SCNx8 __SCN8(x)\000" .LASF208: .ascii "__FLT32_DENORM_MIN__ 1.4012984643248171e-45F32\000" -.LASF898: +.LASF901: .ascii "gpio_set_mode\000" .LASF125: .ascii "__UINT64_C(c) c ## ULL\000" @@ -4384,7 +4561,7 @@ gpio_write: .ascii "__GCC_ATOMIC_CHAR16_T_LOCK_FREE 2\000" .LASF789: .ascii "__PRI64FAST(x) __FAST64 __STRINGIFY(x)\000" -.LASF877: +.LASF879: .ascii "uintptr_t\000" .LASF168: .ascii "__DBL_MAX_EXP__ 1024\000" @@ -4432,7 +4609,7 @@ gpio_write: .ascii "PRIX32 __PRI32(X)\000" .LASF773: .ascii "SCNxLEAST32 __SCN32LEAST(x)\000" -.LASF880: +.LASF882: .ascii "OSPEEDR\000" .LASF711: .ascii "__SCN16LEAST(x) __LEAST16 __STRINGIFY(x)\000" @@ -4462,7 +4639,7 @@ gpio_write: .ascii "__ULACCUM_MIN__ 0.0ULK\000" .LASF461: .ascii "_ATEXIT_DYNAMIC_ALLOC 1\000" -.LASF869: +.LASF870: .ascii "__uint32_t\000" .LASF188: .ascii "__LDBL_MAX__ 1.7976931348623157e+308L\000" @@ -4472,7 +4649,7 @@ gpio_write: .ascii "__FLT_RADIX__ 2\000" .LASF454: .ascii "_INTTYPES_H \000" -.LASF871: +.LASF872: .ascii "long long int\000" .LASF401: .ascii "__ARM_FEATURE_CMSE\000" @@ -4492,6 +4669,8 @@ gpio_write: .ascii "_NEWLIB_VERSION \"4.3.0\"\000" .LASF137: .ascii "__UINT_FAST64_MAX__ 0xffffffffffffffffULL\000" +.LASF722: + .ascii "SCNu16 __SCN16(u)\000" .LASF423: .ascii "__ARM_FP\000" .LASF347: @@ -4577,7 +4756,7 @@ gpio_write: .ascii "\000" .LASF582: .ascii "__int_fast16_t_defined 1\000" -.LASF878: +.LASF880: .ascii "MODER\000" .LASF482: .ascii "__FLOAT_TYPE float\000" @@ -4588,9 +4767,9 @@ gpio_write: .ascii "L)\000" .LASF607: .ascii "INT64_MAX (__INT64_MAX__)\000" -.LASF874: +.LASF875: .ascii "unsigned int\000" -.LASF873: +.LASF874: .ascii "__uintptr_t\000" .LASF459: .ascii "__NEWLIB_MINOR__ 3\000" @@ -4616,8 +4795,6 @@ gpio_write: .ascii "_FVWRITE_IN_STREAMIO 1\000" .LASF662: .ascii "_WCHAR_T_DECLARED \000" -.LASF361: - .ascii "__UTA_IBIT__ 64\000" .LASF24: .ascii "__CHAR_BIT__ 8\000" .LASF143: @@ -4628,6 +4805,8 @@ gpio_write: .ascii "PRIdLEAST8 __PRI8LEAST(d)\000" .LASF70: .ascii "__SCHAR_MAX__ 0x7f\000" +.LASF559: + .ascii "__EXP\000" .LASF127: .ascii "__INT_FAST8_WIDTH__ 32\000" .LASF2: @@ -4644,6 +4823,8 @@ gpio_write: .ascii "__LFRACT_MAX__ 0X7FFFFFFFP-31LR\000" .LASF389: .ascii "__SIZEOF_PTRDIFF_T__ 4\000" +.LASF270: + .ascii "__LFRACT_EPSILON__ 0x1P-31LR\000" .LASF649: .ascii "__WCHAR_T__ \000" .LASF555: @@ -4662,6 +4843,8 @@ gpio_write: .ascii "__ARM_FEATURE_COPROC 15\000" .LASF483: .ascii "__OBSOLETE_MATH_DEFAULT 1\000" +.LASF895: + .ascii "gpio_set_af\000" .LASF82: .ascii "__SHRT_WIDTH__ 16\000" .LASF472: @@ -4682,8 +4865,8 @@ gpio_write: .ascii "__ATFILE_VISIBLE 0\000" .LASF372: .ascii "__GCC_ATOMIC_CHAR_LOCK_FREE 2\000" -.LASF270: - .ascii "__LFRACT_EPSILON__ 0x1P-31LR\000" +.LASF695: + .ascii "SCNxLEAST8 __SCN8LEAST(x)\000" .LASF808: .ascii "SCNdLEAST64 __SCN64LEAST(d)\000" .LASF538: @@ -4808,7 +4991,7 @@ gpio_write: .ascii "__ORDER_LITTLE_ENDIAN__ 1234\000" .LASF155: .ascii "__FLT_NORM_MAX__ 3.4028234663852886e+38F\000" -.LASF872: +.LASF873: .ascii "long long unsigned int\000" .LASF611: .ascii "UINT_LEAST64_MAX (__UINT_LEAST64_MAX__)\000" @@ -4822,8 +5005,6 @@ gpio_write: .ascii "__SHRT_MAX__ 0x7fff\000" .LASF196: .ascii "__LDBL_IS_IEC_60559__ 2\000" -.LASF695: - .ascii "SCNxLEAST8 __SCN8LEAST(x)\000" .LASF35: .ascii "__PTRDIFF_TYPE__ int\000" .LASF670: @@ -4886,11 +5067,11 @@ gpio_write: .ascii "SCNdFAST8 __SCN8FAST(d)\000" .LASF576: .ascii "_UINTPTR_T_DECLARED \000" -.LASF885: +.LASF887: .ascii "AFRH\000" .LASF314: .ascii "__ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK\000" -.LASF884: +.LASF886: .ascii "AFRL\000" .LASF273: .ascii "__ULFRACT_MIN__ 0.0ULR\000" @@ -4904,7 +5085,7 @@ gpio_write: .ascii "__INT32_TYPE__ long int\000" .LASF118: .ascii "__UINT_LEAST8_MAX__ 0xff\000" -.LASF883: +.LASF885: .ascii "LCKR\000" .LASF520: .ascii "__int20__ +2\000" @@ -4934,6 +5115,8 @@ gpio_write: .ascii "__ARM_EABI__ 1\000" .LASF465: .ascii "_HAVE_INITFINI_ARRAY 1\000" +.LASF302: + .ascii "__UACCUM_IBIT__ 16\000" .LASF732: .ascii "SCNoLEAST16 __SCN16LEAST(o)\000" .LASF473: @@ -4952,7 +5135,7 @@ gpio_write: .ascii "__QQ_IBIT__ 0\000" .LASF763: .ascii "PRIdLEAST32 __PRI32LEAST(d)\000" -.LASF879: +.LASF881: .ascii "OTYPER\000" .LASF811: .ascii "SCNuLEAST64 __SCN64LEAST(u)\000" @@ -4972,7 +5155,7 @@ gpio_write: .ascii "__GNUC_MINOR__ 3\000" .LASF57: .ascii "__UINT_LEAST32_TYPE__ long unsigned int\000" -.LASF895: +.LASF899: .ascii "src/gpio.c\000" .LASF405: .ascii "__ARM_FEATURE_NUMERIC_MAXMIN\000" @@ -5046,17 +5229,17 @@ gpio_write: .ascii "__ACCUM_IBIT__ 16\000" .LASF509: .ascii "unsigned\000" -.LASF881: +.LASF381: + .ascii "__GCC_DESTRUCTIVE_SIZE 64\000" +.LASF883: .ascii "PUPDR\000" .LASF835: .ascii "SCNuMAX __SCNMAX(u)\000" .LASF121: .ascii "__UINT16_C(c) c\000" -.LASF542: - .ascii "_ATTRIBUTE(attrs) __attribute__ (attrs)\000" .LASF359: .ascii "__UDA_IBIT__ 32\000" -.LASF892: +.LASF897: .ascii "mode\000" .LASF586: .ascii "INTPTR_MAX (__INTPTR_MAX__)\000" @@ -5066,11 +5249,11 @@ gpio_write: .ascii "INT64_MIN (-__INT64_MAX__ - 1)\000" .LASF9: .ascii "__ATOMIC_RELAXED 0\000" -.LASF338: - .ascii "__UHQ_FBIT__ 16\000" +.LASF542: + .ascii "_ATTRIBUTE(attrs) __attribute__ (attrs)\000" .LASF443: .ascii "__ARM_FEATURE_COPROC\000" -.LASF889: +.LASF891: .ascii "GPIO_MODE_ANALOG\000" .LASF177: .ascii "__DBL_HAS_INFINITY__ 1\000" @@ -5108,7 +5291,7 @@ gpio_write: .ascii "__FAST8 \000" .LASF496: .ascii "__XSI_VISIBLE 0\000" -.LASF882: +.LASF884: .ascii "BSRR\000" .LASF794: .ascii "PRIu64 __PRI64(u)\000" @@ -5120,8 +5303,8 @@ gpio_write: .ascii "PRIxMAX __PRIMAX(x)\000" .LASF487: .ascii "__GNUC_PREREQ__(ma,mi) __GNUC_PREREQ(ma, mi)\000" -.LASF722: - .ascii "SCNu16 __SCN16(u)\000" +.LASF361: + .ascii "__UTA_IBIT__ 64\000" .LASF322: .ascii "__ULLACCUM_IBIT__ 32\000" .LASF396: @@ -5196,7 +5379,7 @@ gpio_write: .ascii "PRIx32 __PRI32(x)\000" .LASF278: .ascii "__LLFRACT_MIN__ (-0.5LLR-0.5LLR)\000" -.LASF876: +.LASF878: .ascii "uint32_t\000" .LASF689: .ascii "PRIxLEAST8 __PRI8LEAST(x)\000" @@ -5220,6 +5403,8 @@ gpio_write: .ascii "SCNiFAST32 __SCN32FAST(i)\000" .LASF355: .ascii "__UHA_IBIT__ 8\000" +.LASF364: + .ascii "__GNUC_STDC_INLINE__ 1\000" .LASF300: .ascii "__ACCUM_EPSILON__ 0x1P-15K\000" .LASF315: @@ -5250,7 +5435,7 @@ gpio_write: .ascii "PRIXLEAST32 __PRI32LEAST(X)\000" .LASF171: .ascii "__DBL_MAX__ ((double)1.7976931348623157e+308L)\000" -.LASF866: +.LASF868: .ascii "short unsigned int\000" .LASF276: .ascii "__LLFRACT_FBIT__ 63\000" @@ -5298,7 +5483,7 @@ gpio_write: .ascii "__SCN64LEAST(x) __LEAST64 __STRINGIFY(x)\000" .LASF280: .ascii "__LLFRACT_EPSILON__ 0x1P-63LLR\000" -.LASF896: +.LASF900: .ascii "/home/alex/code/own/stm32-falling-sand\000" .LASF249: .ascii "__SFRACT_MAX__ 0X7FP-7HR\000" diff --git a/build/gpio.i b/build/gpio.i index bd007eb..cb23541 100644 --- a/build/gpio.i +++ b/build/gpio.i @@ -2020,10 +2020,11 @@ typedef enum { } GPIO_MODE; void gpio_set_mode(uint16_t pin, GPIO_MODE mode); +void gpio_set_af(uint16_t pin, uint8_t af); void gpio_write(uint16_t pin, -# 41 "src/gpio.h" 3 4 +# 42 "src/gpio.h" 3 4 _Bool -# 41 "src/gpio.h" +# 42 "src/gpio.h" val); # 5 "src/gpio.c" 2 @@ -2034,10 +2035,22 @@ void gpio_set_mode(uint16_t pin, GPIO_MODE mode) { gpio->MODER |= (mode & 0b11) << (pn * 2); } +void gpio_set_af(uint16_t pin, uint8_t af) { + struct gpio *gpio = ((struct gpio*)(uintptr_t)((0x40020000U) + ((0x400U) * (pin >> 8)))); + int pn = (pin & 0b1111); + if (pn < 8) { + gpio->AFRL &= ~(0b1111 << (pn * 4)); + gpio->AFRL |= (af & 0b1111) << (pn * 4); + } else { + gpio->AFRH &= ~(0b1111 << (pn * 4)); + gpio->AFRH |= (af & 0b1111) << (pn * 4); + } +} + void gpio_write(uint16_t pin, -# 13 "src/gpio.c" 3 4 +# 25 "src/gpio.c" 3 4 _Bool -# 13 "src/gpio.c" +# 25 "src/gpio.c" val) { struct gpio *gpio = ((struct gpio*)(uintptr_t)((0x40020000U) + ((0x400U) * (pin >> 8)))); gpio->BSRR = (0b0011 << (pin & 0b1111)) << (val ? 0 : 16); diff --git a/build/gpio.o b/build/gpio.o index 59a40c38ef5bd5c7518dfee6594ea1f883da4751..849a43dbd25ed4d2247f3764beb7a9a1e6c71e7f 100644 GIT binary patch delta 17900 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 Xzb;XhI5C@n0kkC-A`V&A2Vw&NlI%?y delta 17286 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 diff --git a/build/main.S b/build/main.S index 72ecb9d..c94d753 100644 --- a/build/main.S +++ b/build/main.S @@ -824,7 +824,7 @@ main: .byte 0 .uleb128 0xa .4byte .LASF996 - .byte 0x29 + .byte 0x2a .4byte 0x3cd .uleb128 0x6 .4byte 0x88 diff --git a/build/main.i b/build/main.i index f00220b..e5271b3 100644 --- a/build/main.i +++ b/build/main.i @@ -2144,10 +2144,11 @@ typedef enum { } GPIO_MODE; void gpio_set_mode(uint16_t pin, GPIO_MODE mode); +void gpio_set_af(uint16_t pin, uint8_t af); void gpio_write(uint16_t pin, -# 41 "src/gpio.h" 3 4 +# 42 "src/gpio.h" 3 4 _Bool -# 41 "src/gpio.h" +# 42 "src/gpio.h" val); # 6 "src/main.c" 2 # 1 "src/flash.h" 1 diff --git a/build/main.o b/build/main.o index e3c37326480d10889f48acf64526565426730ab7..87fe3e81740fdcfafca6e7c3b5170e973036c9af 100644 GIT binary patch delta 16 YcmX@|o9W1JrVX8Jj9Qz!*sQh#07SP3ApigX delta 16 YcmX@|o9W1JrVX8JjGCLf*sQh#07S6|AOHXW diff --git a/src/gpio.c b/src/gpio.c index b92dd26..fa63bb9 100644 --- a/src/gpio.c +++ b/src/gpio.c @@ -10,6 +10,18 @@ void gpio_set_mode(uint16_t pin, GPIO_MODE mode) { gpio->MODER |= (mode & 0b11) << (pn * 2); // Set new mode. Each pin uses 2 bits } +void gpio_set_af(uint16_t pin, uint8_t af) { + struct gpio *gpio = GPIO(PINPORT(pin)); + int pn = PINNUM(pin); + if (pn < 8) { + gpio->AFRL &= ~(0b1111 << (pn * 4)); // Each pin uses 4 bits + gpio->AFRL |= (af & 0b1111) << (pn * 4); + } else { + gpio->AFRH &= ~(0b1111 << (pn * 4)); // Each pin uses 4 bits + gpio->AFRH |= (af & 0b1111) << (pn * 4); + } +} + void gpio_write(uint16_t pin, bool val) { struct gpio *gpio = GPIO(PINPORT(pin)); gpio->BSRR = (0b0011 << PINNUM(pin)) << (val ? 0 : 16); diff --git a/src/gpio.h b/src/gpio.h index bad0e48..298fd88 100644 --- a/src/gpio.h +++ b/src/gpio.h @@ -38,6 +38,7 @@ typedef enum { } GPIO_MODE; void gpio_set_mode(uint16_t pin, GPIO_MODE mode); +void gpio_set_af(uint16_t pin, uint8_t af); void gpio_write(uint16_t pin, bool val); #endif