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

关于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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版