关于stm32f777单片机的 flash 读写扇区问题 ?
本帖最后由 hpdell 于 2017-12-8 14:43 编辑关于stm32f777单片机的 flash 读写扇区问题 ?
这个单片机是 2MB的 flash
资料显示如下 (256bit):
资料显示(128bit)如下:
程序内部宏定义如下:
程序内部怎么就定义了8个,而实际中,资料是12个扇区,在进行读写时,该如何搞啊 ?
但是擦除函数是如下:
#define USER_FLASH_LAST_PAGE_ADDRESS0x080C0000
int8_t FLASH_If_Erase(uint32_t StartSector)
{
uint32_t FlashAddress;
FlashAddress = StartSector;
/* Device voltage range supposed to be , 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);
}
你的程序是1MB flash的。照着改下就是了。 本帖最后由 hpdell 于 2017-12-8 14:40 编辑
shanji 发表于 2017-12-8 11:48
你的程序是1MB flash的。照着改下就是了。
我的 flash 是 2MB的,修改如下
按照 128bit 的进行读写
int8_t FLASH_If_Erase(uint32_t StartSector)
{
uint32_t FlashAddress;
FlashAddress = StartSector;
/* Device voltage range supposed to be , 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_TOTAL24在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);
}
#define USER_FLASH_LAST_PAGE_ADDRESS0x080C0000
//表示允许用户写入的最大地址为 0x080C0000 ,也就是最大只能到 FLASH_SECTOR_9。
//从地址0X08000000到0X08FFFFFF共分12个区,
//第0到第3分区的每个区大小是16K,
//第4分区为64K,
//从第5到第11分区都是128K。
int8_t FLASH_If_Erase(uint32_t StartSector)
{
uint32_t FlashAddress;
FlashAddress = StartSector;
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大小
//代表你要擦除的FLASH分区,想擦哪一块,后面的数字就填几
//前面的128KB留给bootloader使用,所以
//此处是扇区5开始
// 总扇区数目 #define FLASH_SECTOR_TOTAL24在stm32f777xx.h 里面有定义
FLASH_EraseInitStruct.NbSectors = FLASH_SECTOR_23 - FLASH_SECTOR_5 + 1;//19; //设置删除的数据
FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
//这个参数VoltageRange_3代表你以什么为单位进行擦除。
//VoltageRange_1代表以字节(8bit)为单位进行擦除、
//VoltageRange_1代表以半字(16bit)为单位进行擦除、
//VoltageRange_3代表以字(32bit)为单位进行擦除、
//VoltageRange_4代表以双字(64bit)为单位进行擦除。
if (HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, §ornb) != HAL_OK)
return (1);
}
else
{
return (1);
}
return (0);
}
页:
[1]