1 /*!
2  * @file       apm32e10x_fmc.h
3  *
4  * @brief      This file contains all the functions prototypes for the FMC firmware library
5  *
6  * @version     V1.0.2
7  *
8  * @date        2022-12-31
9  *
10  * @attention
11  *
12  *  Copyright (C) 2021-2023 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 __APM32E10X_FMC_H
28 #define __APM32E10X_FMC_H
29 
30 /* Includes */
31 #include "apm32e10x.h"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 /** @addtogroup APM32E10x_StdPeriphDriver
38   @{
39 */
40 
41 /** @addtogroup 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_Structures */
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 APM32E10x_StdPeriphDriver*/
262 
263 #ifdef __cplusplus
264 }
265 #endif
266 
267 #endif /* __APM32E10X_FMC_H */
268