你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm32f777单片机的 flash 读写扇区问题 ?

[复制链接]
hpdell 提问时间:2017-12-8 11:27 /
本帖最后由 hpdell 于 2017-12-8 14:43 编辑

关于stm32f777单片机的 flash 读写扇区问题 ?

这个单片机是 2MB的 flash

资料显示如下 (256bit):

stm32f777-flash-1.png

资料显示(128bit)如下:

stm32f777-flash-128-1.png

stm32f777-flash-128-2.png


程序内部宏定义如下:
stm32f777-flash-2.png

程序内部怎么就定义了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);
}











收藏 1 评论3 发布时间:2017-12-8 11:27

举报

3个回答
shanji 回答时间:2017-12-8 11:48:11
你的程序是1MB flash的。照着改下就是了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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 [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, &sectornb) != HAL_OK)
      return (1);
  }
  else
  {
    return (1);
  }

  return (0);
}

无薪税绵 回答时间:2018-3-2 14:34:17
  1. #define USER_FLASH_LAST_PAGE_ADDRESS  0x080C0000
  2. //表示允许用户写入的最大地址为 0x080C0000 ,也就是最大只能到 FLASH_SECTOR_9。

  3. //从地址0X08000000到0X08FFFFFF共分12个区,
  4. //第0到第3分区的每个区大小是16K,
  5. //第4分区为64K,
  6. //从第5到第11分区都是128K。


  7. int8_t FLASH_If_Erase(uint32_t StartSector)
  8. {
  9.           uint32_t FlashAddress;

  10.           FlashAddress = StartSector;

  11.           if (FlashAddress <= (uint32_t) USER_FLASH_LAST_PAGE_ADDRESS)
  12.           {
  13.             FLASH_EraseInitTypeDef FLASH_EraseInitStruct;
  14.             uint32_t sectornb = 0;

  15.             FLASH_EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;                        //定义删除类型为块
  16.             FLASH_EraseInitStruct.Sector = FLASH_SECTOR_5;                      // stm32f777BIt6 单片机是2MBflash大小
  17.                 //代表你要擦除的FLASH分区,想擦哪一块,后面的数字就填几
  18.                                                                             //前面的128KB留给bootloader使用,所以
  19.                                                                             //此处是扇区5开始
  20.                                  // 总扇区数目 #define FLASH_SECTOR_TOTAL  24  在stm32f777xx.h 里面有定义
  21.             FLASH_EraseInitStruct.NbSectors = FLASH_SECTOR_23 - FLASH_SECTOR_5 + 1;  //19;        //设置删除的数据

  22.             FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
  23. //这个参数VoltageRange_3代表你以什么为单位进行擦除。
  24. //VoltageRange_1代表以字节(8bit)为单位进行擦除、
  25. //VoltageRange_1代表以半字(16bit)为单位进行擦除、
  26. //VoltageRange_3代表以字(32bit)为单位进行擦除、
  27. //VoltageRange_4代表以双字(64bit)为单位进行擦除。

  28.             if (HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, &sectornb) != HAL_OK)
  29.               return (1);
  30.           }
  31.           else
  32.           {
  33.             return (1);
  34.           }
  35.         return (0);
  36. }
复制代码

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版