From 1a1bfda5cf03367d92b0f1e224572a648ceb5a46 Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Sat, 28 Dec 2024 15:03:49 +0100 Subject: [PATCH] wip why does HSE run at 16MHz? --- README.md | 20 +- build/final.elf | Bin 62292 -> 62996 bytes build/final.elf.map | 282 +++++----- build/gpio.S | 246 +++++---- build/gpio.i | 18 +- build/gpio.o | Bin 42888 -> 43052 bytes build/main.S | 1237 +++++++++++++++++++++++-------------------- build/main.i | 71 ++- build/main.o | Bin 51016 -> 51724 bytes build/timer.S | 493 +++++++++-------- build/timer.i | 24 +- build/timer.o | Bin 44832 -> 45416 bytes build/usart.S | 956 ++++++++++++++++++--------------- build/usart.i | 63 ++- build/usart.o | Bin 48428 -> 49192 bytes src/gpio.h | 18 +- src/main.c | 29 +- src/rcc.h | 22 + src/timer.c | 4 +- src/usart.c | 48 +- src/usart.h | 4 +- 21 files changed, 1981 insertions(+), 1554 deletions(-) diff --git a/README.md b/README.md index 76f1008..cc2b9e9 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,27 @@ make build ## Probe for the board Run ```sh -st-info --probe +st-info --probe ``` ## Flashing Run ```sh -make flash +make flash ``` + +## Debugging + +### `st-info --probe` shows 0KB flash +``` +> sudo st-info --probe +Found 1 stlink programmers + version: V2J43S28 + serial: 0671FF343056363043090732 + flash: 0 (pagesize: 16384) <--- 0KB flash + sram: 131072 + chipid: 0x431 + dev-type: STM32F411xC_xE +``` +This can happen when the flash is locked. One way to unlock it is to erase the entire chip via the +Windows application `ST-Link Util`. diff --git a/build/final.elf b/build/final.elf index 8e6b73c12d11a1310f2ebed1bc74dfdc3baf3856..54f770fc585cc31124aa16f16d94c94cf02c78f3 100755 GIT binary patch literal 62996 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 K21!6MOdSA$Ripp_ literal 62292 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 diff --git a/build/final.elf.map b/build/final.elf.map index bfba6d0..6427ca2 100644 --- a/build/final.elf.map +++ b/build/final.elf.map @@ -53,7 +53,7 @@ Discarded input sections .debug_macro 0x00000000 0x89 build/main.o .debug_macro 0x00000000 0x4cc build/main.o .debug_macro 0x00000000 0x22 build/main.o - .debug_macro 0x00000000 0x88 build/main.o + .debug_macro 0x00000000 0xa0 build/main.o .group 0x00000000 0xc build/startup.o .group 0x00000000 0xc build/startup.o .group 0x00000000 0xc build/startup.o @@ -128,7 +128,7 @@ Discarded input sections .debug_macro 0x00000000 0x1df build/usart.o .debug_macro 0x00000000 0x89 build/usart.o .debug_macro 0x00000000 0x4cc build/usart.o - .debug_macro 0x00000000 0x13e build/usart.o + .debug_macro 0x00000000 0x19f build/usart.o .debug_macro 0x00000000 0x22 build/usart.o .debug_macro 0x00000000 0x82 build/usart.o @@ -157,7 +157,7 @@ LOAD build/usart.o 0x08000000 interrupt_vector_table 0x08000198 . = ALIGN (0x4) -.text 0x08000198 0x4e4 +.text 0x08000198 0x4d4 0x08000198 . = ALIGN (0x4) *(.text) *(.text.*) @@ -169,129 +169,129 @@ LOAD build/usart.o 0x080001fa gpio_write *fill* 0x08000246 0x2 .text.system_clock_init - 0x08000248 0x144 build/main.o - .text.main 0x0800038c 0x9c build/main.o - 0x0800038c main + 0x08000248 0x128 build/main.o + .text.main 0x08000370 0x9c build/main.o + 0x08000370 main .text.init_memory - 0x08000428 0x64 build/startup.o - 0x08000428 init_memory - .text.reset 0x0800048c 0x10 build/startup.o - 0x0800048c reset + 0x0800040c 0x64 build/startup.o + 0x0800040c init_memory + .text.reset 0x08000470 0x10 build/startup.o + 0x08000470 reset .text.default_handler - 0x0800049c 0x8 build/startup.o - 0x0800049c exti0 - 0x0800049c debug_monitor - 0x0800049c rcc - 0x0800049c x - 0x0800049c sdio - 0x0800049c usage_fault - 0x0800049c tim1_up_tim10 - 0x0800049c usart1 - 0x0800049c i2c3_er - 0x0800049c spi2 - 0x0800049c dma1_stream1 - 0x0800049c bus_fault - 0x0800049c spi5 - 0x0800049c exti3 - 0x0800049c dma2_stream5 - 0x0800049c tim2 - 0x0800049c dma1_stream6 - 0x0800049c default_handler - 0x0800049c i2c1_er - 0x0800049c hard_fault - 0x0800049c usart6 - 0x0800049c exti15_10 - 0x0800049c usart2 - 0x0800049c pend_sv - 0x0800049c i2c1_ev - 0x0800049c wwdg - 0x0800049c adc - 0x0800049c rtc_alarm - 0x0800049c spi3 - 0x0800049c exti1 - 0x0800049c mem_manage - 0x0800049c dma2_stream1 - 0x0800049c dma1_stream2 - 0x0800049c dma2_stream3 - 0x0800049c sv_call - 0x0800049c tim3 - 0x0800049c otg_fs - 0x0800049c dma1_stream5 - 0x0800049c dma2_stream6 - 0x0800049c flash - 0x0800049c tamp_stamp - 0x0800049c i2c3_ev - 0x0800049c rtc_wkup - 0x0800049c dma2_stream0 - 0x0800049c pvd - 0x0800049c fpu - 0x0800049c exti4 - 0x0800049c exti2 - 0x0800049c spi1 - 0x0800049c dma1_stream0 - 0x0800049c tim1_brk_tim9 - 0x0800049c i2c2_ev - 0x0800049c otg_fs_wkup - 0x0800049c spi4 - 0x0800049c dma2_stream2 - 0x0800049c tim1_cc - 0x0800049c tim1_trg_com_tim11 - 0x0800049c exti9_5 - 0x0800049c dma1_stream3 - 0x0800049c dma2_stream4 - 0x0800049c i2c2_er - 0x0800049c dma2_stream7 - 0x0800049c dma1_stream7 - 0x0800049c nmi - 0x0800049c systick - 0x0800049c tim4 - 0x0800049c tim5 - 0x0800049c dma1_stream4 + 0x08000480 0x8 build/startup.o + 0x08000480 exti0 + 0x08000480 debug_monitor + 0x08000480 rcc + 0x08000480 x + 0x08000480 sdio + 0x08000480 usage_fault + 0x08000480 tim1_up_tim10 + 0x08000480 usart1 + 0x08000480 i2c3_er + 0x08000480 spi2 + 0x08000480 dma1_stream1 + 0x08000480 bus_fault + 0x08000480 spi5 + 0x08000480 exti3 + 0x08000480 dma2_stream5 + 0x08000480 tim2 + 0x08000480 dma1_stream6 + 0x08000480 default_handler + 0x08000480 i2c1_er + 0x08000480 hard_fault + 0x08000480 usart6 + 0x08000480 exti15_10 + 0x08000480 usart2 + 0x08000480 pend_sv + 0x08000480 i2c1_ev + 0x08000480 wwdg + 0x08000480 adc + 0x08000480 rtc_alarm + 0x08000480 spi3 + 0x08000480 exti1 + 0x08000480 mem_manage + 0x08000480 dma2_stream1 + 0x08000480 dma1_stream2 + 0x08000480 dma2_stream3 + 0x08000480 sv_call + 0x08000480 tim3 + 0x08000480 otg_fs + 0x08000480 dma1_stream5 + 0x08000480 dma2_stream6 + 0x08000480 flash + 0x08000480 tamp_stamp + 0x08000480 i2c3_ev + 0x08000480 rtc_wkup + 0x08000480 dma2_stream0 + 0x08000480 pvd + 0x08000480 fpu + 0x08000480 exti4 + 0x08000480 exti2 + 0x08000480 spi1 + 0x08000480 dma1_stream0 + 0x08000480 tim1_brk_tim9 + 0x08000480 i2c2_ev + 0x08000480 otg_fs_wkup + 0x08000480 spi4 + 0x08000480 dma2_stream2 + 0x08000480 tim1_cc + 0x08000480 tim1_trg_com_tim11 + 0x08000480 exti9_5 + 0x08000480 dma1_stream3 + 0x08000480 dma2_stream4 + 0x08000480 i2c2_er + 0x08000480 dma2_stream7 + 0x08000480 dma1_stream7 + 0x08000480 nmi + 0x08000480 systick + 0x08000480 tim4 + 0x08000480 tim5 + 0x08000480 dma1_stream4 .text.tim4_init - 0x080004a4 0x40 build/timer.o - 0x080004a4 tim4_init + 0x08000488 0x40 build/timer.o + 0x08000488 tim4_init .text.tim4_start - 0x080004e4 0x20 build/timer.o - 0x080004e4 tim4_start + 0x080004c8 0x20 build/timer.o + 0x080004c8 tim4_start .text.usart2_init - 0x08000504 0xec build/usart.o - 0x08000504 usart2_init + 0x080004e8 0xf8 build/usart.o + 0x080004e8 usart2_init .text.usart2_start - 0x080005f0 0x20 build/usart.o - 0x080005f0 usart2_start + 0x080005e0 0x20 build/usart.o + 0x080005e0 usart2_start .text.usart2_write_byte - 0x08000610 0x30 build/usart.o - 0x08000610 usart2_write_byte + 0x08000600 0x30 build/usart.o + 0x08000600 usart2_write_byte .text.usart2_write - 0x08000640 0x2a build/usart.o - 0x08000640 usart2_write + 0x08000630 0x2a build/usart.o + 0x08000630 usart2_write *(.rodata) - *fill* 0x0800066a 0x2 - .rodata 0x0800066c 0xe build/main.o + *fill* 0x0800065a 0x2 + .rodata 0x0800065c 0xf build/main.o *(.rodata.*) - 0x0800067c . = ALIGN (0x4) - *fill* 0x0800067a 0x2 - 0x0800067c _data_addr = LOADADDR (.data) + 0x0800066c . = ALIGN (0x4) + *fill* 0x0800066b 0x1 + 0x0800066c _data_addr = LOADADDR (.data) -.glue_7 0x0800067c 0x0 - .glue_7 0x0800067c 0x0 linker stubs +.glue_7 0x0800066c 0x0 + .glue_7 0x0800066c 0x0 linker stubs -.glue_7t 0x0800067c 0x0 - .glue_7t 0x0800067c 0x0 linker stubs +.glue_7t 0x0800066c 0x0 + .glue_7t 0x0800066c 0x0 linker stubs -.vfp11_veneer 0x0800067c 0x0 - .vfp11_veneer 0x0800067c 0x0 linker stubs +.vfp11_veneer 0x0800066c 0x0 + .vfp11_veneer 0x0800066c 0x0 linker stubs -.v4_bx 0x0800067c 0x0 - .v4_bx 0x0800067c 0x0 linker stubs +.v4_bx 0x0800066c 0x0 + .v4_bx 0x0800066c 0x0 linker stubs -.iplt 0x0800067c 0x0 - .iplt 0x0800067c 0x0 build/main.o +.iplt 0x0800066c 0x0 + .iplt 0x0800066c 0x0 build/main.o -.rel.dyn 0x0800067c 0x0 - .rel.iplt 0x0800067c 0x0 build/main.o +.rel.dyn 0x0800066c 0x0 + .rel.iplt 0x0800066c 0x0 build/main.o -.data 0x20000000 0x0 load address 0x0800067c +.data 0x20000000 0x0 load address 0x0800066c 0x20000000 . = ALIGN (0x4) 0x20000000 _data_start = . *(.data) @@ -299,10 +299,10 @@ LOAD build/usart.o 0x20000000 . = ALIGN (0x4) 0x20000000 _data_end = . -.igot.plt 0x20000000 0x0 load address 0x0800067c +.igot.plt 0x20000000 0x0 load address 0x0800066c .igot.plt 0x20000000 0x0 build/main.o -.bss 0x20000000 0x0 load address 0x0800067c +.bss 0x20000000 0x0 load address 0x0800066c 0x20000000 . = ALIGN (0x4) 0x20000000 _bss_start = . *(.bss) @@ -351,7 +351,7 @@ LOAD linker stubs .debug_rnglists 0x0000006c 0x26 build/usart.o -.debug_macro 0x00000000 0x48a9 +.debug_macro 0x00000000 0x499b .debug_macro 0x00000000 0xb56 build/gpio.o .debug_macro 0x00000b56 0x22 build/gpio.o .debug_macro 0x00000b78 0x75 build/gpio.o @@ -366,39 +366,39 @@ LOAD linker stubs .debug_macro 0x0000108c 0x89 build/gpio.o .debug_macro 0x00001115 0x4cc build/gpio.o .debug_macro 0x000015e1 0x22 build/gpio.o - .debug_macro 0x00001603 0x88 build/gpio.o - .debug_macro 0x0000168b 0xb89 build/main.o - .debug_macro 0x00002214 0x144 build/main.o - .debug_macro 0x00002358 0x46 build/main.o - .debug_macro 0x0000239e 0x2e build/main.o - .debug_macro 0x000023cc 0x22 build/main.o - .debug_macro 0x000023ee 0x82 build/main.o - .debug_macro 0x00002470 0xb02 build/startup.o - .debug_macro 0x00002f72 0x56 build/startup.o - .debug_macro 0x00002fc8 0x51 build/startup.o - .debug_macro 0x00003019 0xb5c build/timer.o - .debug_macro 0x00003b75 0x13e build/timer.o - .debug_macro 0x00003cb3 0xb74 build/usart.o - .debug_macro 0x00004827 0x82 build/usart.o + .debug_macro 0x00001603 0xa0 build/gpio.o + .debug_macro 0x000016a3 0xb89 build/main.o + .debug_macro 0x0000222c 0x1a5 build/main.o + .debug_macro 0x000023d1 0x46 build/main.o + .debug_macro 0x00002417 0x2e build/main.o + .debug_macro 0x00002445 0x22 build/main.o + .debug_macro 0x00002467 0x82 build/main.o + .debug_macro 0x000024e9 0xb02 build/startup.o + .debug_macro 0x00002feb 0x56 build/startup.o + .debug_macro 0x00003041 0x51 build/startup.o + .debug_macro 0x00003092 0xb5c build/timer.o + .debug_macro 0x00003bee 0x19f build/timer.o + .debug_macro 0x00003d8d 0xb74 build/usart.o + .debug_macro 0x00004901 0x9a build/usart.o -.debug_line 0x00000000 0x661 +.debug_line 0x00000000 0x65d .debug_line 0x00000000 0x116 build/gpio.o - .debug_line 0x00000116 0x1e4 build/main.o - .debug_line 0x000002fa 0xea build/startup.o - .debug_line 0x000003e4 0xdf build/timer.o - .debug_line 0x000004c3 0x19e build/usart.o + .debug_line 0x00000116 0x1da build/main.o + .debug_line 0x000002f0 0xea build/startup.o + .debug_line 0x000003da 0xdf build/timer.o + .debug_line 0x000004b9 0x1a4 build/usart.o -.debug_str 0x00000000 0x63e6 - .debug_str 0x00000000 0x5508 build/gpio.o - 0x56b0 (size before relaxing) - .debug_str 0x00005508 0xe17 build/main.o - 0x6477 (size before relaxing) - .debug_str 0x0000631f 0x88 build/startup.o +.debug_str 0x00000000 0x65c7 + .debug_str 0x00000000 0x5574 build/gpio.o + 0x571c (size before relaxing) + .debug_str 0x00005574 0xf8c build/main.o + 0x6658 (size before relaxing) + .debug_str 0x00006500 0x88 build/startup.o 0x3cdc (size before relaxing) - .debug_str 0x000063a7 0xc build/timer.o - 0x5bc2 (size before relaxing) - .debug_str 0x000063b3 0x33 build/usart.o - 0x60ec (size before relaxing) + .debug_str 0x00006588 0xc build/timer.o + 0x5d37 (size before relaxing) + .debug_str 0x00006594 0x33 build/usart.o + 0x62cd (size before relaxing) .comment 0x00000000 0x45 .comment 0x00000000 0x45 build/gpio.o diff --git a/build/gpio.S b/build/gpio.S index a59bc5e..de0bc90 100644 --- a/build/gpio.S +++ b/build/gpio.S @@ -188,10 +188,10 @@ gpio_write: .byte 0x4 .4byte .Ldebug_abbrev0 .uleb128 0x8 - .4byte .LASF908 + .4byte .LASF912 .byte 0x1d - .4byte .LASF909 - .4byte .LASF910 + .4byte .LASF913 + .4byte .LASF914 .4byte .LLRL0 .4byte 0 .4byte .Ldebug_line0 @@ -199,17 +199,17 @@ gpio_write: .uleb128 0x1 .byte 0x1 .byte 0x6 - .4byte .LASF877 + .4byte .LASF881 .uleb128 0x1 .byte 0x1 .byte 0x8 - .4byte .LASF878 + .4byte .LASF882 .uleb128 0x1 .byte 0x2 .byte 0x5 - .4byte .LASF879 + .4byte .LASF883 .uleb128 0x3 - .4byte .LASF882 + .4byte .LASF886 .byte 0x2 .byte 0x39 .byte 0x1c @@ -217,13 +217,13 @@ gpio_write: .uleb128 0x1 .byte 0x2 .byte 0x7 - .4byte .LASF880 + .4byte .LASF884 .uleb128 0x1 .byte 0x4 .byte 0x5 - .4byte .LASF881 + .4byte .LASF885 .uleb128 0x3 - .4byte .LASF883 + .4byte .LASF887 .byte 0x2 .byte 0x4f .byte 0x1b @@ -231,21 +231,21 @@ gpio_write: .uleb128 0x1 .byte 0x4 .byte 0x7 - .4byte .LASF884 + .4byte .LASF888 .uleb128 0x1 .byte 0x8 .byte 0x5 - .4byte .LASF885 + .4byte .LASF889 .uleb128 0x1 .byte 0x8 .byte 0x7 - .4byte .LASF886 + .4byte .LASF890 .uleb128 0x9 .byte 0x4 .byte 0x5 .ascii "int\000" .uleb128 0x3 - .4byte .LASF887 + .4byte .LASF891 .byte 0x2 .byte 0xe8 .byte 0x16 @@ -253,15 +253,15 @@ gpio_write: .uleb128 0x1 .byte 0x4 .byte 0x7 - .4byte .LASF888 + .4byte .LASF892 .uleb128 0x3 - .4byte .LASF889 + .4byte .LASF893 .byte 0x3 .byte 0x24 .byte 0x14 .4byte 0x3f .uleb128 0x3 - .4byte .LASF890 + .4byte .LASF894 .byte 0x3 .byte 0x30 .byte 0x14 @@ -269,35 +269,35 @@ gpio_write: .uleb128 0xa .4byte 0xa0 .uleb128 0x3 - .4byte .LASF891 + .4byte .LASF895 .byte 0x3 .byte 0x52 .byte 0x15 .4byte 0x81 .uleb128 0xb - .4byte .LASF907 + .4byte .LASF911 .byte 0x28 .byte 0x4 .byte 0x7 .byte 0x8 .4byte 0x139 .uleb128 0x2 - .4byte .LASF892 + .4byte .LASF896 .byte 0x8 .4byte 0xac .byte 0 .uleb128 0x2 - .4byte .LASF893 + .4byte .LASF897 .byte 0x9 .4byte 0xac .byte 0x4 .uleb128 0x2 - .4byte .LASF894 + .4byte .LASF898 .byte 0xa .4byte 0xac .byte 0x8 .uleb128 0x2 - .4byte .LASF895 + .4byte .LASF899 .byte 0xb .4byte 0xac .byte 0xc @@ -312,22 +312,22 @@ gpio_write: .4byte 0xac .byte 0x14 .uleb128 0x2 - .4byte .LASF896 + .4byte .LASF900 .byte 0xe .4byte 0xac .byte 0x18 .uleb128 0x2 - .4byte .LASF897 + .4byte .LASF901 .byte 0xf .4byte 0xac .byte 0x1c .uleb128 0x2 - .4byte .LASF898 + .4byte .LASF902 .byte 0x10 .4byte 0xac .byte 0x20 .uleb128 0x2 - .4byte .LASF899 + .4byte .LASF903 .byte 0x11 .4byte 0xac .byte 0x24 @@ -337,30 +337,30 @@ gpio_write: .byte 0x1 .4byte 0x31 .byte 0x4 - .byte 0x38 + .byte 0x40 .byte 0xe .4byte 0x160 .uleb128 0x4 - .4byte .LASF900 + .4byte .LASF904 .byte 0 .uleb128 0x4 - .4byte .LASF901 + .4byte .LASF905 .byte 0x1 .uleb128 0x4 - .4byte .LASF902 + .4byte .LASF906 .byte 0x2 .uleb128 0x4 - .4byte .LASF903 + .4byte .LASF907 .byte 0x3 .byte 0 .uleb128 0x3 - .4byte .LASF904 + .4byte .LASF908 .byte 0x4 - .byte 0x3d + .byte 0x45 .byte 0x3 .4byte 0x139 .uleb128 0xd - .4byte .LASF911 + .4byte .LASF915 .byte 0x1 .byte 0xd .byte 0x6 @@ -386,7 +386,7 @@ gpio_write: .byte 0x91 .sleb128 -19 .uleb128 0x7 - .4byte .LASF907 + .4byte .LASF911 .byte 0xe .4byte 0x1b3 .uleb128 0x2 @@ -396,12 +396,12 @@ gpio_write: .uleb128 0x1 .byte 0x1 .byte 0x2 - .4byte .LASF905 + .4byte .LASF909 .uleb128 0xe .byte 0x4 .4byte 0xbd .uleb128 0xf - .4byte .LASF912 + .4byte .LASF916 .byte 0x1 .byte 0x6 .byte 0x6 @@ -418,7 +418,7 @@ gpio_write: .byte 0x91 .sleb128 -18 .uleb128 0x10 - .4byte .LASF906 + .4byte .LASF910 .byte 0x1 .byte 0x6 .byte 0x2c @@ -427,7 +427,7 @@ gpio_write: .byte 0x91 .sleb128 -19 .uleb128 0x7 - .4byte .LASF907 + .4byte .LASF911 .byte 0x7 .4byte 0x1b3 .uleb128 0x2 @@ -3525,7 +3525,7 @@ gpio_write: .uleb128 0x32 .4byte .LASF854 .byte 0 - .section .debug_macro,"G",%progbits,wm4.gpio.h.2.482807a1c0512cd436d5862f3edb1adc,comdat + .section .debug_macro,"G",%progbits,wm4.gpio.h.2.bc74b8bd59193b3190f972f5d232b4bf,comdat .Ldebug_macro15: .2byte 0x5 .byte 0 @@ -3542,40 +3542,40 @@ gpio_write: .uleb128 0x18 .4byte .LASF858 .byte 0x5 - .uleb128 0x19 + .uleb128 0x1a .4byte .LASF859 .byte 0x5 - .uleb128 0x1a + .uleb128 0x1b .4byte .LASF860 .byte 0x5 - .uleb128 0x1c + .uleb128 0x1d .4byte .LASF861 .byte 0x5 - .uleb128 0x1d + .uleb128 0x1e .4byte .LASF862 .byte 0x5 - .uleb128 0x1e + .uleb128 0x20 .4byte .LASF863 .byte 0x5 .uleb128 0x21 .4byte .LASF864 .byte 0x5 - .uleb128 0x22 + .uleb128 0x24 .4byte .LASF865 .byte 0x5 - .uleb128 0x23 + .uleb128 0x25 .4byte .LASF866 .byte 0x5 - .uleb128 0x25 + .uleb128 0x26 .4byte .LASF867 .byte 0x5 - .uleb128 0x26 + .uleb128 0x29 .4byte .LASF868 .byte 0x5 - .uleb128 0x27 + .uleb128 0x2a .4byte .LASF869 .byte 0x5 - .uleb128 0x2c + .uleb128 0x2b .4byte .LASF870 .byte 0x5 .uleb128 0x2d @@ -3584,17 +3584,29 @@ gpio_write: .uleb128 0x2e .4byte .LASF872 .byte 0x5 - .uleb128 0x30 + .uleb128 0x2f .4byte .LASF873 .byte 0x5 - .uleb128 0x32 + .uleb128 0x34 .4byte .LASF874 .byte 0x5 - .uleb128 0x34 + .uleb128 0x35 .4byte .LASF875 .byte 0x5 .uleb128 0x36 .4byte .LASF876 + .byte 0x5 + .uleb128 0x38 + .4byte .LASF877 + .byte 0x5 + .uleb128 0x3a + .4byte .LASF878 + .byte 0x5 + .uleb128 0x3c + .4byte .LASF879 + .byte 0x5 + .uleb128 0x3e + .4byte .LASF880 .byte 0 .section .debug_line,"",%progbits .Ldebug_line0: @@ -3639,7 +3651,7 @@ gpio_write: .ascii "__PTRDIFF_MAX__ 0x7fffffff\000" .LASF541: .ascii "_LONG_DOUBLE long double\000" -.LASF907: +.LASF911: .ascii "gpio\000" .LASF591: .ascii "INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1)\000" @@ -3647,7 +3659,7 @@ gpio_write: .ascii "_UINT32_T_DECLARED \000" .LASF90: .ascii "__INTMAX_MAX__ 0x7fffffffffffffffLL\000" -.LASF902: +.LASF906: .ascii "GPIO_MODE_AF\000" .LASF335: .ascii "__TQ_IBIT__ 0\000" @@ -3711,8 +3723,6 @@ gpio_write: .ascii "PRIXFAST32 __PRI32FAST(X)\000" .LASF525: .ascii "__INT8 \"hh\"\000" -.LASF860: - .ascii "GPIO_MODER_MODER3_AF (0b10)\000" .LASF47: .ascii "__UINT8_TYPE__ unsigned char\000" .LASF368: @@ -3765,12 +3775,14 @@ gpio_write: .ascii "__need_wchar_t\000" .LASF199: .ascii "__FLT32_MIN_EXP__ (-125)\000" -.LASF908: +.LASF912: .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" .ascii "ections -fno-builtin -fno-common\000" -.LASF864: +.LASF865: + .ascii "GPIO_AFRH_AFRH8_BIT 0\000" +.LASF868: .ascii "GPIO_AFRL_AFRL3_BIT 12\000" .LASF595: .ascii "INT16_MAX (__INT16_MAX__)\000" @@ -3852,7 +3864,7 @@ gpio_write: .ascii "__INT64 \"ll\"\000" .LASF138: .ascii "__INTPTR_MAX__ 0x7fffffff\000" -.LASF872: +.LASF876: .ascii "GPIO(port) ((struct gpio*)(uintptr_t)(GPIO_BASE_ADD" .ascii "R + (GPIO_PORT_OFFSET * port)))\000" .LASF499: @@ -3888,7 +3900,7 @@ gpio_write: .ascii "PRId64 __PRI64(d)\000" .LASF302: .ascii "__UACCUM_IBIT__ 16\000" -.LASF881: +.LASF885: .ascii "long int\000" .LASF818: .ascii "PRIXFAST64 __PRI64FAST(X)\000" @@ -3916,6 +3928,8 @@ gpio_write: .ascii "PRIdFAST32 __PRI32FAST(d)\000" .LASF93: .ascii "__UINTMAX_C(c) c ## ULL\000" +.LASF866: + .ascii "GPIO_AFRH_AFRH8_MASK (0b1111)\000" .LASF31: .ascii "__SIZEOF_POINTER__ 4\000" .LASF621: @@ -3924,8 +3938,6 @@ gpio_write: .ascii "__GCC_ATOMIC_BOOL_LOCK_FREE 2\000" .LASF554: .ascii "___int64_t_defined 1\000" -.LASF863: - .ascii "GPIO_MODER_MODER2_AF (0b10)\000" .LASF432: .ascii "__ARM_NEON__\000" .LASF587: @@ -3986,7 +3998,7 @@ gpio_write: .ascii "PRIoLEAST16 __PRI16LEAST(o)\000" .LASF458: .ascii "__NEWLIB__ 4\000" -.LASF900: +.LASF904: .ascii "GPIO_MODE_INPUT\000" .LASF720: .ascii "SCNi16 __SCN16(i)\000" @@ -3996,7 +4008,7 @@ gpio_write: .ascii "__FLT_DECIMAL_DIG__ 9\000" .LASF562: .ascii "_UINT8_T_DECLARED \000" -.LASF877: +.LASF881: .ascii "signed char\000" .LASF805: .ascii "PRIuLEAST64 __PRI64LEAST(u)\000" @@ -4008,7 +4020,7 @@ gpio_write: .ascii "__ARM_FEATURE_FMA 1\000" .LASF364: .ascii "__GNUC_STDC_INLINE__ 1\000" -.LASF904: +.LASF908: .ascii "GPIO_MODE\000" .LASF256: .ascii "__FRACT_FBIT__ 15\000" @@ -4030,11 +4042,11 @@ gpio_write: .ascii "__SACCUM_MAX__ 0X7FFFP-7HK\000" .LASF219: .ascii "__FLT64_MAX_10_EXP__ 308\000" -.LASF868: +.LASF872: .ascii "GPIO_AFRL_AFRL2_MASK (0b1111)\000" .LASF65: .ascii "__UINT_FAST32_TYPE__ unsigned int\000" -.LASF878: +.LASF882: .ascii "unsigned char\000" .LASF3: .ascii "__STDC_UTF_32__ 1\000" @@ -4082,13 +4094,13 @@ gpio_write: .ascii "__int_fast64_t_defined 1\000" .LASF837: .ascii "__PRIPTR(x) __STRINGIFY(x)\000" -.LASF889: +.LASF893: .ascii "uint16_t\000" .LASF417: .ascii "__thumb2__ 1\000" .LASF321: .ascii "__ULLACCUM_FBIT__ 32\000" -.LASF905: +.LASF909: .ascii "_Bool\000" .LASF366: .ascii "__STRICT_ANSI__ 1\000" @@ -4106,7 +4118,7 @@ gpio_write: .ascii "__PRAGMA_REDEFINE_EXTNAME 1\000" .LASF36: .ascii "__WCHAR_TYPE__ unsigned int\000" -.LASF901: +.LASF905: .ascii "GPIO_MODE_OUTPUT\000" .LASF357: .ascii "__USA_IBIT__ 16\000" @@ -4144,7 +4156,7 @@ gpio_write: .ascii "__SCN64(x) __INT64 __STRINGIFY(x)\000" .LASF646: .ascii "_GCC_WRAP_STDINT_H \000" -.LASF882: +.LASF886: .ascii "__uint16_t\000" .LASF224: .ascii "__FLT64_EPSILON__ 2.2204460492503131e-16F64\000" @@ -4172,7 +4184,7 @@ gpio_write: .ascii "INTMAX_MAX (__INTMAX_MAX__)\000" .LASF601: .ascii "INT32_MAX (__INT32_MAX__)\000" -.LASF873: +.LASF877: .ascii "BIT(x) (1 << x)\000" .LASF469: .ascii "_MB_LEN_MAX 8\000" @@ -4190,7 +4202,7 @@ gpio_write: .ascii "_END_STD_C \000" .LASF852: .ascii "true ((_Bool)+1u)\000" -.LASF865: +.LASF869: .ascii "GPIO_AFRL_AFRL3_MASK (0b1111)\000" .LASF599: .ascii "UINT_LEAST16_MAX (__UINT_LEAST16_MAX__)\000" @@ -4204,7 +4216,7 @@ gpio_write: .ascii "__FLT_EPSILON__ 1.1920928955078125e-7F\000" .LASF376: .ascii "__GCC_ATOMIC_SHORT_LOCK_FREE 2\000" -.LASF874: +.LASF878: .ascii "PIN(port,num) ((((port) - 'A') << 8) | num)\000" .LASF806: .ascii "PRIxLEAST64 __PRI64LEAST(x)\000" @@ -4270,7 +4282,7 @@ gpio_write: .ascii "__FP_FAST_FMAF 1\000" .LASF628: .ascii "SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1)\000" -.LASF869: +.LASF873: .ascii "GPIO_AFRL_AFRL2_USART2_TX (0b0111)\000" .LASF564: .ascii "_INT16_T_DECLARED \000" @@ -4294,6 +4306,8 @@ gpio_write: .ascii "__ARM_FEATURE_FP16_FML\000" .LASF802: .ascii "PRIdLEAST64 __PRI64LEAST(d)\000" +.LASF858: + .ascii "GPIO_MODER_AF_MODE (0b10)\000" .LASF255: .ascii "__USFRACT_EPSILON__ 0x1P-8UHR\000" .LASF762: @@ -4314,7 +4328,7 @@ gpio_write: .ascii "INT64_C(x) __INT64_C(x)\000" .LASF615: .ascii "INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1)\000" -.LASF862: +.LASF864: .ascii "GPIO_MODER_MODER2_MASK (0b11)\000" .LASF106: .ascii "__INT_LEAST8_MAX__ 0x7f\000" @@ -4342,6 +4356,8 @@ gpio_write: .ascii "__PRI8LEAST(x) __LEAST8 __STRINGIFY(x)\000" .LASF174: .ascii "__DBL_EPSILON__ ((double)2.2204460492503131e-16L)\000" +.LASF860: + .ascii "GPIO_MODER_MODER8_MASK (0b11)\000" .LASF268: .ascii "__LFRACT_MIN__ (-0.5LR-0.5LR)\000" .LASF117: @@ -4364,7 +4380,7 @@ gpio_write: .ascii "___int8_t_defined 1\000" .LASF248: .ascii "__SFRACT_MIN__ (-0.5HR-0.5HR)\000" -.LASF884: +.LASF888: .ascii "long unsigned int\000" .LASF349: .ascii "__SA_IBIT__ 16\000" @@ -4380,7 +4396,7 @@ gpio_write: .ascii "__ARM_FP16_FORMAT_IEEE\000" .LASF48: .ascii "__UINT16_TYPE__ short unsigned int\000" -.LASF911: +.LASF915: .ascii "gpio_write\000" .LASF569: .ascii "__int32_t_defined 1\000" @@ -4424,7 +4440,7 @@ gpio_write: .ascii "SCNx8 __SCN8(x)\000" .LASF208: .ascii "__FLT32_DENORM_MIN__ 1.4012984643248171e-45F32\000" -.LASF912: +.LASF916: .ascii "gpio_set_mode\000" .LASF125: .ascii "__UINT64_C(c) c ## ULL\000" @@ -4446,7 +4462,7 @@ gpio_write: .ascii "__GCC_ATOMIC_CHAR16_T_LOCK_FREE 2\000" .LASF789: .ascii "__PRI64FAST(x) __FAST64 __STRINGIFY(x)\000" -.LASF891: +.LASF895: .ascii "uintptr_t\000" .LASF168: .ascii "__DBL_MAX_EXP__ 1024\000" @@ -4494,7 +4510,7 @@ gpio_write: .ascii "PRIX32 __PRI32(X)\000" .LASF773: .ascii "SCNxLEAST32 __SCN32LEAST(x)\000" -.LASF894: +.LASF898: .ascii "OSPEEDR\000" .LASF711: .ascii "__SCN16LEAST(x) __LEAST16 __STRINGIFY(x)\000" @@ -4524,7 +4540,7 @@ gpio_write: .ascii "__ULACCUM_MIN__ 0.0ULK\000" .LASF461: .ascii "_ATEXIT_DYNAMIC_ALLOC 1\000" -.LASF883: +.LASF887: .ascii "__uint32_t\000" .LASF188: .ascii "__LDBL_MAX__ 1.7976931348623157e+308L\000" @@ -4534,7 +4550,7 @@ gpio_write: .ascii "__FLT_RADIX__ 2\000" .LASF454: .ascii "_INTTYPES_H \000" -.LASF885: +.LASF889: .ascii "long long int\000" .LASF401: .ascii "__ARM_FEATURE_CMSE\000" @@ -4570,7 +4586,7 @@ gpio_write: .ascii "__WCHAR_T \000" .LASF223: .ascii "__FLT64_MIN__ 2.2250738585072014e-308F64\000" -.LASF866: +.LASF870: .ascii "GPIO_AFRL_AFRL3_USART2_RX (0b0111)\000" .LASF553: .ascii "___int32_t_defined 1\000" @@ -4641,20 +4657,22 @@ gpio_write: .ascii "\000" .LASF582: .ascii "__int_fast16_t_defined 1\000" -.LASF892: +.LASF896: .ascii "MODER\000" .LASF482: .ascii "__FLOAT_TYPE float\000" .LASF185: .ascii "__LDBL_MAX_10_EXP__ 308\000" +.LASF867: + .ascii "GPIO_AFRH_AFRH8_MCO_1 (0b0000)\000" .LASF175: .ascii "__DBL_DENORM_MIN__ ((double)4.9406564584124654e-324" .ascii "L)\000" .LASF607: .ascii "INT64_MAX (__INT64_MAX__)\000" -.LASF888: +.LASF892: .ascii "unsigned int\000" -.LASF887: +.LASF891: .ascii "__uintptr_t\000" .LASF459: .ascii "__NEWLIB_MINOR__ 3\000" @@ -4686,7 +4704,7 @@ gpio_write: .ascii "__CHAR_BIT__ 8\000" .LASF143: .ascii "__FLT_EVAL_METHOD__ 0\000" -.LASF879: +.LASF883: .ascii "short int\000" .LASF685: .ascii "PRIdLEAST8 __PRI8LEAST(d)\000" @@ -4746,6 +4764,8 @@ gpio_write: .ascii "__ATFILE_VISIBLE 0\000" .LASF372: .ascii "__GCC_ATOMIC_CHAR_LOCK_FREE 2\000" +.LASF859: + .ascii "GPIO_MODER_MODER8_BIT 16\000" .LASF270: .ascii "__LFRACT_EPSILON__ 0x1P-31LR\000" .LASF808: @@ -4812,7 +4832,7 @@ gpio_write: .ascii "__UFRACT_IBIT__ 0\000" .LASF399: .ascii "__ARM_32BIT_STATE 1\000" -.LASF861: +.LASF863: .ascii "GPIO_MODER_MODER2_BIT 4\000" .LASF107: .ascii "__INT8_C(c) c\000" @@ -4826,13 +4846,13 @@ gpio_write: .ascii "SCNuFAST16 __SCN16FAST(u)\000" .LASF801: .ascii "SCNx64 __SCN64(x)\000" -.LASF876: +.LASF880: .ascii "PINPORT(pin) (pin >> 8)\000" .LASF198: .ascii "__FLT32_DIG__ 6\000" .LASF645: .ascii "UINTMAX_C(x) __UINTMAX_C(x)\000" -.LASF859: +.LASF862: .ascii "GPIO_MODER_MODER3_MASK (0b11)\000" .LASF623: .ascii "UINT_FAST64_MAX (__UINT_FAST64_MAX__)\000" @@ -4876,7 +4896,7 @@ gpio_write: .ascii "__ORDER_LITTLE_ENDIAN__ 1234\000" .LASF155: .ascii "__FLT_NORM_MAX__ 3.4028234663852886e+38F\000" -.LASF886: +.LASF890: .ascii "long long unsigned int\000" .LASF611: .ascii "UINT_LEAST64_MAX (__UINT_LEAST64_MAX__)\000" @@ -4906,8 +4926,8 @@ gpio_write: .ascii "SCNdFAST32 __SCN32FAST(d)\000" .LASF339: .ascii "__UHQ_IBIT__ 0\000" -.LASF858: - .ascii "GPIO_MODER_MODER3_BIT 7\000" +.LASF861: + .ascii "GPIO_MODER_MODER3_BIT 6\000" .LASF60: .ascii "__INT_FAST16_TYPE__ int\000" .LASF631: @@ -4956,11 +4976,11 @@ gpio_write: .ascii "SCNdFAST8 __SCN8FAST(d)\000" .LASF576: .ascii "_UINTPTR_T_DECLARED \000" -.LASF899: +.LASF903: .ascii "AFRH\000" .LASF314: .ascii "__ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK\000" -.LASF898: +.LASF902: .ascii "AFRL\000" .LASF273: .ascii "__ULFRACT_MIN__ 0.0ULR\000" @@ -4974,7 +4994,7 @@ gpio_write: .ascii "__INT32_TYPE__ long int\000" .LASF118: .ascii "__UINT_LEAST8_MAX__ 0xff\000" -.LASF897: +.LASF901: .ascii "LCKR\000" .LASF520: .ascii "__int20__ +2\000" @@ -5020,7 +5040,7 @@ gpio_write: .ascii "__QQ_IBIT__ 0\000" .LASF763: .ascii "PRIdLEAST32 __PRI32LEAST(d)\000" -.LASF893: +.LASF897: .ascii "OTYPER\000" .LASF811: .ascii "SCNuLEAST64 __SCN64LEAST(u)\000" @@ -5040,11 +5060,11 @@ gpio_write: .ascii "__GNUC_MINOR__ 3\000" .LASF57: .ascii "__UINT_LEAST32_TYPE__ long unsigned int\000" -.LASF909: +.LASF913: .ascii "src/gpio.c\000" .LASF405: .ascii "__ARM_FEATURE_NUMERIC_MAXMIN\000" -.LASF870: +.LASF874: .ascii "GPIO_BASE_ADDR (0x40020000U)\000" .LASF38: .ascii "__INTMAX_TYPE__ long long int\000" @@ -5096,7 +5116,7 @@ gpio_write: .ascii "__SCN8(x) __INT8 __STRINGIFY(x)\000" .LASF23: .ascii "__SIZEOF_SIZE_T__ 4\000" -.LASF871: +.LASF875: .ascii "GPIO_PORT_OFFSET (0x400U)\000" .LASF50: .ascii "__UINT64_TYPE__ long long unsigned int\000" @@ -5106,7 +5126,7 @@ gpio_write: .ascii "__INT64_C(c) c ## LL\000" .LASF699: .ascii "PRIuFAST8 __PRI8FAST(u)\000" -.LASF867: +.LASF871: .ascii "GPIO_AFRL_AFRL2_BIT 8\000" .LASF190: .ascii "__LDBL_MIN__ 2.2250738585072014e-308L\000" @@ -5116,7 +5136,7 @@ gpio_write: .ascii "__ACCUM_IBIT__ 16\000" .LASF509: .ascii "unsigned\000" -.LASF895: +.LASF899: .ascii "PUPDR\000" .LASF835: .ascii "SCNuMAX __SCNMAX(u)\000" @@ -5126,7 +5146,7 @@ gpio_write: .ascii "_ATTRIBUTE(attrs) __attribute__ (attrs)\000" .LASF359: .ascii "__UDA_IBIT__ 32\000" -.LASF906: +.LASF910: .ascii "mode\000" .LASF586: .ascii "INTPTR_MAX (__INTPTR_MAX__)\000" @@ -5140,7 +5160,7 @@ gpio_write: .ascii "__UHQ_FBIT__ 16\000" .LASF443: .ascii "__ARM_FEATURE_COPROC\000" -.LASF903: +.LASF907: .ascii "GPIO_MODE_ANALOG\000" .LASF177: .ascii "__DBL_HAS_INFINITY__ 1\000" @@ -5178,7 +5198,7 @@ gpio_write: .ascii "__FAST8 \000" .LASF496: .ascii "__XSI_VISIBLE 0\000" -.LASF896: +.LASF900: .ascii "BSRR\000" .LASF794: .ascii "PRIu64 __PRI64(u)\000" @@ -5266,7 +5286,7 @@ gpio_write: .ascii "PRIx32 __PRI32(x)\000" .LASF278: .ascii "__LLFRACT_MIN__ (-0.5LLR-0.5LLR)\000" -.LASF890: +.LASF894: .ascii "uint32_t\000" .LASF689: .ascii "PRIxLEAST8 __PRI8LEAST(x)\000" @@ -5314,13 +5334,13 @@ gpio_write: .ascii "__INT_LEAST16_TYPE__ short int\000" .LASF326: .ascii "__QQ_FBIT__ 7\000" -.LASF875: +.LASF879: .ascii "PINNUM(pin) (pin & 0b1111)\000" .LASF768: .ascii "PRIXLEAST32 __PRI32LEAST(X)\000" .LASF171: .ascii "__DBL_MAX__ ((double)1.7976931348623157e+308L)\000" -.LASF880: +.LASF884: .ascii "short unsigned int\000" .LASF276: .ascii "__LLFRACT_FBIT__ 63\000" @@ -5368,7 +5388,7 @@ gpio_write: .ascii "__SCN64LEAST(x) __LEAST64 __STRINGIFY(x)\000" .LASF280: .ascii "__LLFRACT_EPSILON__ 0x1P-63LLR\000" -.LASF910: +.LASF914: .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 c3ed08a..0cab24a 100644 --- a/build/gpio.i +++ b/build/gpio.i @@ -2003,13 +2003,21 @@ struct gpio { #define GPIOA ((struct gpio *) GPIOA_BASE_ADDR) -#define GPIO_MODER_MODER3_BIT 7 +#define GPIO_MODER_AF_MODE (0b10) + +#define GPIO_MODER_MODER8_BIT 16 +#define GPIO_MODER_MODER8_MASK (0b11) + +#define GPIO_MODER_MODER3_BIT 6 #define GPIO_MODER_MODER3_MASK (0b11) -#define GPIO_MODER_MODER3_AF (0b10) #define GPIO_MODER_MODER2_BIT 4 #define GPIO_MODER_MODER2_MASK (0b11) -#define GPIO_MODER_MODER2_AF (0b10) + + +#define GPIO_AFRH_AFRH8_BIT 0 +#define GPIO_AFRH_AFRH8_MASK (0b1111) +#define GPIO_AFRH_AFRH8_MCO_1 (0b0000) #define GPIO_AFRL_AFRL3_BIT 12 @@ -2044,9 +2052,9 @@ typedef enum { void gpio_set_mode(uint16_t pin, GPIO_MODE mode); void gpio_write(uint16_t pin, -# 64 "src/gpio.h" 3 4 +# 72 "src/gpio.h" 3 4 _Bool -# 64 "src/gpio.h" +# 72 "src/gpio.h" val); # 5 "src/gpio.c" 2 diff --git a/build/gpio.o b/build/gpio.o index 7613394fd6b1ed8827d7f18f8b5af7f9a8e085aa..f5ee64988c920f97b9daf9a522ca879b36fef734 100644 GIT binary patch delta 6581 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 BI0OIy delta 6445 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 8)\000" .LASF198: .ascii "__FLT32_DIG__ 6\000" -.LASF904: +.LASF895: + .ascii "RCC_CFGR_MCO1PRE_DIV4 (0b110)\000" +.LASF917: .ascii "RCC_APB1ENR_USART2EN_BIT 17\000" -.LASF889: +.LASF902: .ascii "RCC_CFGR_PPRE1_MASK (0b111)\000" .LASF645: .ascii "UINTMAX_C(x) __UINTMAX_C(x)\000" -.LASF912: +.LASF928: .ascii "GPIO_MODER_MODER3_MASK (0b11)\000" .LASF623: .ascii "UINT_FAST64_MAX (__UINT_FAST64_MAX__)\000" @@ -5933,20 +5998,22 @@ main: .ascii "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1\000" .LASF733: .ascii "SCNuLEAST16 __SCN16LEAST(u)\000" -.LASF993: +.LASF1010: .ascii "APB1RSTR\000" .LASF298: .ascii "__ACCUM_MIN__ (-0X1P15K-0X1P15K)\000" .LASF393: .ascii "__ARM_FEATURE_CRYPTO\000" -.LASF999: +.LASF1016: .ascii "APB1ENR\000" .LASF741: .ascii "SCNdFAST16 __SCN16FAST(d)\000" -.LASF872: +.LASF892: + .ascii "RCC_CFGR_MCO1_BIT 21\000" +.LASF874: .ascii "RCC_PLLCFGR_PLLQ(q) ((q & RCC_PLLCFGR_PLLQ_MASK) <<" .ascii " RCC_PLLCFGR_PLLQ_BIT)\000" -.LASF957: +.LASF974: .ascii "USART_SR_TXE_TRANSMITTED (1 << USART_SR_TXE_BIT)\000" .LASF787: .ascii "__PRI64LEAST(x) __LEAST64 __STRINGIFY(x)\000" @@ -5966,18 +6033,18 @@ main: .ascii "__NEWLIB_PATCHLEVEL__ 0\000" .LASF26: .ascii "__ORDER_LITTLE_ENDIAN__ 1234\000" -.LASF874: +.LASF876: .ascii "RCC_PLLCFGR_PLLSRC_HSE (1 << RCC_PLLCFGR_PLLSRC_BIT" .ascii ")\000" .LASF155: .ascii "__FLT_NORM_MAX__ 3.4028234663852886e+38F\000" -.LASF984: +.LASF1001: .ascii "long long unsigned int\000" .LASF611: .ascii "UINT_LEAST64_MAX (__UINT_LEAST64_MAX__)\000" .LASF150: .ascii "__FLT_MIN_10_EXP__ (-37)\000" -.LASF895: +.LASF908: .ascii "RCC_CFGR_SWS_MASK (0b11)\000" .LASF312: .ascii "__ULACCUM_IBIT__ 32\000" @@ -6003,8 +6070,8 @@ main: .ascii "SCNdFAST32 __SCN32FAST(d)\000" .LASF339: .ascii "__UHQ_IBIT__ 0\000" -.LASF911: - .ascii "GPIO_MODER_MODER3_BIT 7\000" +.LASF927: + .ascii "GPIO_MODER_MODER3_BIT 6\000" .LASF60: .ascii "__INT_FAST16_TYPE__ int\000" .LASF574: @@ -6015,20 +6082,20 @@ main: .ascii "__SACCUM_MIN__ (-0X1P7HK-0X1P7HK)\000" .LASF274: .ascii "__ULFRACT_MAX__ 0XFFFFFFFFP-32ULR\000" -.LASF880: +.LASF883: .ascii "RCC_PLLCFGR_PLLN(n) ((n & RCC_PLLCFGR_PLLN_MASK) <<" .ascii " RCC_PLLCFGR_PLLN_BIT)\000" .LASF56: .ascii "__UINT_LEAST16_TYPE__ short unsigned int\000" -.LASF944: +.LASF961: .ascii "PWR_SCALE3 (0b11)\000" .LASF573: .ascii "_INTMAX_T_DECLARED \000" -.LASF1027: +.LASF1044: .ascii "CCER\000" .LASF40: .ascii "__CHAR16_TYPE__ short unsigned int\000" -.LASF959: +.LASF976: .ascii "USART_SR_TC_COMPLETED (1 << USART_SR_TC_BIT)\000" .LASF231: .ascii "__FLT32X_DIG__ 15\000" @@ -6072,6 +6139,8 @@ main: .ascii "SIZE_MAX (__SIZE_MAX__)\000" .LASF333: .ascii "__DQ_IBIT__ 0\000" +.LASF898: + .ascii "RCC_CFGR_MCO1PRE_MASK (0b111)\000" .LASF450: .ascii "__ARM_BF16_FORMAT_ALTERNATIVE\000" .LASF45: @@ -6084,19 +6153,19 @@ main: .ascii "__int20__ +2\000" .LASF654: .ascii "_WCHAR_T_ \000" -.LASF1023: +.LASF1040: .ascii "SMCR\000" .LASF828: .ascii "PRIoMAX __PRIMAX(o)\000" .LASF747: .ascii "__SCN32(x) __INT32 __STRINGIFY(x)\000" -.LASF939: +.LASF956: .ascii "FLASH_ACR_LATENCY_MASK (0b1111)\000" -.LASF1013: +.LASF1030: .ascii "GPIO_MODE_INPUT\000" .LASF743: .ascii "SCNoFAST16 __SCN16FAST(o)\000" -.LASF1040: +.LASF1057: .ascii "usart2_init\000" .LASF345: .ascii "__UTQ_IBIT__ 0\000" @@ -6122,7 +6191,7 @@ main: .ascii "PRIi16 __PRI16(i)\000" .LASF390: .ascii "__ARM_FEATURE_DSP 1\000" -.LASF965: +.LASF982: .ascii "USART_CR1_UE_ENABLE (1 << USART_CR1_UE_BIT)\000" .LASF825: .ascii "__SCNMAX(x) __STRINGIFY(ll ##x)\000" @@ -6150,15 +6219,15 @@ main: .ascii "__UINT_LEAST32_TYPE__ long unsigned int\000" .LASF405: .ascii "__ARM_FEATURE_NUMERIC_MAXMIN\000" -.LASF923: +.LASF940: .ascii "GPIO_BASE_ADDR (0x40020000U)\000" .LASF38: .ascii "__INTMAX_TYPE__ long long int\000" .LASF377: .ascii "__GCC_ATOMIC_INT_LOCK_FREE 2\000" -.LASF971: +.LASF988: .ascii "USART_BRR_MANTISSA_MASK (0b111111111111)\000" -.LASF960: +.LASF977: .ascii "USART_SR_RXNE_BIT 5\000" .LASF561: .ascii "_INT8_T_DECLARED \000" @@ -6166,7 +6235,7 @@ main: .ascii "__ARM_ARCH_7EM__ 1\000" .LASF428: .ascii "__ARM_FEATURE_FP16_SCALAR_ARITHMETIC\000" -.LASF996: +.LASF1013: .ascii "AHB1ENR\000" .LASF295: .ascii "__USACCUM_EPSILON__ 0x1P-8UHK\000" @@ -6206,11 +6275,11 @@ main: .ascii "__DBL_DIG__ 15\000" .LASF275: .ascii "__ULFRACT_EPSILON__ 0x1P-32ULR\000" -.LASF991: +.LASF1008: .ascii "AHB2RSTR\000" .LASF671: .ascii "__SCN8(x) __INT8 __STRINGIFY(x)\000" -.LASF887: +.LASF900: .ascii "RCC_CFGR_PPRE2_MASK (0b111)\000" .LASF23: .ascii "__SIZEOF_SIZE_T__ 4\000" @@ -6226,38 +6295,38 @@ main: .ascii "_FVWRITE_IN_STREAMIO 1\000" .LASF183: .ascii "__LDBL_MIN_10_EXP__ (-307)\000" -.LASF920: +.LASF937: .ascii "GPIO_AFRL_AFRL2_BIT 8\000" .LASF190: .ascii "__LDBL_MIN__ 2.2250738585072014e-308L\000" .LASF445: .ascii "__ARM_FEATURE_CDE\000" -.LASF1019: +.LASF1036: .ascii "KEYR\000" .LASF509: .ascii "unsigned\000" .LASF381: .ascii "__GCC_DESTRUCTIVE_SIZE 64\000" -.LASF977: +.LASF994: .ascii "short int\000" .LASF835: .ascii "SCNuMAX __SCNMAX(u)\000" -.LASF955: +.LASF972: .ascii "USART2 ((struct usart *) USART2_BASE_ADDR)\000" .LASF121: .ascii "__UINT16_C(c) c\000" -.LASF972: +.LASF989: .ascii "USART_BRR_FRACTION_BIT 0\000" .LASF359: .ascii "__UDA_IBIT__ 32\000" .LASF534: .ascii "__LEAST16 \"h\"\000" -.LASF882: +.LASF885: .ascii "RCC_PLLCFGR_PLLM_MASK (0b111111)\000" .LASF365: .ascii "__NO_INLINE__ 1\000" -.LASF958: - .ascii "USART_SR_TC_BIT 6\000" +.LASF889: + .ascii "RCC_CFGR_MCO1_HSI (0b00)\000" .LASF710: .ascii "__SCN16(x) __INT16 __STRINGIFY(x)\000" .LASF606: @@ -6268,22 +6337,24 @@ main: .ascii "_ATTRIBUTE(attrs) __attribute__ (attrs)\000" .LASF443: .ascii "__ARM_FEATURE_COPROC\000" -.LASF1016: +.LASF1033: .ascii "GPIO_MODE_ANALOG\000" .LASF177: .ascii "__DBL_HAS_INFINITY__ 1\000" -.LASF950: +.LASF967: .ascii "TIM4 ((struct timer *) TIM4_BASE_ADDR)\000" .LASF95: .ascii "__SIG_ATOMIC_MAX__ 0x7fffffff\000" .LASF608: .ascii "UINT64_MAX (__UINT64_MAX__)\000" -.LASF901: +.LASF914: .ascii "RCC_AHB1ENR_GPIOAEN_ENABLE (1 << RCC_AHB1ENR_GPIOAE" .ascii "N_BIT)\000" +.LASF932: + .ascii "GPIO_AFRH_AFRH8_MASK (0b1111)\000" .LASF471: .ascii "_RETARGETABLE_LOCKING 1\000" -.LASF933: +.LASF950: .ascii "FLASH_ACR_DCEN_BIT 10\000" .LASF453: .ascii "__USES_INITFINI__ 1\000" @@ -6307,7 +6378,7 @@ main: .ascii "__INT16_MAX__ 0x7fff\000" .LASF478: .ascii "__SYS_CONFIG_H__ \000" -.LASF881: +.LASF884: .ascii "RCC_PLLCFGR_PLLM_BIT 0\000" .LASF8: .ascii "__VERSION__ \"12.3.1 20230626\"\000" @@ -6343,7 +6414,7 @@ main: .ascii "PRIdMAX __PRIMAX(d)\000" .LASF388: .ascii "__SIZEOF_WINT_T__ 4\000" -.LASF886: +.LASF899: .ascii "RCC_CFGR_PPRE2_BIT 13\000" .LASF782: .ascii "SCNoFAST32 __SCN32FAST(o)\000" @@ -6355,11 +6426,11 @@ main: .ascii "__LDBL_DECIMAL_DIG__ 17\000" .LASF701: .ascii "PRIXFAST8 __PRI8FAST(X)\000" -.LASF1043: +.LASF1060: .ascii "led_on\000" .LASF308: .ascii "__LACCUM_MIN__ (-0X1P31LK-0X1P31LK)\000" -.LASF1045: +.LASF1062: .ascii "src/main.c\000" .LASF126: .ascii "__INT_FAST8_MAX__ 0x7fffffff\000" @@ -6397,13 +6468,13 @@ main: .ascii "__ULLFRACT_MIN__ 0.0ULLR\000" .LASF651: .ascii "_T_WCHAR_ \000" -.LASF1032: +.LASF1049: .ascii "BDTR\000" .LASF382: .ascii "__GCC_CONSTRUCTIVE_SIZE 64\000" .LASF664: .ascii "_BSD_WCHAR_T_\000" -.LASF1011: +.LASF1028: .ascii "PLLI2SCFGR\000" .LASF277: .ascii "__LLFRACT_IBIT__ 0\000" @@ -6411,23 +6482,23 @@ main: .ascii "UINT16_C(x) __UINT16_C(x)\000" .LASF756: .ascii "PRIx32 __PRI32(x)\000" -.LASF1041: +.LASF1058: .ascii "tim4_init\000" -.LASF987: +.LASF1004: .ascii "uint32_t\000" -.LASF878: +.LASF881: .ascii "RCC_PLLCFGR_PLLN_BIT 6\000" .LASF689: .ascii "PRIxLEAST8 __PRI8LEAST(x)\000" .LASF506: .ascii "_SYS__INTSUP_H \000" -.LASF1021: +.LASF1038: .ascii "OPTCR\000" .LASF290: .ascii "__SACCUM_EPSILON__ 0x1P-7HK\000" .LASF415: .ascii "__GCC_ASM_FLAG_OUTPUTS__ 1\000" -.LASF931: +.LASF948: .ascii "FLASH_BASE_ADDR (0x40023C00U)\000" .LASF745: .ascii "SCNxFAST16 __SCN16FAST(x)\000" @@ -6451,9 +6522,11 @@ main: .ascii "__ULACCUM_EPSILON__ 0x1P-32ULK\000" .LASF181: .ascii "__LDBL_DIG__ 15\000" +.LASF894: + .ascii "RCC_CFGR_MCO1PRE_DIV5 (0b111)\000" .LASF89: .ascii "__SIZE_WIDTH__ 32\000" -.LASF876: +.LASF879: .ascii "RCC_PLLCFGR_PLLP_MASK (0b11)\000" .LASF480: .ascii "_SUPPORTS_ERREXCEPT \000" @@ -6461,7 +6534,7 @@ main: .ascii "__FLT64_DIG__ 15\000" .LASF524: .ascii "_INT32_EQ_LONG \000" -.LASF884: +.LASF887: .ascii "RCC_CFGR_PPRE_DIV_NONE 0\000" .LASF77: .ascii "__WINT_MAX__ 0xffffffffU\000" @@ -6473,13 +6546,13 @@ main: .ascii "__PRI16(x) __INT16 __STRINGIFY(x)\000" .LASF159: .ascii "__FLT_HAS_DENORM__ 1\000" -.LASF928: +.LASF945: .ascii "PINNUM(pin) (pin & 0b1111)\000" .LASF768: .ascii "PRIXLEAST32 __PRI32LEAST(X)\000" .LASF171: .ascii "__DBL_MAX__ ((double)1.7976931348623157e+308L)\000" -.LASF978: +.LASF995: .ascii "short unsigned int\000" .LASF276: .ascii "__LLFRACT_FBIT__ 63\000" @@ -6487,7 +6560,7 @@ main: .ascii "__FLT32_HAS_INFINITY__ 1\000" .LASF416: .ascii "__thumb__ 1\000" -.LASF970: +.LASF987: .ascii "USART_BRR_MANTISSA_BIT 4\000" .LASF421: .ascii "__ARMEL__ 1\000" @@ -6497,23 +6570,25 @@ main: .ascii "__HQ_FBIT__ 15\000" .LASF854: .ascii "__bool_true_false_are_defined 1\000" -.LASF964: +.LASF981: .ascii "USART_CR1_UE_BIT 13\000" -.LASF925: +.LASF942: .ascii "GPIO(port) ((struct gpio*)(uintptr_t)(GPIO_BASE_ADD" .ascii "R + (GPIO_PORT_OFFSET * port)))\000" .LASF798: .ascii "SCNi64 __SCN64(i)\000" -.LASF866: +.LASF868: .ascii "RCC_CR_HSIRDY_BIT 1\000" .LASF80: .ascii "__SIZE_MAX__ 0xffffffffU\000" -.LASF1034: +.LASF1051: .ascii "usart2_write\000" .LASF818: .ascii "PRIXFAST64 __PRI64FAST(X)\000" -.LASF930: +.LASF947: .ascii "FLASH_H_ \000" +.LASF863: + .ascii "RCC_CR_CSS_ON (1 << RCC_CR_CSS_BIT)\000" .LASF412: .ascii "__ARM_ARCH\000" .LASF590: @@ -6530,7 +6605,7 @@ main: .ascii "SCNuFAST32 __SCN32FAST(u)\000" .LASF522: .ascii "long +4\000" -.LASF990: +.LASF1007: .ascii "AHB1RSTR\000" .LASF723: .ascii "SCNx16 __SCN16(x)\000" @@ -6540,7 +6615,7 @@ main: .ascii "__SCN64LEAST(x) __LEAST64 __STRINGIFY(x)\000" .LASF340: .ascii "__USQ_FBIT__ 32\000" -.LASF1046: +.LASF1063: .ascii "/home/alex/code/own/stm32-falling-sand\000" .LASF796: .ascii "PRIX64 __PRI64(X)\000" @@ -6578,7 +6653,7 @@ main: .ascii "__DBL_MIN_10_EXP__ (-307)\000" .LASF795: .ascii "PRIx64 __PRI64(x)\000" -.LASF966: +.LASF983: .ascii "USART_CR1_TE_BIT 3\000" .LASF512: .ascii "__int20\000" @@ -6598,7 +6673,7 @@ main: .ascii "__ULFRACT_IBIT__ 0\000" .LASF857: .ascii "RCC ((struct rcc *) RCC_BASE_ADDR)\000" -.LASF892: +.LASF905: .ascii "RCC_CFGR_HPRE_MASK (0b1111)\000" .LASF72: .ascii "__INT_MAX__ 0x7fffffff\000" @@ -6606,7 +6681,7 @@ main: .ascii "__INT_LEAST64_TYPE__ long long int\000" .LASF103: .ascii "__UINT16_MAX__ 0xffff\000" -.LASF942: +.LASF959: .ascii "PWR_BASE_ADDR (0x40007000U)\000" .LASF446: .ascii "__ARM_FEATURE_CDE_COPROC\000" diff --git a/build/main.i b/build/main.i index e46b82c..e7ac7fc 100644 --- a/build/main.i +++ b/build/main.i @@ -2029,6 +2029,11 @@ struct rcc { #define RCC_CR_PLLON_ON (1 << RCC_CR_PLLON_BIT) +#define RCC_CR_CSS_BIT 19 +#define RCC_CR_CSS_ON (1 << RCC_CR_CSS_BIT) + + + #define RCC_CR_HSERDY_BIT 17 #define RCC_CR_HSERDY_READY (1 << RCC_CR_HSERDY_BIT) @@ -2051,6 +2056,7 @@ struct rcc { #define RCC_PLLCFGR_PLLSRC_BIT 22 #define RCC_PLLCFGR_PLLSRC_HSE (1 << RCC_PLLCFGR_PLLSRC_BIT) +#define RCC_PLLCFGR_PLLSRC_HSI (0 << RCC_PLLCFGR_PLLSRC_BIT) #define RCC_PLLCFGR_PLLP_BIT 16 #define RCC_PLLCFGR_PLLP_MASK (0b11) @@ -2070,6 +2076,21 @@ struct rcc { #define RCC_CFGR_PPRE_DIV_2 (0b100) +#define RCC_CFGR_MCO1_HSI (0b00) +#define RCC_CFGR_MCO1_HSE (0b10) +#define RCC_CFGR_MCO1_PLL (0b11) + +#define RCC_CFGR_MCO1_BIT 21 +#define RCC_CFGR_MCO1_MASK (0b11) + +#define RCC_CFGR_MCO1PRE_DIV5 (0b111) +#define RCC_CFGR_MCO1PRE_DIV4 (0b110) +#define RCC_CFGR_MCO1PRE_DIV2 (0b100) + +#define RCC_CFGR_MCO1PRE_BIT 24 +#define RCC_CFGR_MCO1PRE_MASK (0b111) + + #define RCC_CFGR_PPRE2_BIT 13 #define RCC_CFGR_PPRE2_MASK (0b111) @@ -2090,6 +2111,7 @@ struct rcc { #define RCC_CFGR_SWS_MASK (0b11) +#define RCC_CFGR_SW_PLL (0b10) #define RCC_CFGR_SW_PLL (0b10) #define RCC_CFGR_SW_BIT 0 @@ -2135,13 +2157,21 @@ struct gpio { #define GPIOA ((struct gpio *) GPIOA_BASE_ADDR) -#define GPIO_MODER_MODER3_BIT 7 +#define GPIO_MODER_AF_MODE (0b10) + +#define GPIO_MODER_MODER8_BIT 16 +#define GPIO_MODER_MODER8_MASK (0b11) + +#define GPIO_MODER_MODER3_BIT 6 #define GPIO_MODER_MODER3_MASK (0b11) -#define GPIO_MODER_MODER3_AF (0b10) #define GPIO_MODER_MODER2_BIT 4 #define GPIO_MODER_MODER2_MASK (0b11) -#define GPIO_MODER_MODER2_AF (0b10) + + +#define GPIO_AFRH_AFRH8_BIT 0 +#define GPIO_AFRH_AFRH8_MASK (0b1111) +#define GPIO_AFRH_AFRH8_MCO_1 (0b0000) #define GPIO_AFRL_AFRL3_BIT 12 @@ -2176,9 +2206,9 @@ typedef enum { void gpio_set_mode(uint16_t pin, GPIO_MODE mode); void gpio_write(uint16_t pin, -# 64 "src/gpio.h" 3 4 +# 72 "src/gpio.h" 3 4 _Bool -# 64 "src/gpio.h" +# 72 "src/gpio.h" val); # 6 "src/main.c" 2 # 1 "src/flash.h" 1 @@ -2350,9 +2380,14 @@ static void system_clock_init(void) { ((struct pwr *) (0x40007000U))->CR |= ((0b11) << 14); + ((struct rcc *) (0x40023800U))->CR &= ~(1 << 0); +# 34 "src/main.c" ((struct rcc *) (0x40023800U))->CR |= (1 << 16); + ((struct rcc *) (0x40023800U))->CR |= (1 << 19); + + while (!(((struct rcc *) (0x40023800U))->CR & (1 << 17))); @@ -2361,10 +2396,11 @@ static void system_clock_init(void) { ((struct rcc *) (0x40023800U))->CR &= ~(1 << 24); + ((struct rcc *) (0x40023800U))->PLLCFGR |= (1 << 22); - ((struct rcc *) (0x40023800U))->PLLCFGR |= ((25 & (0b111111)) << 0) | ((196 & (0b111111111)) << 6) | ((2 & (0b11)) << 16) | ((4 & (0b1111)) << 24); + ((struct rcc *) (0x40023800U))->PLLCFGR |= ((25 & (0b111111)) << 0) | ((192 & (0b111111111)) << 6) | ((2 & (0b11)) << 16) | ((4 & (0b1111)) << 24); ((struct rcc *) (0x40023800U))->CFGR &= ~((0b1111) << 4); @@ -2383,26 +2419,23 @@ static void system_clock_init(void) { - while (!(((struct rcc *) (0x40023800U))->CR & (1 << 17))); + while (!(((struct rcc *) (0x40023800U))->CR & (1 << 25))); ((struct flash *) (0x40023C00U))->ACR |= (1 <<10); ((struct flash *) (0x40023C00U))->ACR |= (1 <<9); - ((struct flash *) (0x40023C00U))->ACR &= ~((0b1111) << 0); - ((struct rcc *) (0x40023800U))->CFGR |= ((0x0111) << 0); - ((struct rcc *) (0x40023800U))->CFGR &= ~((0b11) << 0); - ((struct rcc *) (0x40023800U))->CFGR |= ((0b10) << 0); + + + + ((struct rcc *) (0x40023800U))->CFGR |= (((0b10) & (0b11)) << 0); while (((((struct rcc *) (0x40023800U))->CFGR >> 2) & (0b11)) != (0b10)); - - - ((struct rcc *) (0x40023800U))->CR &= ~(1 << 0); } int main(void) { @@ -2419,20 +2452,20 @@ int main(void) { uint16_t counter = ((struct timer *) (0x40000800U))->CNT; -# 90 "src/main.c" 3 4 +# 103 "src/main.c" 3 4 _Bool -# 90 "src/main.c" +# 103 "src/main.c" led_on = -# 90 "src/main.c" 3 4 +# 103 "src/main.c" 3 4 ((_Bool)+0u) -# 90 "src/main.c" +# 103 "src/main.c" ; while(1) { if ((((struct timer *) (0x40000800U))->CNT - counter) >= 250) { led_on = !led_on; gpio_write(led, led_on); - usart2_write("hello, world\n"); + usart2_write("hello, world!\n"); counter = ((struct timer *) (0x40000800U))->CNT; } diff --git a/build/main.o b/build/main.o index 3687611e2a2dc5a7e5be3416f8deb57c674e7256..5a29d5554b51de0ca21477de59fd0cc67276fbac 100644 GIT binary patch delta 9106 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 delta 8642 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 = (uint16_t) 48000 - 1; + ((struct timer *) (0x40000800U))->PSC = (uint16_t) 96000 - 1; ((struct timer *) (0x40000800U))->ARR = (uint16_t) 0xFFFF; diff --git a/build/timer.o b/build/timer.o index ef13007a9fb6e5ec660b6e4ea289dd4b14157fd8..dbd3731085638b78d109b1a4dcf52474a8ec29a6 100644 GIT binary patch delta 7436 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 8)\000" .LASF198: .ascii "__FLT32_DIG__ 6\000" -.LASF899: +.LASF890: + .ascii "RCC_CFGR_MCO1PRE_DIV4 (0b110)\000" +.LASF912: .ascii "RCC_APB1ENR_USART2EN_BIT 17\000" -.LASF884: +.LASF897: .ascii "RCC_CFGR_PPRE1_MASK (0b111)\000" .LASF646: .ascii "UINTMAX_C(x) __UINTMAX_C(x)\000" -.LASF912: +.LASF928: .ascii "GPIO_MODER_MODER3_MASK (0b11)\000" .LASF624: .ascii "UINT_FAST64_MAX (__UINT_FAST64_MAX__)\000" @@ -5546,22 +5629,24 @@ usart2_write: .ascii "__SACCUM_FBIT__ 7\000" .LASF734: .ascii "SCNuLEAST16 __SCN16LEAST(u)\000" -.LASF969: +.LASF986: .ascii "APB1RSTR\000" .LASF298: .ascii "__ACCUM_MIN__ (-0X1P15K-0X1P15K)\000" .LASF393: .ascii "__ARM_FEATURE_CRYPTO\000" -.LASF975: +.LASF992: .ascii "APB1ENR\000" .LASF698: .ascii "PRIiFAST8 __PRI8FAST(i)\000" .LASF742: .ascii "SCNdFAST16 __SCN16FAST(d)\000" -.LASF867: +.LASF887: + .ascii "RCC_CFGR_MCO1_BIT 21\000" +.LASF869: .ascii "RCC_PLLCFGR_PLLQ(q) ((q & RCC_PLLCFGR_PLLQ_MASK) <<" .ascii " RCC_PLLCFGR_PLLQ_BIT)\000" -.LASF934: +.LASF951: .ascii "USART_SR_TXE_TRANSMITTED (1 << USART_SR_TXE_BIT)\000" .LASF788: .ascii "__PRI64LEAST(x) __LEAST64 __STRINGIFY(x)\000" @@ -5581,18 +5666,18 @@ usart2_write: .ascii "__NEWLIB_PATCHLEVEL__ 0\000" .LASF26: .ascii "__ORDER_LITTLE_ENDIAN__ 1234\000" -.LASF869: +.LASF871: .ascii "RCC_PLLCFGR_PLLSRC_HSE (1 << RCC_PLLCFGR_PLLSRC_BIT" .ascii ")\000" .LASF155: .ascii "__FLT_NORM_MAX__ 3.4028234663852886e+38F\000" -.LASF960: +.LASF977: .ascii "long long unsigned int\000" .LASF612: .ascii "UINT_LEAST64_MAX (__UINT_LEAST64_MAX__)\000" .LASF150: .ascii "__FLT_MIN_10_EXP__ (-37)\000" -.LASF890: +.LASF903: .ascii "RCC_CFGR_SWS_MASK (0b11)\000" .LASF312: .ascii "__ULACCUM_IBIT__ 32\000" @@ -5618,6 +5703,8 @@ usart2_write: .ascii "SCNdFAST32 __SCN32FAST(d)\000" .LASF339: .ascii "__UHQ_IBIT__ 0\000" +.LASF927: + .ascii "GPIO_MODER_MODER3_BIT 6\000" .LASF370: .ascii "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1\000" .LASF60: @@ -5630,7 +5717,7 @@ usart2_write: .ascii "__SACCUM_MIN__ (-0X1P7HK-0X1P7HK)\000" .LASF274: .ascii "__ULFRACT_MAX__ 0XFFFFFFFFP-32ULR\000" -.LASF875: +.LASF878: .ascii "RCC_PLLCFGR_PLLN(n) ((n & RCC_PLLCFGR_PLLN_MASK) <<" .ascii " RCC_PLLCFGR_PLLN_BIT)\000" .LASF56: @@ -5641,7 +5728,7 @@ usart2_write: .ascii "__LACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LK\000" .LASF40: .ascii "__CHAR16_TYPE__ short unsigned int\000" -.LASF936: +.LASF953: .ascii "USART_SR_TC_COMPLETED (1 << USART_SR_TC_BIT)\000" .LASF231: .ascii "__FLT32X_DIG__ 15\000" @@ -5675,11 +5762,11 @@ usart2_write: .ascii "SCNdFAST8 __SCN8FAST(d)\000" .LASF577: .ascii "_UINTPTR_T_DECLARED \000" -.LASF997: +.LASF1014: .ascii "AFRH\000" .LASF314: .ascii "__ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK\000" -.LASF996: +.LASF1013: .ascii "AFRL\000" .LASF273: .ascii "__ULFRACT_MIN__ 0.0ULR\000" @@ -5687,6 +5774,8 @@ usart2_write: .ascii "SIZE_MAX (__SIZE_MAX__)\000" .LASF333: .ascii "__DQ_IBIT__ 0\000" +.LASF893: + .ascii "RCC_CFGR_MCO1PRE_MASK (0b111)\000" .LASF450: .ascii "__ARM_BF16_FORMAT_ALTERNATIVE\000" .LASF45: @@ -5705,13 +5794,10 @@ usart2_write: .ascii "__SCN32(x) __INT32 __STRINGIFY(x)\000" .LASF744: .ascii "SCNoFAST16 __SCN16FAST(o)\000" -.LASF1003: +.LASF1020: .ascii "usart2_init\000" .LASF345: .ascii "__UTQ_IBIT__ 0\000" -.LASF925: - .ascii "GPIO(port) ((struct gpio*)(uintptr_t)(GPIO_BASE_ADD" - .ascii "R + (GPIO_PORT_OFFSET * port)))\000" .LASF348: .ascii "__SA_FBIT__ 15\000" .LASF661: @@ -5736,7 +5822,7 @@ usart2_write: .ascii "PRIi16 __PRI16(i)\000" .LASF390: .ascii "__ARM_FEATURE_DSP 1\000" -.LASF942: +.LASF959: .ascii "USART_CR1_UE_ENABLE (1 << USART_CR1_UE_BIT)\000" .LASF826: .ascii "__SCNMAX(x) __STRINGIFY(ll ##x)\000" @@ -5744,7 +5830,7 @@ usart2_write: .ascii "__QQ_IBIT__ 0\000" .LASF764: .ascii "PRIdLEAST32 __PRI32LEAST(d)\000" -.LASF991: +.LASF1008: .ascii "OTYPER\000" .LASF812: .ascii "SCNuLEAST64 __SCN64LEAST(u)\000" @@ -5766,21 +5852,21 @@ usart2_write: .ascii "RCC_H_ \000" .LASF405: .ascii "__ARM_FEATURE_NUMERIC_MAXMIN\000" -.LASF923: +.LASF940: .ascii "GPIO_BASE_ADDR (0x40020000U)\000" .LASF38: .ascii "__INTMAX_TYPE__ long long int\000" .LASF512: .ascii "short\000" -.LASF948: +.LASF965: .ascii "USART_BRR_MANTISSA_MASK (0b111111111111)\000" -.LASF937: +.LASF954: .ascii "USART_SR_RXNE_BIT 5\000" .LASF436: .ascii "__ARM_ARCH_7EM__ 1\000" .LASF428: .ascii "__ARM_FEATURE_FP16_SCALAR_ARITHMETIC\000" -.LASF972: +.LASF989: .ascii "AHB1ENR\000" .LASF295: .ascii "__USACCUM_EPSILON__ 0x1P-8UHK\000" @@ -5820,11 +5906,11 @@ usart2_write: .ascii "__DBL_DIG__ 15\000" .LASF275: .ascii "__ULFRACT_EPSILON__ 0x1P-32ULR\000" -.LASF967: +.LASF984: .ascii "AHB2RSTR\000" .LASF672: .ascii "__SCN8(x) __INT8 __STRINGIFY(x)\000" -.LASF882: +.LASF895: .ascii "RCC_CFGR_PPRE2_MASK (0b111)\000" .LASF23: .ascii "__SIZEOF_SIZE_T__ 4\000" @@ -5840,7 +5926,7 @@ usart2_write: .ascii "_FVWRITE_IN_STREAMIO 1\000" .LASF833: .ascii "SCNdMAX __SCNMAX(d)\000" -.LASF920: +.LASF937: .ascii "GPIO_AFRL_AFRL2_BIT 8\000" .LASF190: .ascii "__LDBL_MIN__ 2.2250738585072014e-308L\000" @@ -5852,11 +5938,11 @@ usart2_write: .ascii "unsigned\000" .LASF381: .ascii "__GCC_DESTRUCTIVE_SIZE 64\000" -.LASF993: +.LASF1010: .ascii "PUPDR\000" .LASF836: .ascii "SCNuMAX __SCNMAX(u)\000" -.LASF932: +.LASF949: .ascii "USART2 ((struct usart *) USART2_BASE_ADDR)\000" .LASF121: .ascii "__UINT16_C(c) c\000" @@ -5864,12 +5950,12 @@ usart2_write: .ascii "__UDA_IBIT__ 32\000" .LASF535: .ascii "__LEAST16 \"h\"\000" -.LASF877: +.LASF880: .ascii "RCC_PLLCFGR_PLLM_MASK (0b111111)\000" .LASF587: .ascii "INTPTR_MAX (__INTPTR_MAX__)\000" -.LASF935: - .ascii "USART_SR_TC_BIT 6\000" +.LASF884: + .ascii "RCC_CFGR_MCO1_HSI (0b00)\000" .LASF711: .ascii "__SCN16(x) __INT16 __STRINGIFY(x)\000" .LASF607: @@ -5886,6 +5972,8 @@ usart2_write: .ascii "__SIG_ATOMIC_MAX__ 0x7fffffff\000" .LASF609: .ascii "UINT64_MAX (__UINT64_MAX__)\000" +.LASF932: + .ascii "GPIO_AFRH_AFRH8_MASK (0b1111)\000" .LASF472: .ascii "_RETARGETABLE_LOCKING 1\000" .LASF440: @@ -5910,7 +5998,7 @@ usart2_write: .ascii "__INT16_MAX__ 0x7fff\000" .LASF479: .ascii "__SYS_CONFIG_H__ \000" -.LASF876: +.LASF879: .ascii "RCC_PLLCFGR_PLLM_BIT 0\000" .LASF8: .ascii "__VERSION__ \"12.3.1 20230626\"\000" @@ -5920,7 +6008,7 @@ usart2_write: .ascii "__FAST8 \000" .LASF497: .ascii "__XSI_VISIBLE 0\000" -.LASF994: +.LASF1011: .ascii "BSRR\000" .LASF795: .ascii "PRIu64 __PRI64(u)\000" @@ -5946,7 +6034,7 @@ usart2_write: .ascii "PRIdMAX __PRIMAX(d)\000" .LASF388: .ascii "__SIZEOF_WINT_T__ 4\000" -.LASF881: +.LASF894: .ascii "RCC_CFGR_PPRE2_BIT 13\000" .LASF783: .ascii "SCNoFAST32 __SCN32FAST(o)\000" @@ -5958,6 +6046,9 @@ usart2_write: .ascii "__LDBL_DECIMAL_DIG__ 17\000" .LASF702: .ascii "PRIXFAST8 __PRI8FAST(X)\000" +.LASF907: + .ascii "RCC_CFGR_SW(clock) ((clock & RCC_CFGR_SW_MASK) << R" + .ascii "CC_CFGR_SW_BIT)\000" .LASF308: .ascii "__LACCUM_MIN__ (-0X1P31LK-0X1P31LK)\000" .LASF785: @@ -6004,7 +6095,7 @@ usart2_write: .ascii "__GCC_CONSTRUCTIVE_SIZE 64\000" .LASF665: .ascii "_BSD_WCHAR_T_\000" -.LASF987: +.LASF1004: .ascii "PLLI2SCFGR\000" .LASF277: .ascii "__LLFRACT_IBIT__ 0\000" @@ -6014,9 +6105,9 @@ usart2_write: .ascii "PRIx32 __PRI32(x)\000" .LASF278: .ascii "__LLFRACT_MIN__ (-0.5LLR-0.5LLR)\000" -.LASF963: +.LASF980: .ascii "uint32_t\000" -.LASF873: +.LASF876: .ascii "RCC_PLLCFGR_PLLN_BIT 6\000" .LASF690: .ascii "PRIxLEAST8 __PRI8LEAST(x)\000" @@ -6050,9 +6141,11 @@ usart2_write: .ascii "__ULACCUM_EPSILON__ 0x1P-32ULK\000" .LASF181: .ascii "__LDBL_DIG__ 15\000" +.LASF889: + .ascii "RCC_CFGR_MCO1PRE_DIV5 (0b111)\000" .LASF89: .ascii "__SIZE_WIDTH__ 32\000" -.LASF871: +.LASF874: .ascii "RCC_PLLCFGR_PLLP_MASK (0b11)\000" .LASF481: .ascii "_SUPPORTS_ERREXCEPT \000" @@ -6068,13 +6161,13 @@ usart2_write: .ascii "__INT_LEAST16_TYPE__ short int\000" .LASF326: .ascii "__QQ_FBIT__ 7\000" -.LASF928: +.LASF945: .ascii "PINNUM(pin) (pin & 0b1111)\000" .LASF769: .ascii "PRIXLEAST32 __PRI32LEAST(X)\000" .LASF171: .ascii "__DBL_MAX__ ((double)1.7976931348623157e+308L)\000" -.LASF954: +.LASF971: .ascii "short unsigned int\000" .LASF276: .ascii "__LLFRACT_FBIT__ 63\000" @@ -6082,7 +6175,7 @@ usart2_write: .ascii "__FLT32_HAS_INFINITY__ 1\000" .LASF416: .ascii "__thumb__ 1\000" -.LASF947: +.LASF964: .ascii "USART_BRR_MANTISSA_BIT 4\000" .LASF421: .ascii "__ARMEL__ 1\000" @@ -6090,22 +6183,25 @@ usart2_write: .ascii "PRIXLEAST8 __PRI8LEAST(X)\000" .LASF328: .ascii "__HQ_FBIT__ 15\000" -.LASF908: +.LASF921: .ascii "__bool_true_false_are_defined 1\000" -.LASF941: +.LASF958: .ascii "USART_CR1_UE_BIT 13\000" -.LASF911: - .ascii "GPIO_MODER_MODER3_BIT 7\000" +.LASF942: + .ascii "GPIO(port) ((struct gpio*)(uintptr_t)(GPIO_BASE_ADD" + .ascii "R + (GPIO_PORT_OFFSET * port)))\000" .LASF799: .ascii "SCNi64 __SCN64(i)\000" -.LASF861: +.LASF863: .ascii "RCC_CR_HSIRDY_BIT 1\000" .LASF80: .ascii "__SIZE_MAX__ 0xffffffffU\000" -.LASF1000: +.LASF1017: .ascii "usart2_write\000" .LASF819: .ascii "PRIXFAST64 __PRI64FAST(X)\000" +.LASF858: + .ascii "RCC_CR_CSS_ON (1 << RCC_CR_CSS_BIT)\000" .LASF412: .ascii "__ARM_ARCH\000" .LASF591: @@ -6122,7 +6218,7 @@ usart2_write: .ascii "SCNuFAST32 __SCN32FAST(u)\000" .LASF523: .ascii "long +4\000" -.LASF966: +.LASF983: .ascii "AHB1RSTR\000" .LASF724: .ascii "SCNx16 __SCN16(x)\000" @@ -6132,7 +6228,7 @@ usart2_write: .ascii "__SCN64LEAST(x) __LEAST64 __STRINGIFY(x)\000" .LASF340: .ascii "__USQ_FBIT__ 32\000" -.LASF1006: +.LASF1023: .ascii "/home/alex/code/own/stm32-falling-sand\000" .LASF797: .ascii "PRIX64 __PRI64(X)\000" @@ -6172,7 +6268,7 @@ usart2_write: .ascii "__DBL_MIN_10_EXP__ (-307)\000" .LASF796: .ascii "PRIx64 __PRI64(x)\000" -.LASF943: +.LASF960: .ascii "USART_CR1_TE_BIT 3\000" .LASF513: .ascii "__int20\000" @@ -6180,7 +6276,7 @@ usart2_write: .ascii "INT_FAST32_MAX (__INT_FAST32_MAX__)\000" .LASF205: .ascii "__FLT32_NORM_MAX__ 3.4028234663852886e+38F32\000" -.LASF905: +.LASF918: .ascii "bool _Bool\000" .LASF632: .ascii "PTRDIFF_MIN (-PTRDIFF_MAX - 1)\000" @@ -6190,7 +6286,7 @@ usart2_write: .ascii "__DBL_MANT_DIG__ 53\000" .LASF272: .ascii "__ULFRACT_IBIT__ 0\000" -.LASF887: +.LASF900: .ascii "RCC_CFGR_HPRE_MASK (0b1111)\000" .LASF72: .ascii "__INT_MAX__ 0x7fffffff\000" diff --git a/build/usart.i b/build/usart.i index 4a86ecc..f246bca 100644 --- a/build/usart.i +++ b/build/usart.i @@ -2014,6 +2014,11 @@ struct rcc { #define RCC_CR_PLLON_ON (1 << RCC_CR_PLLON_BIT) +#define RCC_CR_CSS_BIT 19 +#define RCC_CR_CSS_ON (1 << RCC_CR_CSS_BIT) + + + #define RCC_CR_HSERDY_BIT 17 #define RCC_CR_HSERDY_READY (1 << RCC_CR_HSERDY_BIT) @@ -2036,6 +2041,7 @@ struct rcc { #define RCC_PLLCFGR_PLLSRC_BIT 22 #define RCC_PLLCFGR_PLLSRC_HSE (1 << RCC_PLLCFGR_PLLSRC_BIT) +#define RCC_PLLCFGR_PLLSRC_HSI (0 << RCC_PLLCFGR_PLLSRC_BIT) #define RCC_PLLCFGR_PLLP_BIT 16 #define RCC_PLLCFGR_PLLP_MASK (0b11) @@ -2055,6 +2061,21 @@ struct rcc { #define RCC_CFGR_PPRE_DIV_2 (0b100) +#define RCC_CFGR_MCO1_HSI (0b00) +#define RCC_CFGR_MCO1_HSE (0b10) +#define RCC_CFGR_MCO1_PLL (0b11) + +#define RCC_CFGR_MCO1_BIT 21 +#define RCC_CFGR_MCO1_MASK (0b11) + +#define RCC_CFGR_MCO1PRE_DIV5 (0b111) +#define RCC_CFGR_MCO1PRE_DIV4 (0b110) +#define RCC_CFGR_MCO1PRE_DIV2 (0b100) + +#define RCC_CFGR_MCO1PRE_BIT 24 +#define RCC_CFGR_MCO1PRE_MASK (0b111) + + #define RCC_CFGR_PPRE2_BIT 13 #define RCC_CFGR_PPRE2_MASK (0b111) @@ -2075,6 +2096,7 @@ struct rcc { #define RCC_CFGR_SWS_MASK (0b11) +#define RCC_CFGR_SW_PLL (0b10) #define RCC_CFGR_SW_PLL (0b10) #define RCC_CFGR_SW_BIT 0 @@ -2132,13 +2154,21 @@ struct gpio { #define GPIOA ((struct gpio *) GPIOA_BASE_ADDR) -#define GPIO_MODER_MODER3_BIT 7 +#define GPIO_MODER_AF_MODE (0b10) + +#define GPIO_MODER_MODER8_BIT 16 +#define GPIO_MODER_MODER8_MASK (0b11) + +#define GPIO_MODER_MODER3_BIT 6 #define GPIO_MODER_MODER3_MASK (0b11) -#define GPIO_MODER_MODER3_AF (0b10) #define GPIO_MODER_MODER2_BIT 4 #define GPIO_MODER_MODER2_MASK (0b11) -#define GPIO_MODER_MODER2_AF (0b10) + + +#define GPIO_AFRH_AFRH8_BIT 0 +#define GPIO_AFRH_AFRH8_MASK (0b1111) +#define GPIO_AFRH_AFRH8_MCO_1 (0b0000) #define GPIO_AFRL_AFRL3_BIT 12 @@ -2173,9 +2203,9 @@ typedef enum { void gpio_set_mode(uint16_t pin, GPIO_MODE mode); void gpio_write(uint16_t pin, -# 64 "src/gpio.h" 3 4 +# 72 "src/gpio.h" 3 4 _Bool -# 64 "src/gpio.h" +# 72 "src/gpio.h" val); # 3 "src/usart.c" 2 # 1 "src/usart.h" 1 @@ -2250,8 +2280,8 @@ void usart2_init(void) { ((struct gpio *) (0x40020000U))->MODER &= ~((0b11) << 4); ((struct gpio *) (0x40020000U))->MODER |= ((0b10) << 4); - ((struct gpio *) (0x40020000U))->MODER &= ~((0b11) << 7); - ((struct gpio *) (0x40020000U))->MODER |= ((0b10) << 7); + ((struct gpio *) (0x40020000U))->MODER &= ~((0b11) << 6); + ((struct gpio *) (0x40020000U))->MODER |= ((0b10) << 6); ((struct gpio *) (0x40020000U))->AFRL &= ~((0b1111) << 8); @@ -2260,19 +2290,22 @@ void usart2_init(void) { ((struct gpio *) (0x40020000U))->AFRL |= ((0b0111) << 12); + ((struct gpio *) (0x40020000U))->MODER &= ~((0b11) << 16); + ((struct gpio *) (0x40020000U))->MODER |= ((0b10) << 16); + + + ((struct gpio *) (0x40020000U))->AFRH &= ~((0b1111) << 0); + ((struct gpio *) (0x40020000U))->AFRH |= ((0b0000) << 0); + + ((struct rcc *) (0x40023800U))->APB1ENR |= (1 << 17); ((struct usart *) (0x40004400U))->CR1 = 0; ((struct usart *) (0x40004400U))->CR2 = 0; ((struct usart *) (0x40004400U))->CR3 = 0; -# 54 "src/usart.c" - ((struct usart *) (0x40004400U))->BRR &= ~((0b111111111111) << 4); - ((struct usart *) (0x40004400U))->BRR |= (0x34 << 4); - - - ((struct usart *) (0x40004400U))->BRR &= ~((0b111) << 0); - ((struct usart *) (0x40004400U))->BRR |= (0x0 << 0); +# 71 "src/usart.c" + ((struct usart *) (0x40004400U))->BRR |= 417; ((struct usart *) (0x40004400U))->CR1 |= (1 << 3); @@ -2288,8 +2321,8 @@ void usart2_write_byte(uint8_t c) { ((struct usart *) (0x40004400U))->DR = c; - while ((((struct usart *) (0x40004400U))->SR & (1 << 7)) == 0); + while (!(((struct usart *) (0x40004400U))->SR & (1 << 6))); } void usart2_write(char *buf) { diff --git a/build/usart.o b/build/usart.o index 6e2669569b8803292b1932fe98d61d07ccf26b42..0ef9eadc67288b714224e3a7b29305be848431bc 100644 GIT binary patch delta 8904 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 delta 8014 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 PM&KqCs2Rn;0Am6GGGmQ6 diff --git a/src/gpio.h b/src/gpio.h index 33ef79b..d8edb76 100644 --- a/src/gpio.h +++ b/src/gpio.h @@ -21,22 +21,30 @@ struct gpio { #define GPIOA ((struct gpio *) GPIOA_BASE_ADDR) // MODER register -#define GPIO_MODER_MODER3_BIT 7 // Bits [7:6] +#define GPIO_MODER_AF_MODE (0b10) + +#define GPIO_MODER_MODER8_BIT 16 // Bits [17:16] +#define GPIO_MODER_MODER8_MASK (0b11) + +#define GPIO_MODER_MODER3_BIT 6 // Bits [7:6] #define GPIO_MODER_MODER3_MASK (0b11) -#define GPIO_MODER_MODER3_AF (0b10) #define GPIO_MODER_MODER2_BIT 4 // Bits [5:4] #define GPIO_MODER_MODER2_MASK (0b11) -#define GPIO_MODER_MODER2_AF (0b10) + +// AFRH register +#define GPIO_AFRH_AFRH8_BIT 0 // Bits [3:0] +#define GPIO_AFRH_AFRH8_MASK (0b1111) +#define GPIO_AFRH_AFRH8_MCO_1 (0b0000) // Alternative function 0 (AF0) // AFRL register #define GPIO_AFRL_AFRL3_BIT 12 // Bits [15:12] #define GPIO_AFRL_AFRL3_MASK (0b1111) -#define GPIO_AFRL_AFRL3_USART2_RX (0b0111) // Alternative function 7 +#define GPIO_AFRL_AFRL3_USART2_RX (0b0111) // Alternative function 7 (AF7) #define GPIO_AFRL_AFRL2_BIT 8 // Bits [11:8] #define GPIO_AFRL_AFRL2_MASK (0b1111) -#define GPIO_AFRL_AFRL2_USART2_TX (0b0111) // Alternative function 7 +#define GPIO_AFRL_AFRL2_USART2_TX (0b0111) // Alternative function 7 (AF7) diff --git a/src/main.c b/src/main.c index 41d2b1b..4cb4592 100644 --- a/src/main.c +++ b/src/main.c @@ -18,9 +18,24 @@ static void system_clock_init(void) { PWR->CR &= ~(PWR_CR_VOS_MASK << PWR_CR_VOS_BIT); PWR->CR |= (PWR_SCALE3 << PWR_CR_VOS_BIT); + // Turn off HSI (which is on by default) + RCC->CR &= ~RCC_CR_HSION_ON; + + // Output HSE clock + /* RCC->CFGR &= ~(RCC_CFGR_MCO1_MASK << RCC_CFGR_MCO1_BIT); */ + /* RCC->CFGR |= (RCC_CFGR_MCO1_HSE << RCC_CFGR_MCO1_BIT); */ + /* RCC->CFGR |= (RCC_CFGR_MCO1_PLL << RCC_CFGR_MCO1_BIT); */ + /* RCC->CFGR |= (RCC_CFGR_MCO1_HSI << RCC_CFGR_MCO1_BIT); */ + + /* RCC->CFGR &= ~(RCC_CFGR_MCO1PRE_MASK << RCC_CFGR_MCO1PRE_BIT); */ + /* RCC->CFGR |= (RCC_CFGR_MCO1PRE_DIV4 << RCC_CFGR_MCO1PRE_BIT); */ + // Turn on HSE RCC->CR |= RCC_CR_HSEON_ON; + // Turn on clock security system + RCC->CR |= RCC_CR_CSS_ON; + // Wait indefinitely for HSE to be ready // TODO indicate error/timeout somehow? while (!(RCC->CR & RCC_CR_HSERDY_READY)); @@ -30,6 +45,7 @@ static void system_clock_init(void) { RCC->CR &= ~RCC_CR_PLLON_ON; // Set HSE as PLL source + /* RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; */ RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; // Settings to achieve system clock of 96Mhz @@ -58,20 +74,17 @@ static void system_clock_init(void) { FLASH->ACR |= FLASH_ACR_DCEN_ENABLE; FLASH->ACR |= FLASH_ACR_ICEN_ENABLE; + // TODO breaks with these flash settings on; what were they intended to do? // Set latency to be 3 wait states (TODO: understand why exactly 3) - FLASH->ACR &= ~(FLASH_ACR_LATENCY_MASK << FLASH_ACR_LATENCY_BIT); - RCC->CFGR |= (FLASH_ACR_LATENCY_3_WAIT_STATES << FLASH_ACR_LATENCY_BIT); + /* FLASH->ACR &= ~(FLASH_ACR_LATENCY_MASK << FLASH_ACR_LATENCY_BIT); */ + /* RCC->CFGR |= (FLASH_ACR_LATENCY_3_WAIT_STATES << FLASH_ACR_LATENCY_BIT); */ // Use PLL as system clock - RCC->CFGR &= ~(RCC_CFGR_SW_MASK << RCC_CFGR_SW_BIT); - RCC->CFGR |= (RCC_CFGR_SW_PLL << RCC_CFGR_SW_BIT); + RCC->CFGR |= RCC_CFGR_SW(RCC_CFGR_SW_PLL); // Wait indefinitely for PLL clock to be selected // TODO indicate error/timeout somehow? while (((RCC->CFGR >> RCC_CFGR_SWS_BIT) & RCC_CFGR_SWS_MASK) != RCC_CFGR_SWS_PLL); - - // Turn off HSI (which is on by default) - RCC->CR &= ~RCC_CR_HSION_ON; } int main(void) { @@ -93,7 +106,7 @@ int main(void) { led_on = !led_on; gpio_write(led, led_on); - usart2_write("hello, world\n"); + usart2_write("hello, world!\n"); counter = TIM4->CNT; } diff --git a/src/rcc.h b/src/rcc.h index 045b533..89dfb21 100644 --- a/src/rcc.h +++ b/src/rcc.h @@ -46,6 +46,11 @@ struct rcc { #define RCC_CR_PLLON_BIT 24 #define RCC_CR_PLLON_ON (1 << RCC_CR_PLLON_BIT) +// Clock security system +#define RCC_CR_CSS_BIT 19 +#define RCC_CR_CSS_ON (1 << RCC_CR_CSS_BIT) + + // HSE clock ready flag #define RCC_CR_HSERDY_BIT 17 #define RCC_CR_HSERDY_READY (1 << RCC_CR_HSERDY_BIT) @@ -69,6 +74,7 @@ struct rcc { #define RCC_PLLCFGR_PLLSRC_BIT 22 #define RCC_PLLCFGR_PLLSRC_HSE (1 << RCC_PLLCFGR_PLLSRC_BIT) +#define RCC_PLLCFGR_PLLSRC_HSI (0 << RCC_PLLCFGR_PLLSRC_BIT) #define RCC_PLLCFGR_PLLP_BIT 16 // Bits [17:16] #define RCC_PLLCFGR_PLLP_MASK (0b11) @@ -87,6 +93,21 @@ struct rcc { #define RCC_CFGR_PPRE_DIV_NONE 0 #define RCC_CFGR_PPRE_DIV_2 (0b100) +// Microcontroller clock output 1 +#define RCC_CFGR_MCO1_HSI (0b00) +#define RCC_CFGR_MCO1_HSE (0b10) +#define RCC_CFGR_MCO1_PLL (0b11) + +#define RCC_CFGR_MCO1_BIT 21 // Bits [22:21] +#define RCC_CFGR_MCO1_MASK (0b11) + +#define RCC_CFGR_MCO1PRE_DIV5 (0b111) +#define RCC_CFGR_MCO1PRE_DIV4 (0b110) +#define RCC_CFGR_MCO1PRE_DIV2 (0b100) + +#define RCC_CFGR_MCO1PRE_BIT 24 // Bits [26:24] +#define RCC_CFGR_MCO1PRE_MASK (0b111) + // APB2 #define RCC_CFGR_PPRE2_BIT 13 // Bits [15:13] #define RCC_CFGR_PPRE2_MASK (0b111) @@ -109,6 +130,7 @@ struct rcc { // System clock switch #define RCC_CFGR_SW_PLL (0b10) +#define RCC_CFGR_SW_PLL (0b10) #define RCC_CFGR_SW_BIT 0 // Bits [1:0] #define RCC_CFGR_SW_MASK (0b11) diff --git a/src/timer.c b/src/timer.c index 0bec1bd..971b392 100644 --- a/src/timer.c +++ b/src/timer.c @@ -10,8 +10,8 @@ void tim4_init(void) { TIM4->CR2 = 0x0000; // Set prescaler - // f_clk = 48MHz -> /48000 = 1KHz counting frequency = 1ms - TIM4->PSC = (uint16_t) 48000 - 1; + // f_clk = 96MHz -> 96E6/96E3 = 1E3 = 1KHz counting frequency = 1ms + TIM4->PSC = (uint16_t) 96000 - 1; // Set ARR to maximum value to get 1ms between updates TIM4->ARR = (uint16_t) 0xFFFF; diff --git a/src/usart.c b/src/usart.c index 32bc316..9ea6c7e 100644 --- a/src/usart.c +++ b/src/usart.c @@ -9,9 +9,9 @@ void usart2_init(void) { // Configure PA2 and PA3 (USART2 pins) to use alternative functions // file:///home/alex/sync/org/stm32-sand/stm32f411ce.pdf#page=48 GPIOA->MODER &= ~(GPIO_MODER_MODER2_MASK << GPIO_MODER_MODER2_BIT); - GPIOA->MODER |= (GPIO_MODER_MODER2_AF << GPIO_MODER_MODER2_BIT); + GPIOA->MODER |= (GPIO_MODER_AF_MODE << GPIO_MODER_MODER2_BIT); GPIOA->MODER &= ~(GPIO_MODER_MODER3_MASK << GPIO_MODER_MODER3_BIT); - GPIOA->MODER |= (GPIO_MODER_MODER3_AF << GPIO_MODER_MODER3_BIT); + GPIOA->MODER |= (GPIO_MODER_AF_MODE << GPIO_MODER_MODER3_BIT); // Set pin alternative modes to use USART GPIOA->AFRL &= ~(GPIO_AFRL_AFRL2_MASK << GPIO_AFRL_AFRL2_BIT); @@ -19,6 +19,14 @@ void usart2_init(void) { GPIOA->AFRL &= ~(GPIO_AFRL_AFRL3_MASK << GPIO_AFRL_AFRL3_BIT); GPIOA->AFRL |= (GPIO_AFRL_AFRL3_USART2_RX << GPIO_AFRL_AFRL3_BIT); + // Configure PA8 to output HSE (MCO1) + GPIOA->MODER &= ~(GPIO_MODER_MODER8_MASK << GPIO_MODER_MODER8_BIT); + GPIOA->MODER |= (GPIO_MODER_AF_MODE << GPIO_MODER_MODER8_BIT); + + // Set pin alternative mode to use MCO1 + GPIOA->AFRH &= ~(GPIO_AFRH_AFRH8_MASK << GPIO_AFRH_AFRH8_BIT); + GPIOA->AFRH |= (GPIO_AFRH_AFRH8_MCO_1 << GPIO_AFRH_AFRH8_BIT); + // Enable USART RCC->APB1ENR |= RCC_APB1ENR_USART2EN_ENABLE; @@ -30,33 +38,37 @@ void usart2_init(void) { // Calculate Baud rate: // baud = f_clck / (8 * (2 - OVER8) * USARTDIV) => // (8 * (2 - OVER8) * USARTDIV) = f_clock / baud => + // baud * (8 * (2 - OVER8) * USARTDIV) = f_clock => // USARTDIV = (f_clock / (baud * (8 * (2 - OVER8))) - // Target Baud rate = 115200, f_clock = 48MHz + // Target Baud rate = 115200, f_clock = 48MHz,OVER8 = 0 - // With OVER8 = 1 (oversampling by 8) - // USARTDIV = (48E6 / (115200 * (8 * (2 - 0)))) = 26.0416666 - // mantissa = 26 - // fraction = 0.041666 * 8 = 0.33328 ~= 0 + // USARTDIV = (48E6 / (115200 * (8 * 2))) = 26.0416666 + // mantissa = 26 = 0x1A + // fraction = 0.041666 * 16 = 0.666656 ~= 1 - // rounding fraction up: USARTDIV = 26 // baud = 48E6 / (8 * 2 * 26) = 115384.61538461539 // error of 0.001% (115384.61538461539 / 115200 ) = 1.001602564102564 + // f_clock = USARTDIV * (baud * (8 * 2) + // f_clock = 26 * 115200 * 16 = 47923200 = 48MHz - // baud = f_clck / (8 * (2 - OVER8) * USARTDIV) */ - // baud * ((8 * (2 - OVER8) * USARTDIV)) = f_clck */ - // 393400 * (8 * 2 * 26) = 163654400 + // fclk = 13 * 115200 * 16 + + + // Baud = 9600 + // USARTDIV = (48E6 / (9600 * (8 * 2))) = 312.5 + // mantissa = 312 = 0x138 + // fraction = 0.5 * 16 = 8 = 0x8 + // BRR = 0x1388 /* USART2->CR1 |= USART_CR1_OVER8_8; */ - USART2->BRR &= ~(USART_BRR_MANTISSA_MASK << USART_BRR_MANTISSA_BIT); - USART2->BRR |= (0x34 << USART_BRR_MANTISSA_BIT); - /* USART2->BRR |= (0x69 << USART_BRR_MANTISSA_BIT); */ + /* USART2->BRR &= ~(USART_BRR_MANTISSA_MASK << USART_BRR_MANTISSA_BIT); */ /* USART2->BRR |= (0x1A << USART_BRR_MANTISSA_BIT); */ - USART2->BRR &= ~(USART_BRR_FRACTION_MASK << USART_BRR_FRACTION_BIT); - USART2->BRR |= (0x0 << USART_BRR_FRACTION_BIT); + /* USART2->BRR &= ~(USART_BRR_FRACTION_MASK << USART_BRR_FRACTION_BIT); */ + USART2->BRR |= 417; // Enable transmitter and receiver USART2->CR1 |= USART_CR1_TE_ENABLE; @@ -72,8 +84,8 @@ void usart2_write_byte(uint8_t c) { USART2->DR = c; // Wait indefinitely for transmission to be ready for data - while ((USART2->SR & USART_SR_TXE_TRANSMITTED) == 0); - /* while (!(USART2->SR & USART_SR_TC_COMPLETED)); */ + /* while ((USART2->SR & USART_SR_TXE_TRANSMITTED) == 0); */ + while (!(USART2->SR & USART_SR_TC_COMPLETED)); } void usart2_write(char *buf) { diff --git a/src/usart.h b/src/usart.h index c44a0ad..48a121d 100644 --- a/src/usart.h +++ b/src/usart.h @@ -49,10 +49,10 @@ struct usart { // BRR Register #define USART_BRR_MANTISSA_BIT 4 // Bits [15:4] -#define USART_BRR_MANTISSA_MASK (0b111111111111) // Bits [15:4] +#define USART_BRR_MANTISSA_MASK (0b111111111111) #define USART_BRR_FRACTION_BIT 0 // Bits [3:0] -#define USART_BRR_FRACTION_MASK (0b111) // Bits [3:0] +#define USART_BRR_FRACTION_MASK (0b111) void usart2_init(void); void usart2_start(void);