From 64ef86eaf647af7f4d9dfc96ac3f93e633662036 Mon Sep 17 00:00:00 2001 From: IOsetting Date: Sat, 18 Feb 2023 01:14:14 +0800 Subject: [PATCH] feat: hal flash read&write example --- Examples/HAL/Flash/SectorEraseAndWrite/main.c | 138 +++++++++++ .../SectorEraseAndWrite/py32f0xx_hal_conf.h | 229 ++++++++++++++++++ .../SectorEraseAndWrite/py32f0xx_hal_msp.c | 44 ++++ .../Flash/SectorEraseAndWrite/py32f0xx_it.c | 85 +++++++ .../Flash/SectorEraseAndWrite/py32f0xx_it.h | 48 ++++ Libraries/BSP/Inc/py32f0xx_bsp_clock.h | 31 +++ Libraries/BSP/Src/py32f0xx_bsp_clock.c | 123 ++++++++++ 7 files changed, 698 insertions(+) create mode 100644 Examples/HAL/Flash/SectorEraseAndWrite/main.c create mode 100644 Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_conf.h create mode 100644 Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_msp.c create mode 100644 Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.c create mode 100644 Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.h create mode 100644 Libraries/BSP/Inc/py32f0xx_bsp_clock.h create mode 100644 Libraries/BSP/Src/py32f0xx_bsp_clock.c diff --git a/Examples/HAL/Flash/SectorEraseAndWrite/main.c b/Examples/HAL/Flash/SectorEraseAndWrite/main.c new file mode 100644 index 0000000..6efc902 --- /dev/null +++ b/Examples/HAL/Flash/SectorEraseAndWrite/main.c @@ -0,0 +1,138 @@ +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" +#include "py32f0xx_bsp_clock.h" +#include "py32f0xx_bsp_printf.h" + +void APP_ErrorHandler(void); + +#define FLASH_USER_START_ADDR 0x0800F000 + +const uint32_t DATA[64] = +{ + 0x01010101, 0x23456789, 0x3456789A, 0x456789AB, 0x56789ABC, 0x6789ABCD, 0x789ABCDE, 0x89ABCDEF, + 0x9ABCDEF0, 0xABCDEF01, 0xBCDEF012, 0xCDEF0123, 0xDEF01234, 0xEF012345, 0xF0123456, 0x01234567, + 0x01010101, 0x23456789, 0x3456789A, 0x456789AB, 0x56789ABC, 0x6789ABCD, 0x789ABCDE, 0x89ABCDEF, + 0x9ABCDEF0, 0xABCDEF01, 0xBCDEF012, 0xCDEF0123, 0xDEF01234, 0xEF012345, 0xF0123456, 0x01234567, + 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, + 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, + 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, + 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, 0x55555555, 0x23456789, 0xAAAAAAAA, +}; + +static void APP_FlashErase(void); +static void APP_FlashProgram(void); +static void APP_FlashEraseVerify(void); +static void APP_FlashWriteVerify(void); + +int main(void) +{ + HAL_Init(); + + BSP_HSI_PLL_48MHzClockConfig(); + + BSP_USART_Config(); + + printf("Flash Read&Write Demo\r\nClock: %ld\r\n", SystemCoreClock); + + // Unlock flash + HAL_FLASH_Unlock(); + // Erase flash + APP_FlashErase(); + APP_FlashEraseVerify(); + printf("Erase verif: succ\r\n"); + + // Write to flash + APP_FlashProgram(); + // Lock + HAL_FLASH_Lock(); + // Write verification + APP_FlashWriteVerify(); + printf("Write verif: succ\r\n"); + + while (1); +} + + +static void APP_FlashErase(void) +{ + uint32_t SECTORError = 0; + FLASH_EraseInitTypeDef EraseInitStruct; + // Erase type = sector + EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORERASE; + // Erase address start + EraseInitStruct.SectorAddress = FLASH_USER_START_ADDR; + // Number of sectors + EraseInitStruct.NbSectors = 1; + // Erase + if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK) + { + APP_ErrorHandler(); + } +} + +static void APP_FlashProgram(void) +{ + uint32_t flash_program_start = FLASH_USER_START_ADDR ; + uint32_t flash_program_end = (FLASH_USER_START_ADDR + sizeof(DATA)); + uint32_t *src = (uint32_t *)DATA; + + while (flash_program_start < flash_program_end) + { + // Write to flash + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, flash_program_start, src) == HAL_OK) + { + // Move flash point to next page + flash_program_start += FLASH_PAGE_SIZE; + // Move data point + src += FLASH_PAGE_SIZE / 4; + } + } +} + +static void APP_FlashEraseVerify(void) +{ + uint32_t addr = 0; + + while (addr < sizeof(DATA)) + { + if (0xFFFFFFFF != HW32_REG(FLASH_USER_START_ADDR + addr)) + { + printf("erase verification error\r\n"); + } + addr += 4; + } +} + +static void APP_FlashWriteVerify(void) +{ + uint32_t addr = 0; + + while (addr < sizeof(DATA)) + { + if (DATA[addr / 4] != HW32_REG(FLASH_USER_START_ADDR + addr)) + { + printf("write verification error\r\n"); + } + addr += 4; + } +} + +void APP_ErrorHandler(void) +{ + while (1); +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Export assert error source and line number + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + while (1) + { + } +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_conf.h b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_conf.h new file mode 100644 index 0000000..0811215 --- /dev/null +++ b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_conf.h @@ -0,0 +1,229 @@ +/** + ****************************************************************************** + * @file py32f0xx_hal_conf.h + * @author MCU Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __PY32F0xx_HAL_CONF_H +#define __PY32F0xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_I2C_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/* #define HAL_SPI_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_LED_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)24000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)200) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Low Speed Internal oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32768) /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ + +/** + * @brief Adjust the value of External Low Speed oscillator (LSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define PRIORITY_HIGHEST 0 +#define PRIORITY_HIGH 1 +#define PRIORITY_LOW 2 +#define PRIORITY_LOWEST 3 +#define TICK_INT_PRIORITY ((uint32_t)PRIORITY_LOWEST) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 0 + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ +#ifdef HAL_MODULE_ENABLED + #include "py32f0xx_hal.h" +#endif /* HAL_MODULE_ENABLED */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "py32f0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "py32f0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "py32f0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "py32f0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "py32f0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "py32f0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "py32f0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "py32f0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "py32f0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "py32f0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "py32f0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "py32f0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "py32f0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "py32f0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "py32f0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "py32f0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "py32f0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "py32f0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "py32f0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __PY32F0xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_msp.c b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_msp.c new file mode 100644 index 0000000..bfdd2d5 --- /dev/null +++ b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_hal_msp.c @@ -0,0 +1,44 @@ +/** + ****************************************************************************** + * @file py32f0xx_hal_msp.c + * @author MCU Application Team + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* External functions --------------------------------------------------------*/ + +/** + * @brief Configure the Flash prefetch and the Instruction cache, + * the time base source, NVIC and any required global low level hardware + * by calling the HAL_MspInit() callback function from HAL_Init() + * + */ +void HAL_MspInit(void) +{ +} + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.c b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.c new file mode 100644 index 0000000..2a0c9f6 --- /dev/null +++ b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.c @@ -0,0 +1,85 @@ +/** + ****************************************************************************** + * @file py32f0xx_it.c + * @author MCU Application Team + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" +#include "py32f0xx_it.h" + +/* Private includes ----------------------------------------------------------*/ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private user code ---------------------------------------------------------*/ +/* External variables --------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M0+ Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + while (1) + { + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + HAL_IncTick(); +} + +/******************************************************************************/ +/* PY32F0xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file. */ +/******************************************************************************/ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.h b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.h new file mode 100644 index 0000000..447d294 --- /dev/null +++ b/Examples/HAL/Flash/SectorEraseAndWrite/py32f0xx_it.h @@ -0,0 +1,48 @@ +/** + ****************************************************************************** + * @file py32f0xx_it.h + * @author MCU Application Team + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __PY32F0XX_IT_H +#define __PY32F0XX_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __PY32F0XX_IT_H */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Libraries/BSP/Inc/py32f0xx_bsp_clock.h b/Libraries/BSP/Inc/py32f0xx_bsp_clock.h new file mode 100644 index 0000000..bd01491 --- /dev/null +++ b/Libraries/BSP/Inc/py32f0xx_bsp_clock.h @@ -0,0 +1,31 @@ +/** + ****************************************************************************** + * @file py32f0xx_bsp_clock.h + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PY32F0XX_BSP_CLOCK_H +#define PY32F0XX_BSP_CLOCK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +#include "py32f0xx_hal.h" +#include "py32f0xx_hal_rcc.h" + +HAL_StatusTypeDef BSP_HSI_24MHzClockConfig(void); +HAL_StatusTypeDef BSP_HSI_PLL_48MHzClockConfig(void); + +HAL_StatusTypeDef BSP_HSE_ClockConfig(void); +HAL_StatusTypeDef BSP_HSE_PLL_ClockConfig(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* PY32F0XX_BSP_CLOCK_H */ diff --git a/Libraries/BSP/Src/py32f0xx_bsp_clock.c b/Libraries/BSP/Src/py32f0xx_bsp_clock.c new file mode 100644 index 0000000..9ee3fc2 --- /dev/null +++ b/Libraries/BSP/Src/py32f0xx_bsp_clock.c @@ -0,0 +1,123 @@ +#include "py32f0xx_bsp_clock.h" + +HAL_StatusTypeDef BSP_HSI_24MHzClockConfig(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* HSI ON */ + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_24MHz; /* Set HSI clock 24MHz */ + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* No division */ + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* OFF */ + RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* OFF */ + RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* OFF */ + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF; /* OFF */ + + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + return HAL_ERROR; + } + + /* Reinitialize AHB,APB bus clock */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; /* Select HSI as SYSCLK source */ + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* APH clock, no division */ + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB clock, no division */ + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + return HAL_ERROR; + } + return HAL_OK; +} + + +HAL_StatusTypeDef BSP_HSI_PLL_48MHzClockConfig(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* HSI ON */ + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* No division */ + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz; /* HSI =16MHz */ + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* OFF */ + RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; + RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* OFF */ + RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* OFF */ + RCC_OscInitStruct.LSEDriver = RCC_ECSCR_LSE_DRIVER_1; /* LSE default */ + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* PLL ON */ + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* PLL clock source (freq >= 12MHz) */ + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + return HAL_ERROR; + } + + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* Set PLL as SYSCLK source */ + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* APH no division */ + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB no division */ + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + return HAL_ERROR; + } + return HAL_OK; +} + + +HAL_StatusTypeDef BSP_HSE_ClockConfig(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; /* Turn on HSE */ + RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; /* HSE frequency range */ + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + return HAL_ERROR; + } + + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; /* SYSCLK source */ + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + /* + * Re-initialize RCC clock + * -- clock <= 24MHz: FLASH_LATENCY_0 + * -- clock > 24MHz: FLASH_LATENCY_1 + */ + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + return HAL_ERROR; + } + return HAL_OK; +} + +HAL_StatusTypeDef BSP_HSE_PLL_ClockConfig(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; /* Turn on HSE */ + RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; /* HSE frequency range */ + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* PLL ON */ + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; /* PLL clock source from HSE (freq >= 12MHz) */ + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + return HAL_ERROR; + } + + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* Set PLL as SYSCLK source */ + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* APH no division */ + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB no division */ + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + return HAL_ERROR; + } + return HAL_OK; +} \ No newline at end of file