#include "stm32f4xx_flash.h" #include "stm32f4xx.h" #include "modbus.h" #include "modbus_flash.h" #include "string.h" extern uint8_t ModbusCoil[1250]; extern uint16_t ModbusReg[10000]; uint8_t ModbusCoilWriteFlash(void) { uint32_t addres = MODBUS_FLASH_COIL_ADDR; uint16_t halfWord; FLASH_Status status; FLASH_Unlock(); /*扇区擦除,写入之前必须先擦除*/ status = FLASH_EraseSector(MODBUS_FLASH_SECTOR, VoltageRange_3); for(uint16_t i = 0; i < 1250; i += 2) { /*前面的放在低字节,后面的放在高字节*/ halfWord = ((uint16_t)ModbusCoil[i + 1] << 8) | ((uint16_t)ModbusCoil[i]); status = FLASH_ProgramHalfWord(addres, ModbusCoil[i]); /*写入失败,停止写入*/ if(status != FLASH_COMPLETE) { break; } addres += 2; } FLASH_Lock(); } uint8_t ModbusRegWriteFlash(void) { uint32_t addres = MODBUS_FLASH_REG_ADDR; FLASH_Status status; FLASH_Unlock(); /*扇区擦除,写入之前必须先擦除*/ status = FLASH_EraseSector(MODBUS_FLASH_SECTOR, VoltageRange_3); for(uint16_t i = 0; i < 10000; i++) { status = FLASH_ProgramHalfWord(addres, ModbusReg[i]); /*写入失败,停止写入*/ if(status != FLASH_COMPLETE) { break; } addres += 2; } FLASH_Lock(); } uint8_t ModbusRegReadFlash(void) { memcpy(ModbusCoil, (const void *)MODBUS_FLASH_COIL_ADDR, 1250); } uint8_t ModbusCoilReadFlash(void) { memcpy(ModbusReg, (const void *)MODBUS_FLASH_REG_ADDR, 10000); }