G32R430 Device Driver Layer v1.0.4
G32R4xx Device Driver Layer API Reference
g32r4xx_ddl_flash.c
Go to the documentation of this file.
1
42
43 #if defined(USE_FULL_DDL_DRIVER)
44
45/* Includes ------------------------------------------------------------------*/
46#include "g32r4xx_ddl_flash.h"
47#include "g32r4xx_ddl_rcm.h"
48
49#ifdef USE_FULL_ASSERT
50 #include "g32_assert.h"
51#else
52 #define ASSERT_PARAM(_PARAM_) ((void)0U)
53#endif
54
58#if defined (FLASH)
59
63
64/* Private typedef -----------------------------------------------------------*/
65/* Private define ------------------------------------------------------------*/
69#define DDL_FLASH_TIMEOUT_VALUE 500000U
70
71#define IS_DDL_FLASH_ERASE_TYPE(__REG_ERASE_TYPE__) \
72 (((__REG_ERASE_TYPE__) == FLASH_DDL_CHIP_ERASE_TYPE_SECTOR) \
73 || ((__REG_ERASE_TYPE__) == FLASH_DDL_CHIP_ERASE_TYPE_BLOCK) \
74 || ((__REG_ERASE_TYPE__) == FLASH_DDL_CHIP_ERASE_TYPE_MAIN) \
75 )
76
77#define IS_DDL_FLASH_MAIN_BASE_ADDRESS(__BASE_ADDRESS__) \
78 (((__BASE_ADDRESS__ >= 0x08000000UL) && (__BASE_ADDRESS__ <= 0x0801FFFFUL)) ? 1UL : 0UL)
79
80#define IS_DDL_FLASH_SYSINFO_BASE_ADDRESS(__BASE_ADDRESS__) \
81 (((__BASE_ADDRESS__ >= 0x08020000UL) && (__BASE_ADDRESS__ <= 0x080203FFUL)) ? 1UL : 0UL)
82
83#define IS_DDL_FLASH_READ_PROTECTION_LEVEL(__LEVEL__) \
84 (((__LEVEL__) == DDL_FLASH_READ_PROTECTION_LEVEL_0) \
85 || ((__LEVEL__) == DDL_FLASH_READ_PROTECTION_LEVEL_1) \
86 || ((__LEVEL__) == DDL_FLASH_READ_PROTECTION_LEVEL_2) \
87 )
88
89#define IS_DDL_FLASH_IWDT_SOFTWARE_ENABLE(__SOFTWARE_ENABLE__) \
90 (((__SOFTWARE_ENABLE__) == DDL_FLASH_IWDT_ENABLE_HARDWARE) \
91 || ((__SOFTWARE_ENABLE__) == DDL_FLASH_IWDT_ENABLE_SOFTWARE) \
92 )
93
94#define IS_DDL_FLASH_WWDT_SOFTWARE_ENABLE(__SOFTWARE_ENABLE__) \
95 (((__SOFTWARE_ENABLE__) == DDL_FLASH_WWDT_ENABLE_HARDWARE) \
96 || ((__SOFTWARE_ENABLE__) == DDL_FLASH_WWDT_ENABLE_SOFTWARE) \
97 )
98
99#define IS_DDL_FLASH_WRITE_PROTECTION(__WRITE_PROTECTION__) \
100 (((__WRITE_PROTECTION__) == DDL_FLASH_WRITE_PROTECTION_DISABLE) \
101 || ((__WRITE_PROTECTION__) == DDL_FLASH_WRITE_PROTECTION_ENABLE) \
102 )
103
104#define IS_DDL_FLASH_NMI_ENABLE(__NMIEN__) \
105 (((__NMIEN__) == DDL_FLASH_NMI_DISABLE) \
106 || ((__NMIEN__) == DDL_FLASH_NMI_ENABLE) \
107 )
108
109#define IS_DDL_FLASH_ADC_TRIM(__TRIM__) \
110 (((__TRIM__) == DDL_FLASH_ADC_TRIM_SOFTWARE) \
111 || ((__TRIM__) == DDL_FLASH_ADC_TRIM_HARDWARE) \
112 )
113
114#define IS_DDL_FLASH_WRITE_PROTECTION_SECTORS(__SECTORS__) \
115 (((__SECTORS__) == DDL_FLASH_SECTOR_NONE) \
116 || ((__SECTORS__) == DDL_FLASH_SECTOR_0_31) \
117 || ((__SECTORS__) == DDL_FLASH_SECTOR_32_63) \
118 || ((__SECTORS__) == DDL_FLASH_SECTOR_64_95) \
119 || ((__SECTORS__) == DDL_FLASH_SECTOR_96_127) \
120 || ((__SECTORS__) == DDL_FLASH_SECTOR_128_159) \
121 || ((__SECTORS__) == DDL_FLASH_SECTOR_160_191) \
122 || ((__SECTORS__) == DDL_FLASH_SECTOR_192_223) \
123 || ((__SECTORS__) == DDL_FLASH_SECTOR_224_255) \
124 )
125
126
130/* Private macro -------------------------------------------------------------*/
131/* Private variables ---------------------------------------------------------*/
132/* Private function prototypes -----------------------------------------------*/
133
134/* Exported functions --------------------------------------------------------*/
138
152ErrorStatus DDL_FLASH_EraseMain(uint32_t type, uint32_t baseAddr)
153{
154 volatile uint32_t timeout = DDL_FLASH_TIMEOUT_VALUE;
155 ErrorStatus status = SUCCESS;
156
157 /* Check the parameters */
160
161 /* Check the FLASH_SR->BUSY bit to confirm that the last programming operation has ended. */
162 if (DDL_FLASH_IsActiveFlag_BUSY() != RESET)
163 {
164 status = ERROR;
165 return status;
166 }
167
168 /* Check FLASH_SR->MAINUNLOCK is 1. */
170 {
171 status = ERROR;
172 return status;
173 }
174
175 /* Set the erasure type of flash. */
177
178 /* Set the EREQ bit of FLASH_CR to 1. */
180
181 /* Write 0xA5A5 to baseAddr. */
182 __DDL_FLASH_WRITE_TO_ADDRESS(baseAddr, 0xA5A5);
183
184 /* Wait for the FLASH_SR->BSY bit to be cleared. */
185 timeout = DDL_FLASH_TIMEOUT_VALUE;
186 while(DDL_FLASH_IsActiveFlag_BUSY() != RESET)
187 {
188 if (timeout-- == 0)
189 {
190 status = ERROR;
191 return status;
192 }
193 }
194
195 /* Wait for the erasing to be completed. */
196 timeout = DDL_FLASH_TIMEOUT_VALUE;
197 while(DDL_FLASH_IsActiveFlag_ERD() == RESET)
198 {
199 if (timeout-- == 0)
200 {
201 status = ERROR;
202 return status;
203 }
204 }
205
206 /* Clear the erase completion flag. */
208
209 if (DDL_FLASH_IsActiveFlag_WADRERR() != RESET)
210 {
211 status = ERROR;
212 }
213
214 if (DDL_FLASH_IsActiveFlag_WRPRTERR() != RESET)
215 {
216 status = ERROR;
217 }
218
219 return status;
220}
221
229void DDL_FLASH_ReadData(uint32_t baseAddr, uint32_t *data, uint32_t length)
230{
231 for (uint32_t i = 0; i < length; i++)
232 {
233 data[i] = *((uint32_t *)(baseAddr + i * sizeof(uint32_t)));
234 }
235}
236
244void DDL_FLASH_WriteData(uint32_t baseAddr, uint32_t *data, uint32_t length)
245{
246 for (uint32_t i = 0; i < length; i++)
247 {
248 *((uint32_t *)(baseAddr + i * sizeof(uint32_t))) = data[i];
249 }
250}
251
259{
264 FLASH_OPT_InitStruct->nmiEnable = DDL_FLASH_NMI_DISABLE;
265 FLASH_OPT_InitStruct->adcTrim = DDL_FLASH_ADC_TRIM_SOFTWARE;
266 FLASH_OPT_InitStruct->writeProtectionSectors = DDL_FLASH_SECTOR_NONE;
267 FLASH_OPT_InitStruct->bootAddr = 0x4000;
268}
269
279{
280 volatile uint32_t timeout = DDL_FLASH_TIMEOUT_VALUE;
281 ErrorStatus status = SUCCESS;
282
283 /* Check the parameters */
288 ASSERT_PARAM(IS_DDL_FLASH_NMI_ENABLE(FLASH_OPT_InitStruct->nmiEnable));
289 ASSERT_PARAM(IS_DDL_FLASH_ADC_TRIM(FLASH_OPT_InitStruct->adcTrim));
291
292 /* Read RDP from NVR1 region at 0x1FFF0000. */
293 (void)*((volatile uint32_t *)0x1FFF0000U);
294 __DMB();
295
296 /* Check the FLASH_SR->BUSY bit to confirm that the last programming operation has ended. */
297 if (DDL_FLASH_IsActiveFlag_BUSY() != RESET)
298 {
299 status = ERROR;
300 return status;
301 }
302
303 /* Check FLASH_SR->OPUNLOCK is 1. */
304 if (DDL_FLASH_IsActiveFlag_OPUNLOCK() == RESET)
305 {
306 status = ERROR;
307 return status;
308 }
309
310 /* Fill data to register OBCR1. */
311 MODIFY_REG(FLASH->OBCR1,
312 FLASH_OBCR1_RDPWBF \
313 | FLASH_OBCR1_IWDTSWBF \
314 | FLASH_OBCR1_WWDTSWBF \
315 | FLASH_OBCR1_WLOCKENBF \
316 | FLASH_OBCR1_NMIDISWBF \
317 | FLASH_OBCR1_ADTSLOADWBF \
318 | FLASH_OBCR1_WLOCKBF ,
319 FLASH_OPT_InitStruct->readProtectionLevel \
320 | FLASH_OPT_InitStruct->iwdtSoftwareEnable \
321 | FLASH_OPT_InitStruct->wwdtSoftwareEnable \
322 | FLASH_OPT_InitStruct->writeProtectionEnable \
323 | FLASH_OPT_InitStruct->adcTrim \
324 | FLASH_OPT_InitStruct->nmiEnable \
325 | (~FLASH_OPT_InitStruct->writeProtectionSectors) & 0xFF0000);
326
327 /* Checking the validity of the data. */
328 uint32_t actualAddr = DDL_FLASH_GetBootAddrTransferActualAddress();
329
330 if (__DDL_FLASH_IS_VALID_BOOT_ADDRESS(actualAddr) == RESET)
331 {
332 status = ERROR;
333 return status;
334 }
335
336 /* If the data is valid, fill the data into the register. */
337 MODIFY_REG(FLASH->OBCR2, FLASH_OBCR2_BOOTADDRBF, FLASH_OPT_InitStruct->bootAddr);
338
340
341 /* Wait for the FLASH_SR->BSY bit to be cleared. */
342 timeout = DDL_FLASH_TIMEOUT_VALUE;
343 while(DDL_FLASH_IsActiveFlag_BUSY() != RESET)
344 {
345 if (timeout-- == 0)
346 {
347 status = ERROR;
348 return status;
349 }
350 }
351
352 /* Wait for the programing to be completed. */
353 timeout = DDL_FLASH_TIMEOUT_VALUE;
354 while(DDL_FLASH_IsActiveFlag_OPBPRD() == RESET)
355 {
356 if (timeout-- == 0)
357 {
358 status = ERROR;
359 return status;
360 }
361 }
362
363 /* Re-power on or write 1 to opreload, FLS_OBSR1/1 status updates. */
365
366 return status;
367}
368
380ErrorStatus DDL_FLASH_MainProgram(uint32_t baseAddr, uint32_t *data, uint32_t numWords)
381{
382 volatile uint32_t timeout = DDL_FLASH_TIMEOUT_VALUE;
383 ErrorStatus status = SUCCESS;
384
385 /* Check the FLASH_SR->BUSY bit to confirm that the last programming operation has ended. */
386 if (DDL_FLASH_IsActiveFlag_BUSY() != RESET)
387 {
388 status = ERROR;
389 return status;
390 }
391
392 /* Write data to Flash */
393 for (uint32_t i = 0; i < numWords; i++)
394 {
395 /* Check FLASH_SR->MAINUNLOCK is 1. */
397 {
398 status = ERROR;
399 return status;
400 }
401
402 /* Set the PREQ bit of FLASH_CR to 1. */
404
405 *((uint32_t*)(baseAddr + i * sizeof(uint32_t))) = data[i];
406 /* Wait for the FLASH_SR->BSY bit to be cleared. */
407 timeout = DDL_FLASH_TIMEOUT_VALUE;
408 while(DDL_FLASH_IsActiveFlag_BUSY() != RESET)
409 {
410 if (timeout-- == 0)
411 {
412 status = ERROR;
413 return status;
414 }
415 }
416
417 /* Wait for the programing to be completed. */
418 timeout = DDL_FLASH_TIMEOUT_VALUE;
419 while(DDL_FLASH_IsActiveFlag_PRD() == RESET)
420 {
421 if (timeout-- == 0)
422 {
423 status = ERROR;
424 return status;
425 }
426 }
427
429 }
430
431
432 if (DDL_FLASH_IsActiveFlag_WADRERR() != RESET)
433 {
434 status = ERROR;
435 return status;
436 }
437
438 if (DDL_FLASH_IsActiveFlag_WRPRTERR() != RESET)
439 {
440 status = ERROR;
441 return status;
442 }
443 return status;
444}
445
449
450#endif
451
455
459
460
461#endif
G32 assert template file. This file should be copied to the application folder and renamed to g32_ass...
#define ASSERT_PARAM(_PARAM_)
Definition g32_assert.h:58
Header file of FLASH DDL module.
Header file of RCM DDL module.
#define DDL_FLASH_IWDT_ENABLE_SOFTWARE
#define DDL_FLASH_READ_PROTECTION_LEVEL_1
#define DDL_FLASH_SECTOR_NONE
#define DDL_FLASH_WRITE_PROTECTION_DISABLE
#define DDL_FLASH_WWDT_ENABLE_SOFTWARE
#define DDL_FLASH_NMI_DISABLE
#define DDL_FLASH_ADC_TRIM_SOFTWARE
__STATIC_INLINE void DDL_FLASH_SetErasureType(uint32_t type)
Types of chip erasure configuration.
__STATIC_INLINE void DDL_FLASH_EnableErasure(void)
Start erasure.
__STATIC_INLINE uint32_t DDL_FLASH_GetBootAddrTransferActualAddress(void)
Retrieve the data in the BOOTADDR option byte, which corresponds to the converted address.
__STATIC_INLINE void DDL_FLASH_OptionByteForcedUpdate(void)
Forced update of the options byte.
__STATIC_INLINE void DDL_FLASH_OptionByteUpdate(void)
Byte programming options.
__STATIC_INLINE void DDL_FLASH_EnableProgram(void)
Start program.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_PRD(void)
Programming completed flag.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_OPBPRD(void)
The optionbyte programming completion flag.
__STATIC_INLINE void DDL_FLASH_ClearFlag_PRD(void)
Clear programming completed flag.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_MAINUNLOCK(void)
Locking flag for main area.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_WRPRTERR(void)
Write protection error flag.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_ERD(void)
Erase completed flag.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_OPUNLOCK(void)
Locking flag for option byte area.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_BUSY(void)
FLASH erasing busy flag.
__STATIC_INLINE uint32_t DDL_FLASH_IsActiveFlag_WADRERR(void)
Incorrect address write flag.
__STATIC_INLINE void DDL_FLASH_ClearFlag_ERD(void)
Clear erase completed flag.
ErrorStatus DDL_FLASH_EraseMain(uint32_t type, uint32_t baseAddr)
Erase the main area of the flash.
void DDL_FLASH_ReadData(uint32_t baseAddr, uint32_t *data, uint32_t length)
Erase the systemInfo area of the flash.
ErrorStatus DDL_FLASH_MainProgram(uint32_t baseAddr, uint32_t *data, uint32_t numWords)
Program the systemInfo area of the flash.
void DDL_FLASH_WriteData(uint32_t baseAddr, uint32_t *data, uint32_t length)
Erase the systemInfo area of the flash.
void DDL_FLASH_OPT_StructInit(DDL_FLASH_OPT_InitTypeDef *FLASH_OPT_InitStruct)
Set each DDL_FLASH_OPT_InitTypeDef field to default value.
ErrorStatus DDL_FLASH_OptionByteProgram(DDL_FLASH_OPT_InitTypeDef *FLASH_OPT_InitStruct)
Flash option byte programming.
#define IS_DDL_FLASH_READ_PROTECTION_LEVEL(__LEVEL__)
#define IS_DDL_FLASH_WRITE_PROTECTION_SECTORS(__SECTORS__)
#define IS_DDL_FLASH_ADC_TRIM(__TRIM__)
#define IS_DDL_FLASH_IWDT_SOFTWARE_ENABLE(__SOFTWARE_ENABLE__)
#define IS_DDL_FLASH_WWDT_SOFTWARE_ENABLE(__SOFTWARE_ENABLE__)
#define DDL_FLASH_TIMEOUT_VALUE
#define IS_DDL_FLASH_MAIN_BASE_ADDRESS(__BASE_ADDRESS__)
#define IS_DDL_FLASH_NMI_ENABLE(__NMIEN__)
#define IS_DDL_FLASH_WRITE_PROTECTION(__WRITE_PROTECTION__)
#define IS_DDL_FLASH_ERASE_TYPE(__REG_ERASE_TYPE__)
#define __DDL_FLASH_WRITE_TO_ADDRESS(__ADDR__, __DATA__)
#define __DDL_FLASH_IS_VALID_BOOT_ADDRESS(__TRNS_BOOT_ADDR__)
Flash Options Byte Structure definition.