1 /* USER CODE BEGIN Header */ 2 /** 3 ****************************************************************************** 4 * @file flash_driver.c 5 * @author MCD Application Team 6 * @brief The Flash Driver module is the interface layer between Flash 7 * management modules and HAL Flash drivers 8 ****************************************************************************** 9 * @attention 10 * 11 * Copyright (c) 2022 STMicroelectronics. 12 * All rights reserved. 13 * 14 * This software is licensed under terms that can be found in the LICENSE file 15 * in the root directory of this software component. 16 * If no LICENSE file comes with this software, it is provided AS-IS. 17 * 18 ****************************************************************************** 19 */ 20 /* USER CODE END Header */ 21 22 /* Includes ------------------------------------------------------------------*/ 23 #include "flash_driver.h" 24 #include "utilities_conf.h" 25 26 /* Global variables ----------------------------------------------------------*/ 27 /* Private typedef -----------------------------------------------------------*/ 28 /* Private defines -----------------------------------------------------------*/ 29 30 #define FD_CTRL_NO_BIT_SET (0UL) /* value used to reset the Flash Control status */ 31 32 /* Private macros ------------------------------------------------------------*/ 33 /* Private variables ---------------------------------------------------------*/ 34 35 /** 36 * @brief variable used to represent the Flash Control status 37 */ 38 static volatile FD_Flash_ctrl_bm_t FD_Flash_Control_status = FD_CTRL_NO_BIT_SET; 39 40 /* Private function prototypes -----------------------------------------------*/ 41 /* Functions Definition ------------------------------------------------------*/ 42 43 /** 44 * @brief Update Flash Control status 45 * @param Flags_bm: Bit mask identifying the caller (1 bit per user) 46 * @param Status: Action requested (enable or disable flash access) 47 * @retval None 48 */ FD_SetStatus(FD_Flash_ctrl_bm_t Flags_bm,FD_FLASH_Status_t Status)49void FD_SetStatus(FD_Flash_ctrl_bm_t Flags_bm, FD_FLASH_Status_t Status) 50 { 51 UTILS_ENTER_CRITICAL_SECTION(); 52 53 switch (Status) 54 { 55 case LL_FLASH_DISABLE: 56 { 57 FD_Flash_Control_status |= (1u << Flags_bm); 58 break; 59 } 60 case LL_FLASH_ENABLE: 61 { 62 FD_Flash_Control_status &= ~(1u << Flags_bm); 63 break; 64 } 65 default : 66 { 67 break; 68 } 69 } 70 71 UTILS_EXIT_CRITICAL_SECTION(); 72 } 73 74 /** 75 * @brief Write a block of 128 bits (4 32-bit words) in Flash 76 * @param Dest: Address where to write in Flash (128-bit aligned) 77 * @param Payload: Address of data to be written in Flash (32-bit aligned) 78 * @retval FD_FlashOp_Status_t: Success or failure of Flash write operation 79 */ FD_WriteData(uint32_t Dest,uint32_t Payload)80FD_FlashOp_Status_t FD_WriteData(uint32_t Dest, uint32_t Payload) 81 { 82 FD_FlashOp_Status_t status = FD_FLASHOP_FAILURE; 83 84 /* Check if RFTS OR Application allow flash access */ 85 if ((FD_Flash_Control_status & (1u << FD_FLASHACCESS_RFTS)) && 86 (FD_Flash_Control_status & (1u << FD_FLASHACCESS_RFTS_BYPASS))) 87 { /* Access not allowed */ 88 return status; 89 } 90 91 /* Wait for system to allow flash access */ 92 while (FD_Flash_Control_status & (1u << FD_FLASHACCESS_SYSTEM)); 93 94 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, Dest, Payload) == HAL_OK) 95 { 96 status = FD_FLASHOP_SUCCESS; 97 } 98 return status; 99 } 100 101 /** 102 * @brief Erase one sector of Flash 103 * @param Sect: Identifier of the sector to erase 104 * @retval FD_FlashOp_Status_t: Success or failure of Flash erase operation 105 */ FD_EraseSectors(uint32_t Sect)106FD_FlashOp_Status_t FD_EraseSectors(uint32_t Sect) 107 { 108 FD_FlashOp_Status_t status = FD_FLASHOP_FAILURE; 109 uint32_t page_error; 110 FLASH_EraseInitTypeDef p_erase_init; 111 112 /* Check if LL allows flash access */ 113 if ((FD_Flash_Control_status & (1u << FD_FLASHACCESS_RFTS)) && 114 (FD_Flash_Control_status & (1u << FD_FLASHACCESS_RFTS_BYPASS))) 115 { /* Access not allowed */ 116 return status; 117 } 118 119 /* Wait for system to allow flash access */ 120 while (FD_Flash_Control_status & (1u << FD_FLASHACCESS_SYSTEM)); 121 122 p_erase_init.TypeErase = FLASH_TYPEERASE_PAGES; 123 p_erase_init.Page = Sect; 124 p_erase_init.NbPages = 1; 125 126 if (HAL_FLASHEx_Erase(&p_erase_init, &page_error) == HAL_OK) 127 { 128 status = FD_FLASHOP_SUCCESS; 129 } 130 131 return status; 132 } 133