|
|
|
@@ -0,0 +1,75 @@ |
|
|
|
#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); |
|
|
|
} |
|
|
|
|