hpdell 发表于 2017-12-8 11:27:13

关于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);
}











shanji 发表于 2017-12-8 11:48:11

你的程序是1MB flash的。照着改下就是了。

hpdell 发表于 2017-12-8 14:07:20

本帖最后由 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, &sectornb) != HAL_OK)
      return (1);
}
else
{
    return (1);
}

return (0);
}

无薪税绵 发表于 2018-3-2 14:34:17

#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, &sectornb) != HAL_OK)
              return (1);
        }
        else
        {
            return (1);
        }
        return (0);
}
页: [1]
查看完整版本: 关于stm32f777单片机的 flash 读写扇区问题 ?