From 3b89fa7f432d35b371b72193f0381cb1908ae111 Mon Sep 17 00:00:00 2001 From: the_deepest Date: Wed, 29 Jul 2026 20:22:17 +0800 Subject: [PATCH] =?UTF-8?q?FLASH=E8=AF=BB=E5=86=99=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modbus/modbus_flash.c | 75 +++++++++++++++++++++++++++++++++++++++++++ modbus/modbus_flash.h | 18 +++++++++++ 2 files changed, 93 insertions(+) create mode 100644 modbus/modbus_flash.c create mode 100644 modbus/modbus_flash.h 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