From 30303d366d1a0d857357c90bed876686f2d1e603 Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期二, 18 十一月 2025 19:44:21 +0800
Subject: [PATCH] 添加新的文件
---
STM32H743/HAL/MCUFlash.c | 197 ++++++++++++++++++++++++++++--------------------
1 files changed, 115 insertions(+), 82 deletions(-)
diff --git a/STM32H743/HAL/MCUFlash.c b/STM32H743/HAL/MCUFlash.c
index b832678..834f679 100644
--- a/STM32H743/HAL/MCUFlash.c
+++ b/STM32H743/HAL/MCUFlash.c
@@ -1,7 +1,7 @@
/*******************************************************************************
* File Name : MCUFlash.c
- * Description : STM32H743 Flash操作驱动
- * Created on : 2018年5月29日
+ * Description : STM32H743 Flash锟斤拷锟斤拷锟斤拷锟斤拷
+ * Created on : 2018锟斤拷5锟斤拷29锟斤拷
* Author : HIDO
*******************************************************************************/
@@ -14,18 +14,18 @@
/*******************************************************************************
* Macro *
*******************************************************************************/
-/* STM32H743的Flash相关信息 - 修正为2MB版本 */
+/* STM32H743锟斤拷Flash锟斤拷锟斤拷锟较� - 锟斤拷锟斤拷为2MB锟芥本 */
#define FLASH_BANK1_START 0x08000000U
#define FLASH_BANK1_END 0x080FFFFFU
#define FLASH_BANK2_START 0x08100000U
#define FLASH_BANK2_END 0x081FFFFFU
-/* STM32H743 扇区大小定义 */
+/* STM32H743 锟斤拷锟斤拷锟斤拷小锟斤拷锟斤拷 */
#define FLASH_SECTOR_0_3_SIZE (128 * 1024) /* 128 KB */
#define FLASH_SECTOR_4_7_SIZE (128 * 1024) /* 128 KB */
#define FLASH_SECTOR_8_15_SIZE (128 * 1024) /* 128 KB */
-/* Bank 1 扇区边界地址 */
+/* Bank 1 锟斤拷锟斤拷锟竭斤拷锟街� */
#define FLASH_SECTOR0_END (FLASH_BANK1_START + 0x1FFFF)
#define FLASH_SECTOR1_END (FLASH_SECTOR0_END + 0x20000)
#define FLASH_SECTOR2_END (FLASH_SECTOR1_END + 0x20000)
@@ -35,7 +35,7 @@
#define FLASH_SECTOR6_END (FLASH_SECTOR5_END + 0x20000)
#define FLASH_SECTOR7_END (FLASH_SECTOR6_END + 0x20000)
-/* Bank 2 扇区边界地址 */
+/* Bank 2 锟斤拷锟斤拷锟竭斤拷锟街� */
#define FLASH_SECTOR8_END (FLASH_BANK2_START + 0x1FFFF)
#define FLASH_SECTOR9_END (FLASH_SECTOR8_END + 0x20000)
#define FLASH_SECTOR10_END (FLASH_SECTOR9_END + 0x20000)
@@ -65,10 +65,10 @@
/*******************************************************************************
* Function Name : GetFlashBankFromAddress
- * Description : 根据地址获取Flash Bank
- * Input : address - 地址
- * Output : 无
- * Return : Flash Bank编号 (FLASH_BANK_1 或 FLASH_BANK_2), 0表示无效地址
+ * Description : 锟斤拷锟捷碉拷址锟斤拷取Flash Bank
+ * Input : address - 锟斤拷址
+ * Output : 锟斤拷
+ * Return : Flash Bank锟斤拷锟� (FLASH_BANK_1 锟斤拷 FLASH_BANK_2), 0锟斤拷示锟斤拷效锟斤拷址
*******************************************************************************/
static uint32_t GetFlashBankFromAddress(uint32_t address)
{
@@ -88,10 +88,10 @@
/*******************************************************************************
* Function Name : GetFlashSectorFromAddress
- * Description : 根据地址计算扇区编号
- * Input : address - 地址
- * Output : 无
- * Return : 扇区编号 (0-15), 0xFFFFFFFF表示无效地址
+ * Description : 锟斤拷锟捷碉拷址锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟�
+ * Input : address - 锟斤拷址
+ * Output : 锟斤拷
+ * Return : 锟斤拷锟斤拷锟斤拷锟� (0-15), 0xFFFFFFFF锟斤拷示锟斤拷效锟斤拷址
*******************************************************************************/
static uint32_t GetFlashSectorFromAddress(uint32_t address)
{
@@ -104,7 +104,7 @@
if (bank == FLASH_BANK_1)
{
- /* Bank 1 扇区 0-7 */
+ /* Bank 1 锟斤拷锟斤拷 0-7 */
if (address <= FLASH_SECTOR0_END)
return FLASH_SECTOR_0;
else if (address <= FLASH_SECTOR1_END)
@@ -125,7 +125,7 @@
else
{
#if 0
- /* Bank 2 扇区 8-15 */
+ /* Bank 2 锟斤拷锟斤拷 8-15 */
if (address <= FLASH_SECTOR8_END)
return FLASH_SECTOR_8;
else if (address <= FLASH_SECTOR9_END)
@@ -154,16 +154,16 @@
/*******************************************************************************
* Function Name : MCUFlash_Init
- * Description : Flash初始化
- * Input : 无
- * Output : 无
- * Return : HIDO_OK - 成功, HIDO_ERR - 失败
+ * Description : Flash锟斤拷始锟斤拷
+ * Input : 锟斤拷
+ * Output : 锟斤拷
+ * Return : HIDO_OK - 锟缴癸拷, HIDO_ERR - 失锟斤拷
* Author : HIDO
- * Modified Date: : 2018年5月29日
+ * Modified Date: : 2018锟斤拷5锟斤拷29锟斤拷
*******************************************************************************/
HIDO_INT32 MCUFlash_Init(void)
{
- /* 解锁Flash */
+ /* 锟斤拷锟斤拷Flash */
if (HAL_FLASH_Unlock() != HAL_OK)
{
return HIDO_ERR;
@@ -174,14 +174,14 @@
/*******************************************************************************
* Function Name : MCUFlash_DeInit
- * Description : Flash反初始化
- * Input : 无
- * Output : 无
- * Return : HIDO_OK - 成功, HIDO_ERR - 失败
+ * Description : Flash锟斤拷锟斤拷始锟斤拷
+ * Input : 锟斤拷
+ * Output : 锟斤拷
+ * Return : HIDO_OK - 锟缴癸拷, HIDO_ERR - 失锟斤拷
*******************************************************************************/
HIDO_INT32 MCUFlash_DeInit(void)
{
- /* 锁定Flash */
+ /* 锟斤拷锟斤拷Flash */
if (HAL_FLASH_Lock() != HAL_OK)
{
return HIDO_ERR;
@@ -192,13 +192,13 @@
/*******************************************************************************
* Function Name : MCUFlash_Erase
- * Description : Flash擦除
- * Input : _u32EraseAddr - 擦除起始地址
- * : _u32EraseLen - 擦除长度
- * Output : 无
- * Return : HIDO_OK - 成功, HIDO_ERR - 失败
+ * Description : Flash锟斤拷锟斤拷
+ * Input : _u32EraseAddr - 锟斤拷锟斤拷锟斤拷始锟斤拷址
+ * : _u32EraseLen - 锟斤拷锟斤拷锟斤拷锟斤拷
+ * Output : 锟斤拷
+ * Return : HIDO_OK - 锟缴癸拷, HIDO_ERR - 失锟斤拷
* Author : HIDO
- * Modified Date: : 2018年5月29日
+ * Modified Date: : 2018锟斤拷5锟斤拷29锟斤拷
*******************************************************************************/
HIDO_INT32 MCUFlash_Erase(HIDO_UINT32 _u32EraseAddr, HIDO_UINT32 _u32EraseLen)
{
@@ -207,17 +207,17 @@
uint32_t u32StartSector, u32EndSector;
uint32_t u32CurrentAddr;
- /* 清除Flash标志 */
+ /* 锟斤拷锟紽lash锟斤拷志 */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS_BANK1);
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS_BANK2);
- /* 地址范围检查 */
+ /* 锟斤拷址锟斤拷围锟斤拷锟� */
if (_u32EraseAddr < FLASH_BANK1_START || _u32EraseAddr > FLASH_BANK2_END)
{
return HIDO_ERR;
}
- /* 获取起始扇区和结束扇区 */
+ /* 锟斤拷取锟斤拷始锟斤拷锟斤拷锟酵斤拷锟斤拷锟斤拷锟斤拷 */
u32StartSector = GetFlashSectorFromAddress(_u32EraseAddr);
u32CurrentAddr = _u32EraseAddr + _u32EraseLen - 1;
if (u32CurrentAddr > FLASH_BANK2_END)
@@ -231,14 +231,14 @@
return HIDO_ERR;
}
- /* 配置擦除参数 */
+ /* 锟斤拷锟矫诧拷锟斤拷锟斤拷锟斤拷 */
stEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
stEraseInit.Banks = GetFlashBankFromAddress(_u32EraseAddr);
stEraseInit.Sector = u32StartSector;
stEraseInit.NbSectors = u32EndSector - u32StartSector + 1;
- stEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3; /* STM32H7需要设置电压范围 */
+ stEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3; /* STM32H7锟斤拷要锟斤拷锟矫碉拷压锟斤拷围 */
- /* 执行擦除操作 */
+ /* 执锟叫诧拷锟斤拷锟斤拷锟斤拷 */
if (HAL_FLASHEx_Erase(&stEraseInit, &u32SectorError) != HAL_OK)
{
return HIDO_ERR;
@@ -249,55 +249,88 @@
/*******************************************************************************
* Function Name : MCUFlash_Write
- * Description : Flash写入
- * Input : _u32WriteAddr - 写入地址
- * : _pu8WriteData - 写入数据指针
- * : _u32WriteLen - 写入数据长度
- * Output : 无
- * Return : HIDO_OK - 成功, HIDO_ERR - 失败
+ * Description : Flash写锟斤拷
+ * Input : _u32WriteAddr - 写锟斤拷锟街�
+ * : _pu8WriteData - 写锟斤拷锟斤拷锟斤拷指锟斤拷
+ * : _u32WriteLen - 写锟斤拷锟斤拷锟捷筹拷锟斤拷
+ * Output : 锟斤拷
+ * Return : HIDO_OK - 锟缴癸拷, HIDO_ERR - 失锟斤拷
* Author : HIDO
- * Modified Date: : 2018年5月29日
+ * Modified Date: : 2018锟斤拷5锟斤拷29锟斤拷
*******************************************************************************/
HIDO_INT32 MCUFlash_Write(HIDO_UINT32 _u32WriteAddr, HIDO_UINT8 *_pu8WriteData, HIDO_UINT32 _u32WriteLen)
{
- HIDO_UINT32 i = 0;
- uint32_t u32TmpValue = 0;
+ /* 瀹夊叏鐗堟湰锛氫互 Flash Word (璁惧 256bit/32Byte) 涓哄崟浣嶅啓鍏ャ��
+ * 1. 鍦板潃蹇呴』 32 瀛楄妭瀵归綈
+ * 2. 鍐欏叆闀垮害鍙互涓嶆槸 32 鐨勫�嶆暟锛屾湯灏捐嚜鍔� 0xFF 濉厖
+ * 3. 姣忎釜 Flash Word 鍐欎箣鍓嶆鏌ユ槸鍚﹀凡鎿﹂櫎 (鍏ㄩ儴 0xFF)锛屽惁鍒欐姤閿�
+ * 4. 浣跨敤 HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr, buffer32B)
+ * 5. 涓嶅湪姝ゅ嚱鏁颁腑鍋� Unlock/Lock锛屼繚鎸佷笌鍘熷 Init/DeInit 琛屼负涓�鑷�
+ */
- /* 地址对齐检查 - STM32H7推荐8字节对齐 */
- if (_u32WriteAddr % 4 != 0)
+#ifndef MCU_FLASH_WORD_BYTES
+/* 閽堝 STM32H743/H74x/H75x 璁惧 Flash Word = 256bit = 32 瀛楄妭
+ * 鑻ュ悗缁Щ妞嶅埌 H7Ax/Bx (128bit)锛屽彲鍦ㄧ紪璇戝櫒瀹忎腑閲嶅畾涔変负 16 */
+#define MCU_FLASH_WORD_BYTES 32U
+#endif
+
+ if (_pu8WriteData == NULL || _u32WriteLen == 0)
{
return HIDO_ERR;
}
- /* STM32H7推荐使用64位编程 */
- while (_u32WriteLen >= 4)
+ /* 鍦板潃杈圭晫涓庡榻愭牎楠� */
+ if (_u32WriteAddr < FLASH_BANK1_START || _u32WriteAddr > FLASH_BANK2_END)
{
- /* 直接使用64位数据 */
- u32TmpValue = *(uint32_t *)_pu8WriteData;
-
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, _u32WriteAddr, (uint32_t)&u32TmpValue) != HAL_OK)
- {
- return HIDO_ERR;
- }
-
- _u32WriteAddr += 4;
- _pu8WriteData += 4;
- _u32WriteLen -= 4;
+ return HIDO_ERR;
+ }
+ if ((_u32WriteAddr % MCU_FLASH_WORD_BYTES) != 0)
+ {
+ return HIDO_ERR; /* 闇�瑕� 32 瀛楄妭瀵归綈 */
}
- /* 处理剩余数据(少于8字节) */
- if (_u32WriteLen > 0)
+ HIDO_UINT32 remaining = _u32WriteLen;
+ HIDO_UINT32 addr = _u32WriteAddr;
+ HIDO_UINT8 const *src = _pu8WriteData;
+ HIDO_UINT8 wordBuf[MCU_FLASH_WORD_BYTES];
+
+ while (remaining > 0)
{
- u32TmpValue = 0xFFFFFFFF;
- for (i = 0; i < _u32WriteLen; i++)
+ /* 鏈鍐欏叆闀垮害锛堜笉瓒呰繃涓�涓� Flash Word锛� */
+ HIDO_UINT32 chunk = (remaining >= MCU_FLASH_WORD_BYTES) ? MCU_FLASH_WORD_BYTES : remaining;
+
+ /* 鍑嗗缂撳啿鍖猴細澶嶅埗鏁版嵁骞跺鏈熬濉厖 0xFF */
+ for (HIDO_UINT32 i = 0; i < MCU_FLASH_WORD_BYTES; i++)
{
- ((HIDO_UINT8 *)&u32TmpValue)[i] = _pu8WriteData[i];
+ if (i < chunk)
+ {
+ wordBuf[i] = src[i];
+ }
+ else
+ {
+ wordBuf[i] = 0xFF; /* 濉厖鏈娇鐢ㄥ瓧鑺傦紝淇濊瘉浣嶄粎鍚� 1->0 杞崲 */
+ }
}
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, _u32WriteAddr, (uint32_t)&u32TmpValue) != HAL_OK)
+ /* 宸叉摝闄ゆ牎楠岋細褰撳墠 Flash 涓 32 瀛楄妭蹇呴』鍏ㄤ负 0xFF */
+ for (HIDO_UINT32 i = 0; i < MCU_FLASH_WORD_BYTES; i++)
+ {
+ if (*(volatile HIDO_UINT8 *)(addr + i) != 0xFF)
+ {
+ return HIDO_ERR; /* 鏈摝闄ゆ垨鑴忔暟鎹紝闇�鍏堣皟鐢� MCUFlash_Erase */
+ }
+ }
+
+ /* 缂栫▼锛欻AL_FLASH_Program 浼氭寜璁惧 flash word 绮掑害鍐欏叆 */
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr, (uint32_t)wordBuf) != HAL_OK)
{
return HIDO_ERR;
}
+
+ /* 鍓嶈繘 */
+ remaining -= chunk;
+ src += chunk;
+ addr += MCU_FLASH_WORD_BYTES;
}
return HIDO_OK;
@@ -305,24 +338,24 @@
/*******************************************************************************
* Function Name : MCUFlash_Read
- * Description : Flash读取
- * Input : _u32ReadAddr - 读取地址
- * : _pu8ReadData - 读取数据缓冲区
- * : _u32ReadLen - 读取数据长度
- * Output : 无
- * Return : HIDO_OK - 成功, HIDO_ERR - 失败
+ * Description : Flash锟斤拷取
+ * Input : _u32ReadAddr - 锟斤拷取锟斤拷址
+ * : _pu8ReadData - 锟斤拷取锟斤拷锟捷伙拷锟斤拷锟斤拷
+ * : _u32ReadLen - 锟斤拷取锟斤拷锟捷筹拷锟斤拷
+ * Output : 锟斤拷
+ * Return : HIDO_OK - 锟缴癸拷, HIDO_ERR - 失锟斤拷
*******************************************************************************/
HIDO_INT32 MCUFlash_Read(HIDO_UINT32 _u32ReadAddr, HIDO_UINT8 *_pu8ReadData, HIDO_UINT32 _u32ReadLen)
{
HIDO_UINT32 i;
- /* 地址范围检查 */
+ /* 锟斤拷址锟斤拷围锟斤拷锟� */
if (_u32ReadAddr < FLASH_BANK1_START || (_u32ReadAddr + _u32ReadLen) > (FLASH_BANK2_END + 1))
{
return HIDO_ERR;
}
- /* 直接内存读取 */
+ /* 直锟斤拷锟节达拷锟饺� */
for (i = 0; i < _u32ReadLen; i++)
{
_pu8ReadData[i] = *(volatile HIDO_UINT8 *)(_u32ReadAddr + i);
@@ -333,11 +366,11 @@
/*******************************************************************************
* Function Name : MCUFlash_GetSectorInfo
- * Description : 获取扇区信息
- * Input : address - 地址
- * Output : pBank - 存储Bank信息
- * : pSector - 存储扇区信息
- * Return : HIDO_OK - 成功, HIDO_ERR - 失败
+ * Description : 锟斤拷取锟斤拷锟斤拷锟斤拷息
+ * Input : address - 锟斤拷址
+ * Output : pBank - 锟芥储Bank锟斤拷息
+ * : pSector - 锟芥储锟斤拷锟斤拷锟斤拷息
+ * Return : HIDO_OK - 锟缴癸拷, HIDO_ERR - 失锟斤拷
*******************************************************************************/
HIDO_INT32 MCUFlash_GetSectorInfo(HIDO_UINT32 address, uint32_t *pBank, uint32_t *pSector)
{
--
Gitblit v1.9.3