diff --git a/build/final.elf b/build/final.elf index b9785a1..4974603 100755 Binary files a/build/final.elf and b/build/final.elf differ 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 59a40c3..849a43d 100644 Binary files a/build/gpio.o and b/build/gpio.o differ 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 e3c3732..87fe3e8 100644 Binary files a/build/main.o and b/build/main.o differ 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