diff --git a/modbus/modbus_flash.c b/modbus/modbus_flash.c new file mode 100644 index 0000000..2b6a6ec --- /dev/null +++ b/modbus/modbus_flash.c @@ -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); +} + diff --git a/modbus/modbus_flash.h b/modbus/modbus_flash.h new file mode 100644 index 0000000..7d66948 --- /dev/null +++ b/modbus/modbus_flash.h @@ -0,0 +1,18 @@ +#ifndef __MODBUS_FLASH_H +#define __MODBUS_FLASH_H + +/*写入FLASH中的Sector 11*/ +/*FLASH地址每+1,代表1字节*/ + +/*Sector 11起始地址*/ +#define MODBUS_FLASH_BASE 0x080E0000UL +/*Sector 11编号*/ +#define MODBUS_FLASH_SECTOR FLASH_Sector_11 +/*线圈数据起始地址*/ +#define MODBUS_FLASH_COIL_ADDR MODBUS_FLASH_BASE +/*寄存器数据起始地址*/ +#define MODBUS_FLASH_REG_ADDR (MODBUS_FLASH_BASE + 0x4E2UL) /*0x4E2 = K1250*/ + + + +#endif