1 /*! 2 * @file apm32f10x_fmc.h 3 * 4 * @brief This file contains all the functions prototypes for the FMC firmware library 5 * 6 * @version V1.0.4 7 * 8 * @date 2022-12-01 9 * 10 * @attention 11 * 12 * Copyright (C) 2020-2022 Geehy Semiconductor 13 * 14 * You may not use this file except in compliance with the 15 * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). 16 * 17 * The program is only for reference, which is distributed in the hope 18 * that it will be useful and instructional for customers to develop 19 * their software. Unless required by applicable law or agreed to in 20 * writing, the program is distributed on an "AS IS" BASIS, WITHOUT 21 * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. 22 * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions 23 * and limitations under the License. 24 */ 25 26 /* Define to prevent recursive inclusion */ 27 #ifndef __APM32F10X_FMC_H 28 #define __APM32F10X_FMC_H 29 30 /* Includes */ 31 #include "apm32f10x.h" 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 /** @addtogroup APM32F10x_StdPeriphDriver 38 @{ 39 */ 40 41 /** @addtogroup FMC_Driver FMC Driver 42 @{ 43 */ 44 45 /** @defgroup FMC_Macros Macros 46 @{ 47 */ 48 49 /* Macros description */ 50 51 /* Values for APM32 Low and Medium density devices */ 52 #define FLASH_WRP_PAGE_0_3 ((uint32_t)BIT0) /*!< Write protection of page 0 to 3 */ 53 #define FLASH_WRP_PAGE_4_7 ((uint32_t)BIT1) /*!< Write protection of page 4 to 7 */ 54 #define FLASH_WRP_PAGE_8_11 ((uint32_t)BIT2) /*!< Write protection of page 8 to 11 */ 55 #define FLASH_WRP_PAGE_12_15 ((uint32_t)BIT3) /*!< Write protection of page 12 to 15 */ 56 #define FLASH_WRP_PAGE_16_19 ((uint32_t)BIT4) /*!< Write protection of page 16 to 19 */ 57 #define FLASH_WRP_PAGE_20_23 ((uint32_t)BIT5) /*!< Write protection of page 20 to 23 */ 58 #define FLASH_WRP_PAGE_24_27 ((uint32_t)BIT6) /*!< Write protection of page 24 to 27 */ 59 #define FLASH_WRP_PAGE_28_31 ((uint32_t)BIT7) /*!< Write protection of page 28 to 31 */ 60 61 /* Values for APM32 Medium-density devices */ 62 #define FLASH_WRP_PAGE_32_35 ((uint32_t)BIT8) /*!< Write protection of page 32 to 35 */ 63 #define FLASH_WRP_PAGE_36_39 ((uint32_t)BIT9) /*!< Write protection of page 36 to 39 */ 64 #define FLASH_WRP_PAGE_40_43 ((uint32_t)BIT10) /*!< Write protection of page 40 to 43 */ 65 #define FLASH_WRP_PAGE_44_47 ((uint32_t)BIT11) /*!< Write protection of page 44 to 47 */ 66 #define FLASH_WRP_PAGE_48_51 ((uint32_t)BIT12) /*!< Write protection of page 48 to 51 */ 67 #define FLASH_WRP_PAGE_52_55 ((uint32_t)BIT13) /*!< Write protection of page 52 to 55 */ 68 #define FLASH_WRP_PAGE_56_59 ((uint32_t)BIT14) /*!< Write protection of page 56 to 59 */ 69 #define FLASH_WRP_PAGE_60_63 ((uint32_t)BIT15) /*!< Write protection of page 60 to 63 */ 70 #define FLASH_WRP_PAGE_64_67 ((uint32_t)BIT16) /*!< Write protection of page 64 to 67 */ 71 #define FLASH_WRP_PAGE_68_71 ((uint32_t)BIT17) /*!< Write protection of page 68 to 71 */ 72 #define FLASH_WRP_PAGE_72_75 ((uint32_t)BIT18) /*!< Write protection of page 72 to 75 */ 73 #define FLASH_WRP_PAGE_76_79 ((uint32_t)BIT19) /*!< Write protection of page 76 to 79 */ 74 #define FLASH_WRP_PAGE_80_83 ((uint32_t)BIT20) /*!< Write protection of page 80 to 83 */ 75 #define FLASH_WRP_PAGE_84_87 ((uint32_t)BIT21) /*!< Write protection of page 84 to 87 */ 76 #define FLASH_WRP_PAGE_88_91 ((uint32_t)BIT22) /*!< Write protection of page 88 to 91 */ 77 #define FLASH_WRP_PAGE_92_95 ((uint32_t)BIT23) /*!< Write protection of page 92 to 95 */ 78 #define FLASH_WRP_PAGE_96_99 ((uint32_t)BIT24) /*!< Write protection of page 96 to 99 */ 79 #define FLASH_WRP_PAGE_100_103 ((uint32_t)BIT25) /*!< Write protection of page 100 to 103 */ 80 #define FLASH_WRP_PAGE_104_107 ((uint32_t)BIT26) /*!< Write protection of page 104 to 107 */ 81 #define FLASH_WRP_PAGE_108_111 ((uint32_t)BIT27) /*!< Write protection of page 108 to 111 */ 82 #define FLASH_WRP_PAGE_112_115 ((uint32_t)BIT28) /*!< Write protection of page 112 to 115 */ 83 #define FLASH_WRP_PAGE_116_119 ((uint32_t)BIT29) /*!< Write protection of page 116 to 119 */ 84 #define FLASH_WRP_PAGE_120_123 ((uint32_t)BIT30) /*!< Write protection of page 120 to 123 */ 85 #define FLASH_WRP_PAGE_124_127 ((uint32_t)BIT31) /*!< Write protection of page 124 to 127 */ 86 87 /* Values only for APM32 High-density devices */ 88 #define FLASH_WRP_PAGE_0_1 ((uint32_t)BIT0) /*!< Write protection of page 0 to 1 */ 89 #define FLASH_WRP_PAGE_2_3 ((uint32_t)BIT1) /*!< Write protection of page 2 to 3 */ 90 #define FLASH_WRP_PAGE_4_5 ((uint32_t)BIT2) /*!< Write protection of page 4 to 5 */ 91 #define FLASH_WRP_PAGE_6_7 ((uint32_t)BIT3) /*!< Write protection of page 6 to 7 */ 92 #define FLASH_WRP_PAGE_8_9 ((uint32_t)BIT4) /*!< Write protection of page 8 to 9 */ 93 #define FLASH_WRP_PAGE_10_11 ((uint32_t)BIT5) /*!< Write protection of page 10 to 11 */ 94 #define FLASH_WRP_PAGE_12_13 ((uint32_t)BIT6) /*!< Write protection of page 12 to 13 */ 95 #define FLASH_WRP_PAGE_14_15 ((uint32_t)BIT7) /*!< Write protection of page 14 to 15 */ 96 #define FLASH_WRP_PAGE_16_17 ((uint32_t)BIT8) /*!< Write protection of page 16 to 17 */ 97 #define FLASH_WRP_PAGE_18_19 ((uint32_t)BIT9) /*!< Write protection of page 18 to 19 */ 98 #define FLASH_WRP_PAGE_20_21 ((uint32_t)BIT10) /*!< Write protection of page 20 to 21 */ 99 #define FLASH_WRP_PAGE_22_23 ((uint32_t)BIT11) /*!< Write protection of page 22 to 23 */ 100 #define FLASH_WRP_PAGE_24_25 ((uint32_t)BIT12) /*!< Write protection of page 24 to 25 */ 101 #define FLASH_WRP_PAGE_26_27 ((uint32_t)BIT13) /*!< Write protection of page 26 to 27 */ 102 #define FLASH_WRP_PAGE_28_29 ((uint32_t)BIT14) /*!< Write protection of page 28 to 29 */ 103 #define FLASH_WRP_PAGE_30_31 ((uint32_t)BIT15) /*!< Write protection of page 30 to 31 */ 104 #define FLASH_WRP_PAGE_32_33 ((uint32_t)BIT16) /*!< Write protection of page 32 to 33 */ 105 #define FLASH_WRP_PAGE_34_35 ((uint32_t)BIT17) /*!< Write protection of page 34 to 35 */ 106 #define FLASH_WRP_PAGE_36_37 ((uint32_t)BIT18) /*!< Write protection of page 36 to 37 */ 107 #define FLASH_WRP_PAGE_38_39 ((uint32_t)BIT19) /*!< Write protection of page 38 to 39 */ 108 #define FLASH_WRP_PAGE_40_41 ((uint32_t)BIT20) /*!< Write protection of page 40 to 41 */ 109 #define FLASH_WRP_PAGE_42_43 ((uint32_t)BIT21) /*!< Write protection of page 42 to 43 */ 110 #define FLASH_WRP_PAGE_44_45 ((uint32_t)BIT22) /*!< Write protection of page 44 to 45 */ 111 #define FLASH_WRP_PAGE_46_47 ((uint32_t)BIT23) /*!< Write protection of page 46 to 47 */ 112 #define FLASH_WRP_PAGE_48_49 ((uint32_t)BIT24) /*!< Write protection of page 48 to 49 */ 113 #define FLASH_WRP_PAGE_50_51 ((uint32_t)BIT25) /*!< Write protection of page 50 to 51 */ 114 #define FLASH_WRP_PAGE_52_53 ((uint32_t)BIT26) /*!< Write protection of page 52 to 53 */ 115 #define FLASH_WRP_PAGE_54_55 ((uint32_t)BIT27) /*!< Write protection of page 54 to 55 */ 116 #define FLASH_WRP_PAGE_56_57 ((uint32_t)BIT28) /*!< Write protection of page 56 to 57 */ 117 #define FLASH_WRP_PAGE_58_59 ((uint32_t)BIT29) /*!< Write protection of page 58 to 59 */ 118 #define FLASH_WRP_PAGE_60_61 ((uint32_t)BIT30) /*!< Write protection of page 60 to 61 */ 119 #define FLASH_WRP_PAGE_62_127 ((uint32_t)BIT31) /*!< Write protection of page 62 to 127 */ 120 #define FMC_WRP_PAGE_ALL ((uint32_t)0xFFFFFFFF) /*!< Write protection of page all */ 121 122 /**@} end of group FMC_Macros*/ 123 124 /** @defgroup FMC_Enumerations Enumerations 125 @{ 126 */ 127 128 /** 129 * @brief Flash Latency 130 */ 131 typedef enum 132 { 133 FMC_LATENCY_0, 134 FMC_LATENCY_1, 135 FMC_LATENCY_2 136 } FMC_LATENCY_T; 137 138 /** 139 * @brief FMC Status 140 */ 141 typedef enum 142 { 143 FMC_STATUS_BUSY = 1, /*!< flash busy */ 144 FMC_STATUS_ERROR_PG, /*!< flash programming error */ 145 FMC_STATUS_ERROR_WRP, /*!< flash write protection error */ 146 FMC_STATUS_COMPLETE, /*!< flash operation complete */ 147 FMC_STATUS_TIMEOUT /*!< flash time out */ 148 } FMC_STATUS_T; 149 150 /** 151 * @brief Option Bytes IWatchdog 152 */ 153 typedef enum 154 { 155 OB_IWDT_HARD = 0x0000, 156 OB_IWDT_SOTF = 0x0001 157 } OB_IWDT_T; 158 159 /** 160 * @brief Option Bytes nRST STOP 161 */ 162 typedef enum 163 { 164 OB_STOP_RST = 0x0000, 165 OB_STOP_NORST = 0x0002 166 } OB_STOP_T; 167 168 /** 169 * @brief Option Bytes nRST STDBY 170 */ 171 typedef enum 172 { 173 OB_STDBY_RST = 0x0000, 174 OB_STDBY_NORST = 0x0004 175 } OB_STDBY_T; 176 177 /** 178 * @brief FMC Interrupts 179 */ 180 typedef enum 181 { 182 FMC_INT_ERR, 183 FMC_INT_OC 184 } FMC_INT_T; 185 186 /** 187 * @brief FMC flag 188 */ 189 typedef enum 190 { 191 FMC_FLAG_BUSY = 0x00000001, /*!< FMC Busy flag */ 192 FMC_FLAG_OC = 0x00000020, /*!< FMC End of Operation flag */ 193 FMC_FLAG_PE = 0x00000004, /*!< FMC Program error flag */ 194 FMC_FLAG_WPE = 0x00000010, /*!< FMC Write protected error flag */ 195 FMC_FLAG_OBE = 0x10000001, /*!< FMC Option Byte error flag */ 196 } FMC_FLAG_T; 197 198 /**@} end of group FMC_Enumerations*/ 199 200 /** @defgroup FMC_Structures Structures 201 @{ 202 */ 203 204 /** 205 * @brief User Option byte config struct definition 206 */ 207 typedef struct 208 { 209 OB_IWDT_T iwdtSet; 210 OB_STOP_T stopSet; 211 OB_STDBY_T stdbySet; 212 } FMC_UserConfig_T; 213 214 /**@} end of group FMC_Structure*/ 215 216 /** @defgroup FMC_Functions Functions 217 @{ 218 */ 219 220 /* Initialization and Configuration */ 221 void FMC_ConfigLatency(FMC_LATENCY_T latency); 222 void FMC_EnableHalfCycleAccess(void); 223 void FMC_DisableHalfCycleAccess(void); 224 void FMC_EnablePrefetchBuffer(void); 225 void FMC_DisablePrefetchBuffer(void); 226 227 /* Lock management */ 228 void FMC_Unlock(void); 229 void FMC_Lock(void); 230 231 /* Erase management */ 232 FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr); 233 FMC_STATUS_T FMC_EraseAllPage(void); 234 FMC_STATUS_T FMC_EraseOptionBytes(void); 235 236 /* Read Write management */ 237 FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data); 238 FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data); 239 FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data); 240 FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page); 241 FMC_STATUS_T FMC_EnableReadOutProtection(void); 242 FMC_STATUS_T FMC_DisableReadOutProtection(void); 243 FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig); 244 uint32_t FMC_ReadUserOptionByte(void); 245 uint32_t FMC_ReadOptionByteWriteProtection(void); 246 uint8_t FMC_GetReadProtectionStatus(void); 247 uint8_t FMC_ReadPrefetchBufferStatus(void); 248 249 /* Interrupts and flags */ 250 void FMC_EnableInterrupt(FMC_INT_T interrupt); 251 void FMC_DisableInterrupt(FMC_INT_T interrupt); 252 uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag); 253 void FMC_ClearStatusFlag(uint32_t flag); 254 255 /* Status management */ 256 FMC_STATUS_T FMC_ReadStatus(void); 257 FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut); 258 259 /**@} end of group FMC_Functions*/ 260 /**@} end of group FMC_Driver*/ 261 /**@} end of group APM32F10x_StdPeriphDriver*/ 262 263 #ifdef __cplusplus 264 } 265 #endif 266 267 #endif /* __APM32F10X_FMC_H */ 268