三、Flash 操作
NV32F100x 的 Flash 寿命为:擦/写各两万次
Flash 相关操作须放入 RAM 中执行
在执行 FLASH 相关操作执行时,需要关总中断以防中断打断造成系统紊乱
建议用附件中的 flash.c 和 flash.h 进行替换
对 Flash_Program1LongWord 进行修改,添加 14 和 18 行指令
1. __ramfunc uint16_t Flash_Program1LongWord(uint32_t wNVMTargetAddress, uint32_t dwData)
2. {
3. uint16_t err = FLASH_ERR_SUCCESS;
4.
5. //判断是否为字对齐
6. if(wNVMTargetAddress & 0x03)
7. {
8. err = FLASH_ERR_INVALID_PARAM;
9. return (err);
10. }
11. // 清除错误标志
12. EFMCMD = FLASH_CMD_CLEAR;
13. //写入数据到对应的地址中
14. DisableInterrupts;
15. M32(wNVMTargetAddress) = dwData;
16. //加载编程命令
17. EFM_LaunchCMD(FLASH_CMD_PROGRAM);
18. EnableInterrupts;
19. return (err);//返回状态
20. }
对 Flash_Program2LongWords 进行修改,添加 13、16、20 和 23 行指令
1. __ramfunc uint16_t Flash_Program2LongWords(uint32_t wNVMTargetAddress, uint32_t dwData0, uint32_t dwData1)
2. {
3. uint16_t err = FLASH_ERR_SUCCESS;
4.
5. //判断是否为字对齐
6. if(wNVMTargetAddress & 0x03)
7. {
8. err = FLASH_ERR_INVALID_PARAM;
9. return (err);
10. }
11. // 清除错误标志
12. EFMCMD = FLASH_CMD_CLEAR;
13. DisableInterrupts;
14. M32(wNVMTargetAddress) = dwData0;//存放数据到以目标地址为起始的 4 个字节的空间中
15. EFM_LaunchCMD(FLASH_CMD_PROGRAM);//0x20000000,加载编程命令
16. EnableInterrupts;
17. wNVMTargetAddress = wNVMTargetAddress +4;//地址是字对齐的,地址向后移一个字
18.
19. EFMCMD = FLASH_CMD_CLEAR;
20. DisableInterrupts;
21. M32(wNVMTargetAddress) = dwData1;//第二个数据放入处理后的地址的 4 个字节的空间中
22. EFM_LaunchCMD(FLASH_CMD_PROGRAM);//加载编程命令
23. EnableInterrupts;
24. return (err);//返回处理状态
25. }
模拟 eeprom 控件的字节写函数修改(eeprom.c)
1. uint16_t EEPROM_WriteByte(uint32_t adr, uint8_t Data)
2. {
3. uint32_t err = EEPROM_ERR_SUCCESS;
4. uint32_t data_mask;
5. uint32_t r_data;
6. uint32_t data_m0;
7. uint32_t data_m1;
8. uint32_t word_adr = adr &0x3fc;
9. uint32_t b_sit= adr & 0x3;
10.
11. //先让高位为 FF
12. data_m0 = Data << b_sit*8;
13. data_mask = 0xFFFFFFFF<<(b_sit+1)*8;
14. //然后让低位为 FF
15. data_m1 = 0xFFFFFFFF >> (32-b_sit*8);
16. data_m1 = data_m1 | data_m0 | data_mask ;
17. r_data = EEPROM_Read(word_adr);
18. r_data |= 0xFF<< b_sit*8;
19. data_m1 = data_m1 & r_data;
20.
21. err = EEPROM_Write(word_adr , data_m1);
22.
23. return(err);
24. }
|