Fix wrong SysTick clock on NUCLEO-C071RB

Signed-off-by: HiFiPhile <admin@hifiphile.com>
This commit is contained in:
HiFiPhile
2025-05-29 13:36:34 +02:00
parent 9548d51c7e
commit 3d2b870fcb
2 changed files with 45 additions and 23 deletions

View File

@@ -55,9 +55,45 @@
// Enable UART serial communication with the ST-Link
#define UART_DEV USART2
#define UART_CLK_EN __HAL_RCC_USART2_CLK_ENABLE
#define UART_GPIO_PORT GPIOA
#define UART_GPIO_AF GPIO_AF1_USART2
#define UART_TX_PIN GPIO_PIN_2
#define UART_RX_PIN GPIO_PIN_3
static inline void board_clock_init(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};
/* -1- Enable HSIUSB48 Oscillator */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* -2- Initializes the CPU, AHB and APB buses clocks */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSIUSB48;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
__HAL_RCC_CRS_CLK_ENABLE();
// Configures CRS
RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000,1000);
RCC_CRSInitStruct.ErrorLimitValue = 34;
RCC_CRSInitStruct.HSI48CalibrationValue = 32;
HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
}
#endif /* BOARD_H_ */

View File

@@ -53,31 +53,16 @@ UART_HandleTypeDef UartHandle;
void board_init(void) {
HAL_Init();
// Enable the HSIUSB48 48 MHz oscillator.
RCC->CR |= RCC_CR_HSIUSB48ON;
// Wait for HSIUSB48 to be ready.
while (!(RCC->CR & RCC_CR_HSIUSB48RDY)) { }
// Change the SYSCLK source to HSIUSB48.
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_SYSCLKSOURCE_HSIUSB48;
// Wait for the SYSCLK source to change.
while ((RCC->CFGR & RCC_CFGR_SWS) >> RCC_CFGR_SWS_Pos != RCC_SYSCLKSOURCE_HSIUSB48) { }
// Disable HSI48 to save power.
RCC->CR &= ~RCC_CR_HSION;
board_clock_init();
// Enable peripheral clocks.
RCC->APBENR1 = RCC_APBENR1_USBEN | RCC_APBENR1_CRSEN | RCC_APBENR1_USART2EN;
RCC->APBENR2 = RCC_APBENR2_USART1EN;
// Enable all GPIO clocks.
RCC->IOPENR = 0x2F;
// Turn on CRS to make the HSIUSB48 clock more precise when USB is connected.
CRS->CR |= CRS_CR_AUTOTRIMEN | CRS_CR_CEN;
__HAL_RCC_USB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
@@ -109,6 +94,7 @@ void board_init(void) {
}
#ifdef UART_DEV
UART_CLK_EN();
// UART
{
GPIO_InitTypeDef gpio_init = { 0 };