From 74e56ea11e32e6c2ae7ef95742810579f89ffa13 Mon Sep 17 00:00:00 2001 From: "jazz (gitea)" Date: Wed, 10 Sep 2025 16:28:00 -0500 Subject: [PATCH] make calc nicer ish --- .metadata/.ide.log | 309 ++++++++++ .metadata/.log | 15 + .metadata/.plugins/org.eclipse.cdt.core/.log | 1 + .../Calculator.1757536308987.pdom | Bin 6254592 -> 6254592 bytes .../org.eclipse.cdt.ui/dialog_settings.xml | 8 + .../1a/b0fde4f08c8e00101a42863e8f78717c | 570 +++++++++++++++++ .../58/308e1ad88c8e00101a42863e8f78717c | 8 + .../73/20249bb38c8e00101a42863e8f78717c | 0 .../7e/d0b47df48c8e00101a42863e8f78717c | 22 + .../a7/705927ed8c8e00101a42863e8f78717c | 570 +++++++++++++++++ .../c1/506c5cde8c8e00101a42863e8f78717c | 582 ++++++++++++++++++ .../Calculator/.indexes/bf/c4/history.index | Bin 193 -> 361 bytes .../.root/{6.tree => 7.tree} | Bin 35784 -> 35831 bytes .../.safetable/org.eclipse.core.resources | Bin 582 -> 586 bytes .../org.eclipse.e4.workbench/workbench.xmi | 30 +- .metadata/version.ini | 2 +- Calculator/Core/Src/main.c | 14 +- Calculator/Core/Src/userloop.c | 22 + 18 files changed, 2121 insertions(+), 32 deletions(-) create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1a/b0fde4f08c8e00101a42863e8f78717c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/58/308e1ad88c8e00101a42863e8f78717c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/20249bb38c8e00101a42863e8f78717c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b47df48c8e00101a42863e8f78717c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a7/705927ed8c8e00101a42863e8f78717c create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/506c5cde8c8e00101a42863e8f78717c rename .metadata/.plugins/org.eclipse.core.resources/.root/{6.tree => 7.tree} (95%) create mode 100644 Calculator/Core/Src/userloop.c diff --git a/.metadata/.ide.log b/.metadata/.ide.log index bcbb656..1b819fc 100644 --- a/.metadata/.ide.log +++ b/.metadata/.ide.log @@ -1975,3 +1975,312 @@ 2025-09-10 16:17:36,826 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 2025-09-10 16:17:36,826 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 2025-09-10 16:17:36,914 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] +2025-09-10 16:23:26,979 [INFO] Activator:176 - + + +2025-09-10 16:23:26,980 [INFO] Activator:177 - !SESSION log4j initialized +2025-09-10 16:23:35,826 [INFO] LogOutputStream:77 - [STDOUT_REDIRECT] +2025-09-10 16:23:51,541 [INFO] ApplicationProperties:184 - Using Application install path: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659 +2025-09-10 16:23:51,554 [INFO] DbMcusXml:78 - Set database path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//mcu/ +2025-09-10 16:23:51,554 [INFO] ApiDb:274 - Set plugin database path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//plugins/boardmanager/ +2025-09-10 16:23:51,554 [WARN] ApiDb:259 - Overriding images path with different value: => /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//plugins/mcufinder/images/ +2025-09-10 16:23:51,557 [INFO] ApiDb:250 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/ +2025-09-10 16:23:51,557 [INFO] DbMcusAds:125 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/ +2025-09-10 16:23:56,608 [INFO] CrossReferenceDbSqlite:203 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/cs/ +2025-09-10 16:23:56,711 [INFO] RulesReader:64 - Compatibility file has been processed (317 Rules) +2025-09-10 16:23:56,753 [INFO] DbMcusXml:78 - Set database path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//mcu/ +2025-09-10 16:23:56,754 [INFO] ApiDb:274 - Set plugin database path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//plugins/boardmanager/ +2025-09-10 16:23:56,754 [INFO] ApiDb:261 - Set plugin images path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//plugins/mcufinder/images/ +2025-09-10 16:23:56,754 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,754 [INFO] ApiDb:250 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/ +2025-09-10 16:23:56,754 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,754 [INFO] DbMcusAds:125 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/ +2025-09-10 16:23:56,754 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,754 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,754 [INFO] CrossReferenceDbSqlite:203 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/cs/ +2025-09-10 16:23:56,797 [INFO] MainPanel:274 - HeapMemory: 268435456 +2025-09-10 16:23:56,912 [INFO] DbMcusXml:78 - Set database path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//mcu/ +2025-09-10 16:23:56,912 [INFO] ApiDb:274 - Set plugin database path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//plugins/boardmanager/ +2025-09-10 16:23:56,912 [INFO] ApiDb:261 - Set plugin images path to: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659//db//plugins/mcufinder/images/ +2025-09-10 16:23:56,913 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,913 [INFO] ApiDb:250 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/ +2025-09-10 16:23:56,913 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,913 [INFO] DbMcusAds:125 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/ +2025-09-10 16:23:56,913 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,913 [WARN] DbFile:41 - Overriding database path with different value: /home/ja/.stmcufinder/plugins/mcufinder/ => /home/ja/.stmcufinder/plugins/mcufinder +2025-09-10 16:23:56,913 [INFO] CrossReferenceDbSqlite:203 - Set database path to: /home/ja/.stmcufinder/plugins/mcufinder//mcu/cs/ +2025-09-10 16:23:56,924 [INFO] ApplicationProperties:184 - Using Application install path: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659 +2025-09-10 16:23:56,925 [INFO] PluginManage:196 - Search for loadable plugins [exclusion list=, ] +2025-09-10 16:23:56,926 [INFO] PluginManage:310 - Check plugin analytics +2025-09-10 16:24:02,118 [INFO] AnalyticsPlugin:253 - Accepted Software Licenses: STM32CubeMX.6.15.0 +2025-09-10 16:24:02,118 [INFO] AnalyticsPlugin:255 - Accepted CMSIS Pack Licenses: +2025-09-10 16:24:02,118 [INFO] AnalyticsPlugin:257 - Accepted Firmware Licenses: FW.F4.1.28.0 +2025-09-10 16:24:02,121 [INFO] PluginManage:359 - Loaded plugin analytics (category:tool,tabindex:-1) +2025-09-10 16:24:02,121 [INFO] PluginManage:310 - Check plugin cadmodel +2025-09-10 16:24:02,124 [INFO] CADModel:105 - Init CAD model plugin +2025-09-10 16:24:02,124 [INFO] PluginManage:359 - Loaded plugin cadmodel (category:power,tabindex:5) +2025-09-10 16:24:02,124 [INFO] PluginManage:310 - Check plugin clock +2025-09-10 16:24:02,130 [INFO] PluginManage:359 - Loaded plugin clock (category:base,tabindex:2) +2025-09-10 16:24:02,131 [INFO] PluginManage:310 - Check plugin ddr +2025-09-10 16:24:02,132 [INFO] PluginManage:359 - Loaded plugin ddr (category:tool,tabindex:6) +2025-09-10 16:24:02,132 [INFO] PluginManage:310 - Check plugin filemanager +2025-09-10 16:24:02,248 [INFO] PluginManage:359 - Loaded plugin filemanager (category:base,tabindex:10) +2025-09-10 16:24:02,248 [INFO] PluginManage:310 - Check plugin ipmanager +2025-09-10 16:24:02,252 [INFO] PluginManage:359 - Loaded plugin ipmanager (category:base,tabindex:5) +2025-09-10 16:24:02,252 [INFO] PluginManage:310 - Check plugin lpbam +2025-09-10 16:24:02,260 [INFO] PluginManage:359 - Loaded plugin lpbam (category:base,tabindex:0) +2025-09-10 16:24:02,260 [INFO] PluginManage:310 - Check plugin memorymap +2025-09-10 16:24:02,268 [INFO] PluginManage:359 - Loaded plugin memorymap (category:base,tabindex:4) +2025-09-10 16:24:02,268 [INFO] PluginManage:310 - Check plugin pinoutandconfiguration +2025-09-10 16:24:02,274 [INFO] PluginManage:359 - Loaded plugin pinoutandconfiguration (category:base,tabindex:1) +2025-09-10 16:24:02,274 [INFO] PluginManage:310 - Check plugin pinoutconfig +2025-09-10 16:24:02,343 [WARN] SupportedApi:132 - Cannot load RTOS API schema: s4s-elt-must-match.1: The content of 'definitions' must match (annotation?, (simpleType | complexType)?, (unique | key | keyref)*)). A problem was found starting at: attribute. +2025-09-10 16:24:02,441 [INFO] PluginManage:359 - Loaded plugin pinoutconfig (category:base,tabindex:0) +2025-09-10 16:24:02,442 [INFO] PluginManage:310 - Check plugin power +2025-09-10 16:24:02,448 [INFO] PluginManage:359 - Loaded plugin power (category:power,tabindex:4) +2025-09-10 16:24:02,448 [INFO] PluginManage:310 - Check plugin projectmanager +2025-09-10 16:24:02,459 [INFO] PluginManage:359 - Loaded plugin projectmanager (category:projectmanager,tabindex:4) +2025-09-10 16:24:02,460 [INFO] PluginManage:310 - Check plugin rif +2025-09-10 16:24:02,466 [INFO] PluginManage:359 - Loaded plugin rif (category:base,tabindex:3) +2025-09-10 16:24:02,466 [INFO] PluginManage:310 - Check plugin thirdparty +2025-09-10 16:24:02,562 [INFO] PluginManage:359 - Loaded plugin thirdparty (category:base,tabindex:-1) +2025-09-10 16:24:02,562 [WARN] IntegrityCheckThread:84 - waiting for thirdparty lock release [integrity check] +2025-09-10 16:24:02,562 [INFO] IntegrityCheckThread:86 - entering critical section [integrity check] +2025-09-10 16:24:02,562 [INFO] PluginManage:310 - Check plugin tools +2025-09-10 16:24:02,562 [INFO] ThirdPartyUpdaterWithRetryManager:70 - Updater plugin not ready yet. [1/15] +2025-09-10 16:24:02,564 [INFO] PluginManage:359 - Loaded plugin tools (category:base,tabindex:7) +2025-09-10 16:24:02,564 [INFO] PluginManage:310 - Check plugin tutovideos +2025-09-10 16:24:02,721 [INFO] PluginManage:359 - Loaded plugin tutovideos (category:base,tabindex:-1) +2025-09-10 16:24:02,721 [INFO] PluginManage:310 - Check plugin updater +2025-09-10 16:24:02,741 [INFO] PluginManage:359 - Loaded plugin updater (category:base,tabindex:12) +2025-09-10 16:24:02,742 [INFO] PluginManage:310 - Check plugin userauth +2025-09-10 16:24:02,744 [INFO] UserAuth:118 - Init User Auth plugin +2025-09-10 16:24:02,745 [INFO] PluginManage:359 - Loaded plugin userauth (category:base,tabindex:14) +2025-09-10 16:24:02,745 [INFO] PluginManage:283 - PluginManage : Loaded plugins [18] +2025-09-10 16:24:02,868 [INFO] PinOutPanel:1589 - setPackage(No Configuration,No Configuration) +2025-09-10 16:24:02,921 [INFO] CADModel:165 - CPN selected for project level +2025-09-10 16:24:02,921 [INFO] CADModel:114 - Register for checkConnection events +2025-09-10 16:24:02,929 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,929 [INFO] PluginManager:220 - loadIPPluginJar : add gtzc +2025-09-10 16:24:02,934 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,934 [INFO] PluginManager:220 - loadIPPluginJar : add usbx +2025-09-10 16:24:02,935 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,935 [INFO] PluginManager:220 - loadIPPluginJar : add fatfs +2025-09-10 16:24:02,937 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,937 [INFO] PluginManager:220 - loadIPPluginJar : add i2c +2025-09-10 16:24:02,939 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,939 [INFO] PluginManager:220 - loadIPPluginJar : add tim +2025-09-10 16:24:02,940 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,940 [INFO] PluginManager:220 - loadIPPluginJar : add quadspi +2025-09-10 16:24:02,942 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,942 [INFO] PluginManager:220 - loadIPPluginJar : add ipddr +2025-09-10 16:24:02,944 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,945 [INFO] PluginManager:220 - loadIPPluginJar : add i2s +2025-09-10 16:24:02,947 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,947 [INFO] PluginManager:220 - loadIPPluginJar : add openamp +2025-09-10 16:24:02,949 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,949 [INFO] PluginManager:220 - loadIPPluginJar : add i3c +2025-09-10 16:24:02,950 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,950 [INFO] PluginManager:220 - loadIPPluginJar : add ucpd +2025-09-10 16:24:02,952 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,952 [INFO] PluginManager:220 - loadIPPluginJar : add cryp +2025-09-10 16:24:02,954 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,954 [INFO] PluginManager:220 - loadIPPluginJar : add comp +2025-09-10 16:24:02,955 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,955 [INFO] PluginManager:220 - loadIPPluginJar : add spi +2025-09-10 16:24:02,958 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,958 [INFO] PluginManager:220 - loadIPPluginJar : add touchsensing +2025-09-10 16:24:02,960 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,960 [INFO] PluginManager:220 - loadIPPluginJar : add can +2025-09-10 16:24:02,962 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,962 [INFO] PluginManager:220 - loadIPPluginJar : add aes +2025-09-10 16:24:02,968 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,969 [INFO] PluginManager:220 - loadIPPluginJar : add adc +2025-09-10 16:24:02,971 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,972 [INFO] PluginManager:220 - loadIPPluginJar : add nvic +2025-09-10 16:24:02,976 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,976 [INFO] PluginManager:220 - loadIPPluginJar : add freertos +2025-09-10 16:24:02,981 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,981 [INFO] PluginManager:220 - loadIPPluginJar : add dma +2025-09-10 16:24:02,984 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,984 [INFO] PluginManager:220 - loadIPPluginJar : add resmgrutility +2025-09-10 16:24:02,986 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,986 [INFO] PluginManager:220 - loadIPPluginJar : add pdm2pcm +2025-09-10 16:24:02,988 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,988 [INFO] PluginManager:220 - loadIPPluginJar : add hash +2025-09-10 16:24:02,990 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,990 [INFO] PluginManager:220 - loadIPPluginJar : add dfsdm +2025-09-10 16:24:02,991 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,992 [INFO] PluginManager:220 - loadIPPluginJar : add radio +2025-09-10 16:24:02,996 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:02,998 [INFO] PluginManager:220 - loadIPPluginJar : add plateformsettings +2025-09-10 16:24:03,002 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,002 [INFO] PluginManager:220 - loadIPPluginJar : add gic +2025-09-10 16:24:03,003 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,003 [INFO] PluginManager:220 - loadIPPluginJar : add ltdc +2025-09-10 16:24:03,005 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,005 [INFO] PluginManager:220 - loadIPPluginJar : add tracer_emb +2025-09-10 16:24:03,007 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,007 [INFO] PluginManager:220 - loadIPPluginJar : add lorawan +2025-09-10 16:24:03,008 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,008 [INFO] PluginManager:220 - loadIPPluginJar : add tsc +2025-09-10 16:24:03,010 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,010 [INFO] PluginManager:220 - loadIPPluginJar : add ts +2025-09-10 16:24:03,011 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,011 [INFO] PluginManager:220 - loadIPPluginJar : add gfxmmu +2025-09-10 16:24:03,013 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,013 [INFO] PluginManager:220 - loadIPPluginJar : add dma3 +2025-09-10 16:24:03,015 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,015 [INFO] PluginManager:220 - loadIPPluginJar : add ddr_ctrl_phy +2025-09-10 16:24:03,016 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,017 [INFO] PluginManager:220 - loadIPPluginJar : add genericplugin +2025-09-10 16:24:03,019 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,019 [INFO] PluginManager:220 - loadIPPluginJar : add opamp +2025-09-10 16:24:03,024 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,024 [INFO] PluginManager:220 - loadIPPluginJar : add stm32_wpan +2025-09-10 16:24:03,026 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,026 [INFO] PluginManager:220 - loadIPPluginJar : add usart +2025-09-10 16:24:03,029 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,029 [INFO] PluginManager:220 - loadIPPluginJar : add sai +2025-09-10 16:24:03,035 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,035 [INFO] PluginManager:220 - loadIPPluginJar : add linkedlist +2025-09-10 16:24:03,038 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,038 [INFO] PluginManager:220 - loadIPPluginJar : add extmemmanager +2025-09-10 16:24:03,041 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,042 [INFO] PluginManager:220 - loadIPPluginJar : add fmc +2025-09-10 16:24:03,045 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,045 [INFO] PluginManager:220 - loadIPPluginJar : add gpio +2025-09-10 16:24:03,050 [INFO] IPUIPlugin:80 - create IPUIPlugin +2025-09-10 16:24:03,050 [INFO] PluginManager:220 - loadIPPluginJar : add mdma +2025-09-10 16:24:03,147 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,168 [INFO] RulesReader:64 - Compatibility file has been processed (317 Rules) +2025-09-10 16:24:03,178 [INFO] RulesReader:64 - Compatibility file has been processed (317 Rules) +2025-09-10 16:24:03,184 [INFO] CADModel:165 - CPN selected for project level +2025-09-10 16:24:03,185 [INFO] CADModel:114 - Register for checkConnection events +2025-09-10 16:24:03,185 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,185 [ERROR] CADModel:125 - Updater not yet initialized, retry later +2025-09-10 16:24:03,312 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,314 [INFO] CADModel:165 - CPN selected for project level +2025-09-10 16:24:03,314 [INFO] CADModel:114 - Register for checkConnection events +2025-09-10 16:24:03,314 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,314 [ERROR] CADModel:125 - Updater not yet initialized, retry later +2025-09-10 16:24:03,318 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,399 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,402 [INFO] DbMcusAds:53 - JSON generation date=Tue Jul 08 03:14:23 CDT 2025 (1751962463582) +2025-09-10 16:24:03,403 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,430 [WARN] DetailPanel:346 - Failed to get advertising image, set to default +2025-09-10 16:24:03,489 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,490 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,490 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,490 [WARN] DetailPanel:346 - Failed to get advertising image, set to default +2025-09-10 16:24:03,491 [FATAL] Updater:351 - Updater called before beeing initialized +2025-09-10 16:24:03,514 [ERROR] Updater:1198 - MainUpdater not yet initialized. External WinMGr cannot be set. +2025-09-10 16:24:03,516 [INFO] Updater:1134 - Updater Version found : 6.15.0 +2025-09-10 16:24:03,529 [INFO] ApplicationProperties:184 - Using Application install path: /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659 +2025-09-10 16:24:03,810 [INFO] MainUpdater:2872 - connection check result : 10 +2025-09-10 16:24:03,811 [INFO] MainUpdater:289 - Updater Check For Update Now. +2025-09-10 16:24:03,811 [INFO] MicroXplorer:498 - Change Database Version : DB.6.0.150 +2025-09-10 16:24:03,816 [INFO] McuFinderGlobals:63 - Set McuFinder mode to 2 (CubeIDE integrated) +2025-09-10 16:24:03,817 [INFO] UserAuth:487 - Internet connection configuration mode: 1 +2025-09-10 16:24:03,834 [INFO] JxBrowserEngine:152 - Initiate JxBrowser Engine with user profile folder +2025-09-10 16:24:04,001 [INFO] CheckServerUpdateThread:120 - End of CheckServer Thread +2025-09-10 16:24:04,328 [INFO] WebApp:169 - Instantiating new browser for Auth +2025-09-10 16:24:04,781 [INFO] WebApp:463 - Apply proxy settings +2025-09-10 16:24:04,782 [INFO] WebApp:548 - Chromium requires no authentication +2025-09-10 16:24:04,788 [INFO] WebApp:491 - Direct internet connection detected +2025-09-10 16:24:04,803 [INFO] WebApp:900 - Register for checkConnection events +2025-09-10 16:24:04,803 [INFO] WebApp:463 - Apply proxy settings +2025-09-10 16:24:04,804 [INFO] WebApp:548 - Chromium requires no authentication +2025-09-10 16:24:04,804 [INFO] WebApp:491 - Direct internet connection detected +2025-09-10 16:24:04,912 [INFO] WebApp:225 - Starting web application +2025-09-10 16:24:04,913 [INFO] WebApp:593 - Web application path used /home/ja/st/stm32cubeide_1.19.0/plugins/com.st.stm32cube.common.mx_6.15.0.202507011659/db/plugins/mcufinder/reactClient1/index.html +2025-09-10 16:24:04,992 [INFO] UserAuth:487 - Internet connection configuration mode: 1 +2025-09-10 16:24:05,678 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-SNS-MOTENVWB1.1.4.0 +2025-09-10 16:24:05,683 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-ATR-ASTRA1.2.0.2 +2025-09-10 16:24:05,688 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-SMBUS.2.1.0 +2025-09-10 16:24:05,691 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-ST60.1.0.0 +2025-09-10 16:24:05,715 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-F7.1.1.0 +2025-09-10 16:24:05,725 [WARN] PackLoader:240 - Cannot read IP mode file for WES.I-CUBE-Cesium.1.4.0 +2025-09-10 16:24:05,764 [WARN] PackLoader:240 - Cannot read IP mode file for Infineon.AIROC-Wi-Fi-Bluetooth-STM32.1.7.1 +2025-09-10 16:24:05,807 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-H7.3.4.0 +2025-09-10 16:24:05,823 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-DISPLAY.3.0.0 +2025-09-10 16:24:05,840 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-NFC10.1.0.0 +2025-09-10 16:24:05,847 [WARN] PackLoader:240 - Cannot read IP mode file for emotas.I-CUBE-CANOPEN.1.3.0 +2025-09-10 16:24:05,856 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-SNS-STBOX1.2.1.0 +2025-09-10 16:24:05,877 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-SNS-SMARTAG2.1.2.0 +2025-09-10 16:24:05,880 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-SNS-FLIGHT1.5.1.0 +2025-09-10 16:24:05,887 [INFO] LogOutputStream:77 - [STDOUT_REDIRECT] 1 : Invalid condition id : UX_CORESTACK_Condition cause : null +2025-09-10 16:24:05,888 [INFO] LogOutputStream:77 - [STDOUT_REDIRECT] 1 : Invalid condition id : UX_CORESTACK_Condition cause : null +2025-09-10 16:24:05,888 [INFO] LogOutputStream:77 - [STDOUT_REDIRECT] 1 : Invalid condition id : UX_CORESTACK_Condition cause : null +2025-09-10 16:24:05,888 [INFO] LogOutputStream:77 - [STDOUT_REDIRECT] 1 : Invalid condition id : UX_CORESTACK_Condition cause : null +2025-09-10 16:24:05,888 [INFO] LogOutputStream:77 - [STDOUT_REDIRECT] 1 : Invalid condition id : UX_CORESTACK_Condition cause : null +2025-09-10 16:24:05,892 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-WL.2.0.0 +2025-09-10 16:24:05,897 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-SNS-MOTENV1.5.0.0 +2025-09-10 16:24:05,902 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-BLE2.3.3.0 +2025-09-10 16:24:05,907 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-NFC9.1.0.0 +2025-09-10 16:24:05,913 [WARN] PackLoader:240 - Cannot read IP mode file for wolfSSL.I-CUBE-wolfSSL.5.8.2 +2025-09-10 16:24:05,920 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-BLE1.7.1.0 +2025-09-10 16:24:05,923 [WARN] PackLoader:240 - Cannot read IP mode file for wolfSSL.I-CUBE-wolfMQTT.1.19.2 +2025-09-10 16:24:05,930 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-EEPRMA1.5.2.0 +2025-09-10 16:24:05,955 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-G0.1.1.0 +2025-09-10 16:24:05,965 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-SAFEA1.1.2.2 +2025-09-10 16:24:05,972 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-NFC4.3.0.0 +2025-09-10 16:24:05,984 [WARN] PackLoader:240 - Cannot read IP mode file for EmbeddedOffice.I-CUBE-FS-RTOS.1.0.1 +2025-09-10 16:24:05,990 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-WB05N.2.0.0 +2025-09-10 16:24:05,995 [WARN] PackLoader:240 - Cannot read IP mode file for wolfSSL.I-CUBE-wolfTPM.3.8.0 +2025-09-10 16:24:06,001 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-TCPP.4.2.0 +2025-09-10 16:24:06,008 [WARN] PackLoader:240 - Cannot read IP mode file for RealThread.X-CUBE-RT-Thread_Nano.4.1.1 +2025-09-10 16:24:06,012 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-ATR-SIGFOX1.3.2.0 +2025-09-10 16:24:06,017 [WARN] PackLoader:240 - Cannot read IP mode file for ITTIA_DB.I-CUBE-ITTIADB.8.9.0 +2025-09-10 16:24:06,024 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-ST67W61.1.0.0 +2025-09-10 16:24:06,028 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AI.10.2.0 +2025-09-10 16:24:06,063 [WARN] PackLoader:240 - Cannot read IP mode file for SEGGER.I-CUBE-embOS.1.3.1 +2025-09-10 16:24:06,106 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-ALGOBUILD.1.4.0 +2025-09-10 16:24:06,139 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-MEMS1.11.3.0 +2025-09-10 16:24:06,249 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-PM33A1.1.0.0 +2025-09-10 16:24:06,265 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-F4.1.1.0 +2025-09-10 16:24:06,270 [WARN] PackLoader:240 - Cannot read IP mode file for Avnet-IotConnect.X-CUBE-IoTC-DA16k-PMOD.1.0.0 +2025-09-10 16:24:06,273 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-ISPU.2.1.0 +2025-09-10 16:24:06,279 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-NFC12.1.0.0 +2025-09-10 16:24:06,296 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-L5.2.0.0 +2025-09-10 16:24:06,305 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-NFC6.3.1.0 +2025-09-10 16:24:06,312 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-FREERTOS.1.3.1 +2025-09-10 16:24:06,316 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.FP-SNS-STAIOTCFT.1.0.0 +2025-09-10 16:24:06,320 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-DPower.1.3.0 +2025-09-10 16:24:06,336 [WARN] ConditionMgr:438 - getConditionDescription Invalid condition id : LAN8742 Phy interface Condition cause : null +2025-09-10 16:24:06,337 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-L4.2.0.0 +2025-09-10 16:24:06,338 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : LAN8742 Phy interface Condition cause : null +2025-09-10 16:24:06,339 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : LAN8742 Phy interface Condition cause : null +2025-09-10 16:24:06,339 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : LAN8742 Phy interface Condition cause : null +2025-09-10 16:24:06,346 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-SFXS2LP1.4.0.0 +2025-09-10 16:24:06,356 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-BLEMGR.4.1.0 +2025-09-10 16:24:06,370 [WARN] ConditionMgr:438 - getConditionDescription Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,370 [WARN] ConditionMgr:438 - getConditionDescription Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,372 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-WB.2.0.0 +2025-09-10 16:24:06,372 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,372 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,373 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,373 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,373 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : UX DEVICE CLASS RTOS Condition cause : null +2025-09-10 16:24:06,376 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-GNSS1.7.0.1 +2025-09-10 16:24:06,380 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-TOUCHGFX.4.25.0 +2025-09-10 16:24:06,382 [WARN] ConditionMgr:438 - getConditionDescription Invalid condition id : Cortex-A Device cause : null +2025-09-10 16:24:06,390 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : Cortex-A Device cause : null +2025-09-10 16:24:06,390 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : Cortex-A Device cause : null +2025-09-10 16:24:06,390 [WARN] ConditionMgr:1044 - genDependencies : Invalid condition id : Cortex-A Device cause : null +2025-09-10 16:24:06,396 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-SUBG2.5.0.0 +2025-09-10 16:24:06,411 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-H7RS.1.1.0 +2025-09-10 16:24:06,415 [WARN] PackLoader:240 - Cannot read IP mode file for Cesanta.I-CUBE-Mongoose.7.13.0 +2025-09-10 16:24:06,423 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-AZRTOS-G4.2.0.0 +2025-09-10 16:24:06,426 [WARN] PackLoader:240 - Cannot read IP mode file for wolfSSL.I-CUBE-wolfSSH.1.4.20 +2025-09-10 16:24:06,429 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-NFC7.2.0.0 +2025-09-10 16:24:06,445 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-IPS.3.1.0 +2025-09-10 16:24:06,453 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-ALS.1.0.2 +2025-09-10 16:24:06,457 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-STSE01.1.0.0 +2025-09-10 16:24:06,462 [WARN] PackLoader:240 - Cannot read IP mode file for portGmbH.I-Cube-SoM-uGOAL.1.1.0 +2025-09-10 16:24:06,469 [WARN] PackLoader:240 - Cannot read IP mode file for STMicroelectronics.X-CUBE-TOF1.3.4.3 +2025-09-10 16:24:06,480 [INFO] ThirdParty:978 - Integrity check success = true +2025-09-10 16:24:06,480 [INFO] IntegrityCheckThread:100 - exiting critical section [integrity check] +2025-09-10 16:24:06,480 [INFO] IntegrityCheckThread:103 - End integrity checks thread +2025-09-10 16:24:10,129 [INFO] WebApp:191 - Connection restablished +2025-09-10 16:27:38,180 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] diff --git a/.metadata/.log b/.metadata/.log index 71b14ca..c0afb33 100644 --- a/.metadata/.log +++ b/.metadata/.log @@ -215,3 +215,18 @@ java.lang.NullPointerException: Cannot invoke "org.eclipse.ui.IWorkbenchWindow.g at org.eclipse.equinox.launcher.Main.basicRun(Main.java:605) at org.eclipse.equinox.launcher.Main.run(Main.java:1481) at org.eclipse.equinox.launcher.Main.main(Main.java:1454) +!SESSION 2025-09-10 16:23:10.153 ----------------------------------------------- +eclipse.buildId=Version 1.19.0 +java.version=21.0.3 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US +Command-line arguments: -os linux -ws gtk -arch x86_64 + +!ENTRY com.st.stm32cube.ide.mcu.informationcenter 4 4 2025-09-10 16:23:21.768 +!MESSAGE CubeMX plugin appears to be active, Log4j initialization might be too late. + +!ENTRY com.st.stm32cube.ide.mcu.informationcenter 1 1 2025-09-10 16:23:21.768 +!MESSAGE Log4j2 initialized with config file /home/ja/st/Home/.metadata/.log4j2.xml + +!ENTRY com.st.stm32cube.ide.mcu.ide 1 1 2025-09-10 16:23:51.426 +!MESSAGE Started RMI Server, listening on port 41337 diff --git a/.metadata/.plugins/org.eclipse.cdt.core/.log b/.metadata/.plugins/org.eclipse.cdt.core/.log index dc4a09d..eea301b 100644 --- a/.metadata/.plugins/org.eclipse.cdt.core/.log +++ b/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -4,3 +4,4 @@ *** SESSION Sep 10, 2025 14:14:54.289 ------------------------------------------ *** SESSION Sep 10, 2025 15:12:55.190 ------------------------------------------ *** SESSION Sep 10, 2025 15:27:36.494 ------------------------------------------ +*** SESSION Sep 10, 2025 16:23:20.590 ------------------------------------------ diff --git a/.metadata/.plugins/org.eclipse.cdt.core/Calculator.1757536308987.pdom b/.metadata/.plugins/org.eclipse.cdt.core/Calculator.1757536308987.pdom index 702d9edb97e117028cc089ed12a5d996937daa88..9fa06fe8e943560918b1929c3a41a89d212fff1b 100644 GIT binary patch delta 43518 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 delta 43900 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 vth*Pd+|USv_l4`vBEG>M{lHtrdA0u^*bj%P diff --git a/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml index 8e47957..b85bf33 100644 --- a/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml +++ b/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -1,7 +1,15 @@

+
+
+ + + + + +
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1a/b0fde4f08c8e00101a42863e8f78717c b/.metadata/.plugins/org.eclipse.core.resources/.history/1a/b0fde4f08c8e00101a42863e8f78717c new file mode 100644 index 0000000..183e22a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1a/b0fde4f08c8e00101a42863e8f78717c @@ -0,0 +1,570 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +CRC_HandleTypeDef hcrc; + +DMA2D_HandleTypeDef hdma2d; + +I2C_HandleTypeDef hi2c3; + +TIM_HandleTypeDef htim1; + +UART_HandleTypeDef huart1; + +SDRAM_HandleTypeDef hsdram1; + +//osThreadId defaultTaskHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_CRC_Init(void); +static void MX_DMA2D_Init(void); +static void MX_FMC_Init(void); +static void MX_I2C3_Init(void); +static void MX_TIM1_Init(void); +static void MX_USART1_UART_Init(void); +void StartDefaultTask(void const * argument); + +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_DMA2D_Init(); + MX_FMC_Init(); + MX_I2C3_Init(); + MX_TIM1_Init(); + MX_USART1_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* USER CODE BEGIN RTOS_MUTEX */ + /* add mutexes, ... */ + /* USER CODE END RTOS_MUTEX */ + + /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* add semaphores, ... */ + /* USER CODE END RTOS_SEMAPHORES */ + + /* USER CODE BEGIN RTOS_TIMERS */ + /* start timers, add new ones, ... */ + /* USER CODE END RTOS_TIMERS */ + + /* USER CODE BEGIN RTOS_QUEUES */ + /* add queues, ... */ + /* USER CODE END RTOS_QUEUES */ + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + //osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 4096); + //defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* Start scheduler */ + //osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + // userloop + while (1) + { + userloop(200); + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 72; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 3; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief CRC Initialization Function + * @param None + * @retval None + */ +static void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + if (HAL_CRC_Init(&hcrc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ + +} + +/** + * @brief DMA2D Initialization Function + * @param None + * @retval None + */ +static void MX_DMA2D_Init(void) +{ + + /* USER CODE BEGIN DMA2D_Init 0 */ + + /* USER CODE END DMA2D_Init 0 */ + + /* USER CODE BEGIN DMA2D_Init 1 */ + + /* USER CODE END DMA2D_Init 1 */ + hdma2d.Instance = DMA2D; + hdma2d.Init.Mode = DMA2D_M2M; + hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888; + hdma2d.Init.OutputOffset = 0; + hdma2d.LayerCfg[1].InputOffset = 0; + hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888; + hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; + hdma2d.LayerCfg[1].InputAlpha = 0; + if (HAL_DMA2D_Init(&hdma2d) != HAL_OK) + { + Error_Handler(); + } + if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN DMA2D_Init 2 */ + + /* USER CODE END DMA2D_Init 2 */ + +} + +/** + * @brief I2C3 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C3_Init(void) +{ + + /* USER CODE BEGIN I2C3_Init 0 */ + + /* USER CODE END I2C3_Init 0 */ + + /* USER CODE BEGIN I2C3_Init 1 */ + + /* USER CODE END I2C3_Init 1 */ + hi2c3.Instance = I2C3; + hi2c3.Init.ClockSpeed = 100000; + hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c3.Init.OwnAddress1 = 0; + hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c3.Init.OwnAddress2 = 0; + hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c3) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C3_Init 2 */ + + /* USER CODE END I2C3_Init 2 */ + +} + +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 65535; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/* FMC initialization function */ +static void MX_FMC_Init(void) +{ + + /* USER CODE BEGIN FMC_Init 0 */ + + /* USER CODE END FMC_Init 0 */ + + FMC_SDRAM_TimingTypeDef SdramTiming = {0}; + + /* USER CODE BEGIN FMC_Init 1 */ + + /* USER CODE END FMC_Init 1 */ + + /** Perform the SDRAM1 memory initialization sequence + */ + hsdram1.Instance = FMC_SDRAM_DEVICE; + /* hsdram1.Init */ + hsdram1.Init.SDBank = FMC_SDRAM_BANK2; + hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; + hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_11; + hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; + hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; + hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; + hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; + hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; + hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; + hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; + /* SdramTiming */ + SdramTiming.LoadToActiveDelay = 2; + SdramTiming.ExitSelfRefreshDelay = 7; + SdramTiming.SelfRefreshTime = 4; + SdramTiming.RowCycleDelay = 7; + SdramTiming.WriteRecoveryTime = 3; + SdramTiming.RPDelay = 2; + SdramTiming.RCDDelay = 2; + + if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) + { + Error_Handler( ); + } + + /* USER CODE BEGIN FMC_Init 2 */ + + /* USER CODE END FMC_Init 2 */ +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* USER CODE BEGIN MX_GPIO_Init_1 */ + + /* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOG, LD3_Pin|LD4_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : B1_Pin TP_INT1_Pin */ + GPIO_InitStruct.Pin = B1_Pin|TP_INT1_Pin;- + GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : PA1 */ // External LED + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PE7 PE9 */ // Buttons + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /*Configure GPIO pins : LD3_Pin LD4_Pin */ + GPIO_InitStruct.Pin = LD3_Pin|LD4_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + + /* USER CODE END MX_GPIO_Init_2 */ +} + + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM6 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ + + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM6) + { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ + + /* USER CODE END Callback 1 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/58/308e1ad88c8e00101a42863e8f78717c b/.metadata/.plugins/org.eclipse.core.resources/.history/58/308e1ad88c8e00101a42863e8f78717c new file mode 100644 index 0000000..d55eeee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/58/308e1ad88c8e00101a42863e8f78717c @@ -0,0 +1,8 @@ +/* + * userloop.c + * + * Created on: Sep 10, 2025 + * Author: ja + */ + + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/20249bb38c8e00101a42863e8f78717c b/.metadata/.plugins/org.eclipse.core.resources/.history/73/20249bb38c8e00101a42863e8f78717c new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b47df48c8e00101a42863e8f78717c b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b47df48c8e00101a42863e8f78717c new file mode 100644 index 0000000..59a799a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/d0b47df48c8e00101a42863e8f78717c @@ -0,0 +1,22 @@ +/* + * userloop.c + * + * Created on: Sep 10, 2025 + * Author: ja + */ +void userloop(void) +{ + bool A_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_7) == GPIO_PIN_SET); + bool B_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_9) == GPIO_PIN_SET); + + if (A_pressed && B_pressed == true) + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); + } else + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + } + // + + HAL_DELAY(200); // milliseconds +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/705927ed8c8e00101a42863e8f78717c b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/705927ed8c8e00101a42863e8f78717c new file mode 100644 index 0000000..3692d53 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/705927ed8c8e00101a42863e8f78717c @@ -0,0 +1,570 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +CRC_HandleTypeDef hcrc; + +DMA2D_HandleTypeDef hdma2d; + +I2C_HandleTypeDef hi2c3; + +TIM_HandleTypeDef htim1; + +UART_HandleTypeDef huart1; + +SDRAM_HandleTypeDef hsdram1; + +//osThreadId defaultTaskHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_CRC_Init(void); +static void MX_DMA2D_Init(void); +static void MX_FMC_Init(void); +static void MX_I2C3_Init(void); +static void MX_TIM1_Init(void); +static void MX_USART1_UART_Init(void); +void StartDefaultTask(void const * argument); + +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_DMA2D_Init(); + MX_FMC_Init(); + MX_I2C3_Init(); + MX_TIM1_Init(); + MX_USART1_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* USER CODE BEGIN RTOS_MUTEX */ + /* add mutexes, ... */ + /* USER CODE END RTOS_MUTEX */ + + /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* add semaphores, ... */ + /* USER CODE END RTOS_SEMAPHORES */ + + /* USER CODE BEGIN RTOS_TIMERS */ + /* start timers, add new ones, ... */ + /* USER CODE END RTOS_TIMERS */ + + /* USER CODE BEGIN RTOS_QUEUES */ + /* add queues, ... */ + /* USER CODE END RTOS_QUEUES */ + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + //osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 4096); + //defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* Start scheduler */ + //osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + // userloop + while (1) + { + userloop(); + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 72; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 3; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief CRC Initialization Function + * @param None + * @retval None + */ +static void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + if (HAL_CRC_Init(&hcrc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ + +} + +/** + * @brief DMA2D Initialization Function + * @param None + * @retval None + */ +static void MX_DMA2D_Init(void) +{ + + /* USER CODE BEGIN DMA2D_Init 0 */ + + /* USER CODE END DMA2D_Init 0 */ + + /* USER CODE BEGIN DMA2D_Init 1 */ + + /* USER CODE END DMA2D_Init 1 */ + hdma2d.Instance = DMA2D; + hdma2d.Init.Mode = DMA2D_M2M; + hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888; + hdma2d.Init.OutputOffset = 0; + hdma2d.LayerCfg[1].InputOffset = 0; + hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888; + hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; + hdma2d.LayerCfg[1].InputAlpha = 0; + if (HAL_DMA2D_Init(&hdma2d) != HAL_OK) + { + Error_Handler(); + } + if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN DMA2D_Init 2 */ + + /* USER CODE END DMA2D_Init 2 */ + +} + +/** + * @brief I2C3 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C3_Init(void) +{ + + /* USER CODE BEGIN I2C3_Init 0 */ + + /* USER CODE END I2C3_Init 0 */ + + /* USER CODE BEGIN I2C3_Init 1 */ + + /* USER CODE END I2C3_Init 1 */ + hi2c3.Instance = I2C3; + hi2c3.Init.ClockSpeed = 100000; + hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c3.Init.OwnAddress1 = 0; + hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c3.Init.OwnAddress2 = 0; + hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c3) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C3_Init 2 */ + + /* USER CODE END I2C3_Init 2 */ + +} + +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 65535; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/* FMC initialization function */ +static void MX_FMC_Init(void) +{ + + /* USER CODE BEGIN FMC_Init 0 */ + + /* USER CODE END FMC_Init 0 */ + + FMC_SDRAM_TimingTypeDef SdramTiming = {0}; + + /* USER CODE BEGIN FMC_Init 1 */ + + /* USER CODE END FMC_Init 1 */ + + /** Perform the SDRAM1 memory initialization sequence + */ + hsdram1.Instance = FMC_SDRAM_DEVICE; + /* hsdram1.Init */ + hsdram1.Init.SDBank = FMC_SDRAM_BANK2; + hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; + hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_11; + hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; + hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; + hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; + hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; + hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; + hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; + hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; + /* SdramTiming */ + SdramTiming.LoadToActiveDelay = 2; + SdramTiming.ExitSelfRefreshDelay = 7; + SdramTiming.SelfRefreshTime = 4; + SdramTiming.RowCycleDelay = 7; + SdramTiming.WriteRecoveryTime = 3; + SdramTiming.RPDelay = 2; + SdramTiming.RCDDelay = 2; + + if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) + { + Error_Handler( ); + } + + /* USER CODE BEGIN FMC_Init 2 */ + + /* USER CODE END FMC_Init 2 */ +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* USER CODE BEGIN MX_GPIO_Init_1 */ + + /* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOG, LD3_Pin|LD4_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : B1_Pin TP_INT1_Pin */ + GPIO_InitStruct.Pin = B1_Pin|TP_INT1_Pin;- + GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : PA1 */ // External LED + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PE7 PE9 */ // Buttons + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /*Configure GPIO pins : LD3_Pin LD4_Pin */ + GPIO_InitStruct.Pin = LD3_Pin|LD4_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + + /* USER CODE END MX_GPIO_Init_2 */ +} + + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM6 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ + + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM6) + { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ + + /* USER CODE END Callback 1 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/506c5cde8c8e00101a42863e8f78717c b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/506c5cde8c8e00101a42863e8f78717c new file mode 100644 index 0000000..be18ca8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/506c5cde8c8e00101a42863e8f78717c @@ -0,0 +1,582 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +CRC_HandleTypeDef hcrc; + +DMA2D_HandleTypeDef hdma2d; + +I2C_HandleTypeDef hi2c3; + +TIM_HandleTypeDef htim1; + +UART_HandleTypeDef huart1; + +SDRAM_HandleTypeDef hsdram1; + +//osThreadId defaultTaskHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_CRC_Init(void); +static void MX_DMA2D_Init(void); +static void MX_FMC_Init(void); +static void MX_I2C3_Init(void); +static void MX_TIM1_Init(void); +static void MX_USART1_UART_Init(void); +void StartDefaultTask(void const * argument); + +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_DMA2D_Init(); + MX_FMC_Init(); + MX_I2C3_Init(); + MX_TIM1_Init(); + MX_USART1_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* USER CODE BEGIN RTOS_MUTEX */ + /* add mutexes, ... */ + /* USER CODE END RTOS_MUTEX */ + + /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* add semaphores, ... */ + /* USER CODE END RTOS_SEMAPHORES */ + + /* USER CODE BEGIN RTOS_TIMERS */ + /* start timers, add new ones, ... */ + /* USER CODE END RTOS_TIMERS */ + + /* USER CODE BEGIN RTOS_QUEUES */ + /* add queues, ... */ + /* USER CODE END RTOS_QUEUES */ + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + //osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 4096); + //defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* Start scheduler */ + //osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + // userloop + while (1) + { + bool A_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_7) == GPIO_PIN_SET); + bool B_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_9) == GPIO_PIN_SET); + + if (A_pressed && B_pressed == true) + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); + } else + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + } + // + + HAL_DELAY(200); // milliseconds + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 72; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 3; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief CRC Initialization Function + * @param None + * @retval None + */ +static void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + if (HAL_CRC_Init(&hcrc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ + +} + +/** + * @brief DMA2D Initialization Function + * @param None + * @retval None + */ +static void MX_DMA2D_Init(void) +{ + + /* USER CODE BEGIN DMA2D_Init 0 */ + + /* USER CODE END DMA2D_Init 0 */ + + /* USER CODE BEGIN DMA2D_Init 1 */ + + /* USER CODE END DMA2D_Init 1 */ + hdma2d.Instance = DMA2D; + hdma2d.Init.Mode = DMA2D_M2M; + hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888; + hdma2d.Init.OutputOffset = 0; + hdma2d.LayerCfg[1].InputOffset = 0; + hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888; + hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; + hdma2d.LayerCfg[1].InputAlpha = 0; + if (HAL_DMA2D_Init(&hdma2d) != HAL_OK) + { + Error_Handler(); + } + if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN DMA2D_Init 2 */ + + /* USER CODE END DMA2D_Init 2 */ + +} + +/** + * @brief I2C3 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C3_Init(void) +{ + + /* USER CODE BEGIN I2C3_Init 0 */ + + /* USER CODE END I2C3_Init 0 */ + + /* USER CODE BEGIN I2C3_Init 1 */ + + /* USER CODE END I2C3_Init 1 */ + hi2c3.Instance = I2C3; + hi2c3.Init.ClockSpeed = 100000; + hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c3.Init.OwnAddress1 = 0; + hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c3.Init.OwnAddress2 = 0; + hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c3) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C3_Init 2 */ + + /* USER CODE END I2C3_Init 2 */ + +} + +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 65535; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/* FMC initialization function */ +static void MX_FMC_Init(void) +{ + + /* USER CODE BEGIN FMC_Init 0 */ + + /* USER CODE END FMC_Init 0 */ + + FMC_SDRAM_TimingTypeDef SdramTiming = {0}; + + /* USER CODE BEGIN FMC_Init 1 */ + + /* USER CODE END FMC_Init 1 */ + + /** Perform the SDRAM1 memory initialization sequence + */ + hsdram1.Instance = FMC_SDRAM_DEVICE; + /* hsdram1.Init */ + hsdram1.Init.SDBank = FMC_SDRAM_BANK2; + hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; + hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_11; + hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; + hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; + hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; + hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; + hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; + hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; + hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; + /* SdramTiming */ + SdramTiming.LoadToActiveDelay = 2; + SdramTiming.ExitSelfRefreshDelay = 7; + SdramTiming.SelfRefreshTime = 4; + SdramTiming.RowCycleDelay = 7; + SdramTiming.WriteRecoveryTime = 3; + SdramTiming.RPDelay = 2; + SdramTiming.RCDDelay = 2; + + if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) + { + Error_Handler( ); + } + + /* USER CODE BEGIN FMC_Init 2 */ + + /* USER CODE END FMC_Init 2 */ +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* USER CODE BEGIN MX_GPIO_Init_1 */ + + /* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOG, LD3_Pin|LD4_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : B1_Pin TP_INT1_Pin */ + GPIO_InitStruct.Pin = B1_Pin|TP_INT1_Pin;- + GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : PA1 */ // External LED + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PE7 PE9 */ // Buttons + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /*Configure GPIO pins : LD3_Pin LD4_Pin */ + GPIO_InitStruct.Pin = LD3_Pin|LD4_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + + /* USER CODE END MX_GPIO_Init_2 */ +} + + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM6 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ + + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM6) + { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ + + /* USER CODE END Callback 1 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/Calculator/.indexes/bf/c4/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/Calculator/.indexes/bf/c4/history.index index c622f1b5998f7645bf4b925a38f7f931b260b7c0..58268bb81ad1ae951b364e4c60356f18cdadd895 100644 GIT binary patch delta 202 zcmX@e_>w7+iGhKEi9tZ$Ilm}XKe#AaKQ}QmPcNB)Ys23sAA0&21f-nW?D{JTYuabD zna*TnU?_-Ge~Tc)%|w_0 delta 33 ocmaFKbdXV!iGhKEkwHM;Ilm}XKe#AaKQ}QmPcNB)ePZGY0EQ$8?*IS* diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/6.tree b/.metadata/.plugins/org.eclipse.core.resources/.root/7.tree similarity index 95% rename from .metadata/.plugins/org.eclipse.core.resources/.root/6.tree rename to .metadata/.plugins/org.eclipse.core.resources/.root/7.tree index b8c17df7b0cd31d5a0082e64b9d3474d265950ac..f47a7d1af17d4fb9721208a73ab240ce1ad280bb 100644 GIT binary patch delta 129 zcmX>xo$32@CK(oHCME_jkp2y!;iU9N84qSg&dI6FPU3AFxgg>a#Xy=D%Kkf9UtMAI yJ!VBlU9QsN)S{gH`~tmX21W)JMxddLGfmr0%z-GC{sp92AZ(f9&3{==w*df#X&4*; delta 79 zcmex9o$17MCK(oHCME_jko1Aja8h`qj0ZC#$K+IIC-Lg#PaxtF#Xy=1%09MvAG0Il JWnM;aFCr*^-NX{=x zwFR@4AVQK8FYtg_5A@g!OwG(q3?_>(+7U2qau?%DafoWJ0};PJEAL?tkqZ3WQ@y+V F7yyOfF5v(G diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi index f04ed49..08da609 100644 --- a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -1,6 +1,6 @@ - + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration @@ -70,8 +70,9 @@ persp.newWizSC:com.st.stm32cube.ide.cmake.newwizard persp.viewSC:com.st.stm32cube.ide.mcu.cyclomaticcomplexity.view persp.viewSC:com.st.stm32cube.ide.mcu.sfrview - + + active noFocus View @@ -221,18 +222,9 @@ categoryTag:Help - + EditorStack org.eclipse.e4.primaryDataStack - active - - - Editor - removeOnHide - org.eclipse.cdt.ui.editor.CEditor - active - activeOnClose - @@ -241,6 +233,8 @@ View categoryTag:General + active + activeOnClose ViewMenu menuContribution:menu @@ -262,7 +256,7 @@ - + View categoryTag:General @@ -386,7 +380,7 @@ Draggable - + toolbarSeparator @@ -394,8 +388,8 @@ Draggable - - + + toolbarSeparator @@ -419,7 +413,7 @@ Draggable - + toolbarSeparator @@ -1958,7 +1952,7 @@ - + diff --git a/.metadata/version.ini b/.metadata/version.ini index e55a534..da5ca62 100644 --- a/.metadata/version.ini +++ b/.metadata/version.ini @@ -1,3 +1,3 @@ -#Wed Sep 10 15:27:29 CDT 2025 +#Wed Sep 10 16:23:13 CDT 2025 org.eclipse.core.runtime=2 org.eclipse.platform=4.33.0.v20240903-0240 diff --git a/Calculator/Core/Src/main.c b/Calculator/Core/Src/main.c index be18ca8..1190459 100644 --- a/Calculator/Core/Src/main.c +++ b/Calculator/Core/Src/main.c @@ -152,19 +152,7 @@ int main(void) // userloop while (1) { - bool A_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_7) == GPIO_PIN_SET); - bool B_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_9) == GPIO_PIN_SET); - - if (A_pressed && B_pressed == true) - { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); - } else - { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); - } - // - - HAL_DELAY(200); // milliseconds + userloop(200); // 200 millisecond delay before repeat } /* USER CODE END 3 */ } diff --git a/Calculator/Core/Src/userloop.c b/Calculator/Core/Src/userloop.c new file mode 100644 index 0000000..b632369 --- /dev/null +++ b/Calculator/Core/Src/userloop.c @@ -0,0 +1,22 @@ +/* + * userloop.c + * + * Created on: Sep 10, 2025 + * Author: ja + */ +void userloop(int DELAY_MS) +{ + bool A_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_7) == GPIO_PIN_SET); + bool B_pressed = (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_9) == GPIO_PIN_SET); + + if (A_pressed && B_pressed == true) + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); + } else + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + } + // + + HAL_DELAY(DELAY_MS); // milliseconds +}