三、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. }
|