Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changesets/spi45-hsi-clock-source.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
release: patch
summary: Drive SPI4 and SPI5 from HSI for stable 2 MHz BMS transfers

SPI4 and SPI5 now use the 64 MHz HSI peripheral clock source instead of PCLK2,
allowing a 2 MHz request to select the /32 SPI prescaler deterministically.
4 changes: 2 additions & 2 deletions Inc/HALAL/Models/SPI/SPI2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1371,15 +1371,15 @@ struct SPIDomain {
spi_number = 3;
} else if (peripheral == SPIPeripheral::spi4) {
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI4;
PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_PCLK2;
PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_HSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
PANIC("Unable to configure SPI4 clock");
}
__HAL_RCC_SPI4_CLK_ENABLE();
spi_number = 4;
} else if (peripheral == SPIPeripheral::spi5) {
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI5;
PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_PCLK2;
PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_HSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
PANIC("Unable to configure SPI5 clock");
}
Expand Down
6 changes: 5 additions & 1 deletion Inc/MockedDrivers/stm32h7xx_hal_mock.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ typedef struct {
} RCC_TypeDef;
extern RCC_TypeDef* RCC;
extern uint32_t SystemCoreClock;
#define HSI_VALUE 64000000U

#define RCC_D1CFGR_HPRE_Msk (0xFU << 0U)
#define RCC_D2CFGR_D2PPRE1_Pos 4U
Expand Down Expand Up @@ -596,6 +597,7 @@ typedef struct {
#define RCC_SPI123CLKSOURCE_PLL 0x00000001U
#define RCC_SPI45CLKSOURCE_PLL2 0x00000002U
#define RCC_SPI45CLKSOURCE_PCLK2 0x00000003U
#define RCC_SPI45CLKSOURCE_HSI 0x00000004U
#define RCC_SPI6CLKSOURCE_PLL2 0x00000002U

typedef struct TIM_TypeDef TIM_TypeDef;
Expand Down Expand Up @@ -946,7 +948,9 @@ static inline HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeD
return HAL_OK;
}
static inline uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) {
(void)PeriphClk;
if (PeriphClk == RCC_PERIPHCLK_SPI45) {
return HSI_VALUE;
}
return SystemCoreClock;
}
static inline HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef* hdma) {
Expand Down
5 changes: 4 additions & 1 deletion Src/HALAL/Models/HALconfig/Halconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ void HALconfig::system_clock() {

__HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.OscillatorType =
RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
Comment thread
jorgesg82 marked this conversation as resolved.
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
Expand Down
Loading