- /*
- @hehung
- 2023-6-15
- email: 1398660197@qq.com
- wechat: hehung95
- reproduced and please indicate the source @hehung
- */
- #include "ac780x_eflash.h"
- #include "stdbool.h"
- #include "app_eflash.h"
- #include <stdio.h>
- #define WRITE_LENGTH 16U /*! 写入数据长度,最小写入长度为4字节, 所以WRITE_LENGTH 需要大于等于4 */
- #define DFLASH_PAGE0_ADRESS 0x08020000U /*! Dflash Page0 0x0802_0000 ~ 0x0802_000F size 16B - 2pages */
- #define DFLASH_PAGE2_ADRESS 0x08020010U /*! Dflash Page0 0x0802_0010 ~ 0x0802_001F size 16B - 2pages*/
- #define DFLASH_PAGE255_ADRESS 0x080207F8U /*! Dflash Page0 0x0802_07F8 ~ 0x0802_07FF size 8B */
- uint8_t g_WriteBuff[WRITE_LENGTH] = {0}; /*! 写入数据BUFF */
- uint8_t g_ReadBuff[WRITE_LENGTH] = {0}; /*! 读取数据BUFF */
- static void eflash_DataInit(void)
- {
- uint16_t i = 0;
- for (i = 0; i < WRITE_LENGTH; i++)
- {
- g_WriteBuff[i] = i;
- }
- }
- static void eflash_DFlashAllErase(void)
- {
- EFLASH_UnlockCtrl(); /*! Flash 写入/擦除前需要先解锁 */
- EFLASH_DFMassErase(); /*! D-flash 全片擦除,因为Code 存放在P-flash中, 不建议对P-flash进行全片擦除 */
- if (EFLASH_STATUS_SUCCESS != EFLASH_DFMassEraseVerify()) /*! 验证相应位置是否擦除成功 */
- {
- printf("[LINE %d] ERROR :Erase Dflash failue.\r\n", __LINE__); /*! 若擦除失败,则打印相应错误警告 */
- }
- EFLASH_LockCtrl(); /*! 完成flash操作后重新上锁, 上锁与解锁要配套使用 */
- }
- static void eflash_DFlashPageErase(uint32_t page)
- {
- EFLASH_UnlockCtrl(); /*! Flash 写入/擦除前需要先解锁 */
- EFLASH_PageErase(page); /*! 擦除D-flash page0 */
- // if (EFLASH_STATUS_SUCCESS != EFLASH_PageEraseVerify(page, WRITE_LENGTH / 4U)) /*! 验证相应位置是否擦除成功 */
- // {
- // printf("[LINE %d] ERROR :Erase [0x%08X] failue.\r\n", __LINE__, page); /*! 若擦除失败,则打印相应错误警告 */
- // }
- EFLASH_LockCtrl(); /*! 完成flash操作后重新上锁, 上锁与解锁要配套使用 */
- }
- static void eflash_DFlashPageWrite(uint32_t page)
- {
- uint16_t i = 0;
- EFLASH_UnlockCtrl(); /*! Flash 写入/擦除前需要先解锁 */
- EFLASH_PageProgram(page, (uint32_t*)g_WriteBuff, WRITE_LENGTH / 4); /*! 将数据写入D-Flash, 最小写入单位为4字节 */
- printf("\r\nWrite g_WriteBuff[WRITE_LENGTH] to D-Flash ...\r\n");
- EFLASH_Read(page, (uint32_t*)g_ReadBuff, WRITE_LENGTH / 4); /*! 读取D-Flash数据 */
- printf("Read D-Flash [0x%X] : ", page); /*! 打印相关信息 */
- for (i = 0; i < WRITE_LENGTH; i++)
- {
- printf("%02X ", g_ReadBuff[i]);
- }
- printf("\r\n");
- EFLASH_LockCtrl(); /*! 完成flash操作后重新上锁, 上锁与解锁要配套使用 */
- }
- void eflash_DemoRuning(void)
- {
- eflash_DataInit();
- // 等待输入要写入到DFLASH的数据
- // 擦除全部DFLASH
- eflash_DFlashAllErase();
- printf ("Erase DFlash finished\r\n");
- //写入数据到DFLASH的page0和page1
- eflash_DFlashPageWrite(DFLASH_PAGE0_ADRESS);
- printf ("Write page0 of DFlash finished\r\n");
- eflash_DFlashPageWrite(DFLASH_PAGE2_ADRESS);
- printf ("Write page2 of DFlash finished\r\n");
- // 擦除page0,保留page1
- eflash_DFlashPageErase(DFLASH_PAGE0_ADRESS);
- printf ("Erase page0 of DFlash finished\r\n");
-
- }
4 试验结果
试验结果如下:
1. 进入Debug界面
2. 在两个page写入结束处打上断点,用于观察数据是否写入成功,见下图,可以数据写入成功。
3. 在函数结尾处打一个断点,观察page0是否擦除成功,见下图,page0被擦除,只剩下page1~page3的数据。
4. 下面是串口打印的结果