本帖最后由 hpdell 于 2017-12-8 14:43 编辑 关于stm32f777单片机的 flash 读写扇区问题 ? 这个单片机是 2MB的 flash 资料显示如下 (256bit): 资料显示(128bit)如下: 程序内部宏定义如下: 程序内部怎么就定义了8个,而实际中,资料是12个扇区,在进行读写时,该如何搞啊 ? 但是擦除函数是如下: #define USER_FLASH_LAST_PAGE_ADDRESS 0x080C0000 int8_t FLASH_If_Erase(uint32_t StartSector) { uint32_t FlashAddress; FlashAddress = StartSector; /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ if (FlashAddress <= (uint32_t) USER_FLASH_LAST_PAGE_ADDRESS) // 这个地方为何需要判断 这个 0x080C0000 地址 ?? { FLASH_EraseInitTypeDef FLASH_EraseInitStruct; uint32_t sectornb = 0; FLASH_EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; FLASH_EraseInitStruct.Sector = FLASH_SECTOR_3; // 这个地方实际读写时 貌似也没有搞懂,地址到底是多少啊 ???? FLASH_EraseInitStruct.NbSectors = FLASH_SECTOR_7 - FLASH_SECTOR_3 + 1; // 这个地方怎么 ?? 最大扇区是7,资料实际最大扇区是11 FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; if (HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, §ornb) != HAL_OK) return (1); } else { return (1); } return (0); } |
评分
查看全部评分
我的 flash 是 2MB的,修改如下
按照 128bit 的进行读写
int8_t FLASH_If_Erase(uint32_t StartSector)
{
uint32_t FlashAddress;
FlashAddress = StartSector;
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
be done by word */
if (FlashAddress <= (uint32_t) USER_FLASH_LAST_PAGE_ADDRESS)
{
FLASH_EraseInitTypeDef FLASH_EraseInitStruct;
uint32_t sectornb = 0;
FLASH_EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
FLASH_EraseInitStruct.Sector = FLASH_SECTOR_5; // stm32f777BIt6 单片机是2MBflash大小
//前面的128KB留给bootloader使用,所以
//此处是扇区5开始
// 总扇区数目 #define FLASH_SECTOR_TOTAL 24 在stm32f777xx.h 里面有定义
FLASH_EraseInitStruct.NbSectors = FLASH_SECTOR_23 - FLASH_SECTOR_5 + 1; //19;
FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
if (HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, §ornb) != HAL_OK)
return (1);
}
else
{
return (1);
}
return (0);
}
评分
查看全部评分