From 5dce1bf3826a4634f7bafd3843e33c9422f18e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E4=BD=B3?= <13101321+jfen5577@user.noreply.gitee.com> Date: Fri, 23 Jan 2026 10:13:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E7=8E=AF=E5=A2=83=E6=90=AD?= =?UTF-8?q?=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 14 +- HAL/Src/arch/stm32f4/hal_stm32f4_spi.c | 30 +- build/Debug/.ninja_deps | Bin 39296 -> 58800 bytes build/Debug/.ninja_log | 306 ++++++++--------- build/Debug/stm32f407vet6_cmake.elf | Bin 1273560 -> 1273752 bytes build/Debug/stm32f407vet6_cmake.map | 433 +++++++++++++------------ 6 files changed, 404 insertions(+), 379 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 90047de..af898dd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,15 +15,17 @@ "interface": "swd", "serialNumber": "", // Optional: set if multiple J-Links are connected "runToEntryPoint": "main", - "svdFile": "${config:STM32VSCodeExtension.cubeCLT.path}/STMicroelectronics_CMSIS_SVD/STM32F407.svd", - "armToolchainPath": "${config:STM32VSCodeExtension.cubeCLT.path}/GNU-tools-for-STM32/bin", - "gdbPath": "${config:STM32VSCodeExtension.cubeCLT.path}/GNU-tools-for-STM32/bin/arm-none-eabi-gdb", - "serverpath": "C:/Program Files/SEGGER/JLink_V836/JLinkGDBServerCL.exe", // Adjust path if needed + "armToolchainPath": "D:/ARM_GCC/bin", + "gdbPath": "D:/ARM_GCC/bin/arm-none-eabi-gdb.exe", + "serverpath": "D:/SEGGER/JLink_V898/JLinkGDBServerCL.exe", "serverArgs": [ "-device", "STM32F407VE", "-if", "SWD", - "-speed", "4000" - ] + "-speed", "4000", + "-nogui", + "-autoconnect", "1" + ], + "preLaunchTask": "CMake: clean rebuild" }, { "name": "Build & Debug Microcontroller - ST-Link", diff --git a/HAL/Src/arch/stm32f4/hal_stm32f4_spi.c b/HAL/Src/arch/stm32f4/hal_stm32f4_spi.c index 4a89b91..10df973 100644 --- a/HAL/Src/arch/stm32f4/hal_stm32f4_spi.c +++ b/HAL/Src/arch/stm32f4/hal_stm32f4_spi.c @@ -72,15 +72,37 @@ bool hal_stm32f4_spi_init(hal_spi_instance_t instance, const hal_spi_config_t *c /* Calculate baud rate prescaler based on desired baud rate */ uint32_t apb_clock = HAL_RCC_GetPCLK2Freq(); /* Assume SPI1 is on APB2 */ - uint32_t prescaler = 0; + + /* Define prescaler enum values */ + const uint32_t prescaler_enums[] = { + SPI_BAUDRATEPRESCALER_2, + SPI_BAUDRATEPRESCALER_4, + SPI_BAUDRATEPRESCALER_8, + SPI_BAUDRATEPRESCALER_16, + SPI_BAUDRATEPRESCALER_32, + SPI_BAUDRATEPRESCALER_64, + SPI_BAUDRATEPRESCALER_128, + SPI_BAUDRATEPRESCALER_256 + }; + + uint32_t prescaler_index = 0; uint32_t temp_prescaler = 2; - while (apb_clock / temp_prescaler > config->baudrate) { + /* Find the appropriate prescaler */ + while (prescaler_index < sizeof(prescaler_enums)/sizeof(prescaler_enums[0])) { + if (apb_clock / temp_prescaler <= config->baudrate) { + break; + } temp_prescaler <<= 1; - prescaler++; + prescaler_index++; } - hspi->Init.BaudRatePrescaler = (uint32_t)temp_prescaler; + /* Use the found prescaler or the maximum available */ + if (prescaler_index >= sizeof(prescaler_enums)/sizeof(prescaler_enums[0])) { + prescaler_index = sizeof(prescaler_enums)/sizeof(prescaler_enums[0]) - 1; + } + + hspi->Init.BaudRatePrescaler = prescaler_enums[prescaler_index]; hspi->Init.FirstBit = SPI_FIRSTBIT_MSB; /* Default to MSB first */ hspi->Init.TIMode = SPI_TIMODE_DISABLE; hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; diff --git a/build/Debug/.ninja_deps b/build/Debug/.ninja_deps index ee03719626180fd4bf1777714f35f0e6e925671d..4484e61ae46961c176ccbcd7737d10ae244de2a2 100644 GIT binary patch delta 2082 zcmZvddrVVj7>8TevvI^@AWlaziE-J@nXPP^2nm@qGvY3&fDwYY$t6LlfMxBVl(KS} zLJ61hfn1KzHn0IhSCre#h{I)WZjj6^W=kdv$l?;BWWfG#nS<^3euvXlv%mP>=Y7BL z^w8(~)iJQ9fBcbtN2@fZ(Kz}v8cpP~*44r0vqz+zAax*>hhvA`%xm8+nL)Zibmlie z+Eb0vTOj=)(LHe>_Vm}JNDu}x>mXA4zFs;B;sRMex*z1lxQvZ4ARmGl*Ch_S!!~O^ z!ulw4ZQH^|k8D`$=tbF+a2UhdR=qTcVHqT4_aTt)6B%#NVH2ol|(+ox#mqR}V)jkyeveFYgH^C$k`pRf}|KAH)VbJ8caQ-3N8)nbKDO2&>g zAV=DAK`saf__H>F7;)E~?4%Zd9gP znf2G{#3+-8?{l)WdRds9^rEMA$!yH36ZhMCc&~)TTbfx!fleIz=R7A4w%8yG<0*o7-TvEgvo8vL$&tr3;4@qU^{x#56@xzAl`;IsNn)4%RS-xVN)nQ``M>Sv zCzG~)ezldIbT=b0N7tm%Kxff4QMIhQ77IdJs!A0?7+4=6q8O9P3j8WC3hJcboXI#*!C%IoYDLWj-E z59!u<%F2(;CpEaiPsZ9XzG|@e%o#iHzsGe<=qN#tbR+?rx*e!YwQjLushm$0arp)X zC%D$-7P3sVg0Nh=%Ppu7I1a8Mi82P~h?CEdj>#9!;*3BYcNR8-gxcJK z)lDlB_h7M3m||V1>`iVVv*BZ`NYRPRAYov}toP7Y?vK74i$(8wDEdPDk-JV)hw23@XMr!hvO%!}7!Wqm^@KJy&Re)VQi1#dE1~2@e(FbRo*hxmK zwm$k)EeP4F8h!i*5g5(-%XB=nv%(ojpqqE+8~N#hZvL=5f~ml`9Ws0YLUG%LciDl@ zx*_{Z5G6i?L~GPn{1ipCjJWIQk!lpHJ!YyDDRn$de`4S8>HorXWnn_^;bAJNNj+Zm z9kvo#p!!cga+hD5jFl zr&Dk9nG$9yl7-uabJ$OohTosZN{!d2GZ#^*K2x9uFKHq?{y?4HtBatos)c?f{sjdp B7zF?T delta 9 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 delta 8558 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 pS)$WbwrRNU