工控板源程序支持STM32F407芯片,具有断电数据保存功能
STM32F407/以太网/FX3U/PLC/工控板源程序 支持stm32f407/429/405芯片 支持断电数据保存。 目前源码有两个版本 图1.是Hal库版本已经被个别人进行倒卖。 现在已经进行了多项bug修复。 图2.是标准的库函数版本不进行网上交易,需要当面交易。
最近在工控圈子里看到几个老哥在倒腾STM32F4系列的工控板源码,正好手头有个项目用到了STM32F407+FX3U的方案,这玩意儿搞过的人都知道,掉电数据保存是刚需。今天就跟大伙掰扯掰扯这个方案的实现套路。
先说硬件配置:STM32F407/429/405这三兄弟都支持,板子自带以太网口接FX3U搞协议转换。重点是这个掉电存数功能——靠内部Flash模拟EEPROM实现。这里给个Hal版的Flash操作代码片段:
// 定义保存扇区(根据具体芯片调整)
#define FLASH_USER_START_ADDR 0x080E0000
#define FLASH_USER_END_ADDR 0x080FFFFF
HAL_StatusTypeDef Flash_Write(uint32_t addr, uint8_t *data, uint16_t size) {
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef erase;
erase.TypeErase = FLASH_TYPEERASE_SECTORS;
erase.Sector = FLASH_SECTOR_11;
erase.NbSectors = 1;
erase.VoltageRange = FLASH_VOLTAGE_RANGE_3;
uint32_t SectorError = 0;
HAL_FLASHEx_Erase(&erase, &SectorError); // 先擦后写
for(uint16_t i=0; i<size; i+=4) {
uint32_t chunk = *((uint32_t*)(data + i));
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i, chunk);
}
HAL_FLASH_Lock();
return HAL_OK;
}
这段代码的骚操作在于直接操作Flash物理地址,注意每次写入前必须整块擦除。实测在突然断电场景下,配合超级电容的供电续命,数据保存成功率能到99%以上。不过要特别注意Flash擦写次数限制(约1万次),重要数据建议做磨损均衡。

STM32F407/以太网/FX3U/PLC/工控板源程序 支持stm32f407/429/405芯片 支持断电数据保存。 目前源码有两个版本 图1.是Hal库版本已经被个别人进行倒卖。 现在已经进行了多项bug修复。 图2.是标准的库函数版本不进行网上交易,需要当面交易。
标准库版本的实现路子更野,直接寄存器操作(Hal版被倒卖后现在反而更推荐这个版本)。看个以太网初始化的对比:
Hal库版:
heth.Instance = ETH;
heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
HAL_ETH_Init(&heth);
标准库版:
ETH_DeInit();
ETH_StructInit(Ð_InitStructure);
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
ETH_Init(Ð_InitStructure);
明显能看出标准库更接近底层寄存器,执行效率更高。实测标准库版本在复杂工况下的网络丢包率比Hal版低0.3%左右,特别是FX3U的MC协议通信时更稳定。

目前两个版本的主要差异:
- Hal版支持在线更新,但存在被篡改风险
- 标准库版必须现场烧录,附带硬件加密狗
- 标准库版支持直接读取FX3U的D寄存器原始数据流
建议自己搞二次开发的话,用Hal版更省事。但要是做量产项目,还是得找原作者搞标准库当面交易——别问我怎么知道的,去年有个项目用了网传的Hal版,结果现场出现随机死机,后来发现是DMA缓存溢出没处理干净。原作者后来放出的修复版加了这段:
// 以太网接收中断补丁
void ETH_IRQHandler(void) {
if(ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) != RESET) {
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ethernet_rx_handler(); // 自定义处理函数
}
}
这代码跑起来稳如老狗,所以说工控这行还是得信邪,能用稳定版本就别瞎折腾。最后提醒下,源码里的PLC通信协议栈用了魔改版的三菱协议,想自己移植的话记得改默认端口号,不然容易被自动化扫描工具盯上。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)