c疯鸟 发表于 2018-12-5 13:36:42

STM32F407ZE有扇区10和11吗

求助,STM32F407ZE与STM32F407ZG按官方给的datasheet一个是512k flash,一个是1M flash,STM32F407ZG的内存范围如下
#define ADDR_FLASH_SECTOR_0             (0x08000000)         // sector016 Kbytes   
#define ADDR_FLASH_SECTOR_1             (0x08004000)         // sector116 Kbytes
#define ADDR_FLASH_SECTOR_2             (0x08008000)         // sector216 Kbytes
#define ADDR_FLASH_SECTOR_3             (0x0800C000)         // sector316 Kbytes
#define ADDR_FLASH_SECTOR_4             (0x08010000)         // sector464 Kbytes
#define ADDR_FLASH_SECTOR_5             (0x08020000)         // sector5128 Kbytes
#define ADDR_FLASH_SECTOR_6             (0x08040000)         // sector6128 Kbytes
#define ADDR_FLASH_SECTOR_7             (0x08060000)         // sector7128 Kbytes
#define ADDR_FLASH_SECTOR_8             (0x08080000)         // sector8128 Kbytes
#define ADDR_FLASH_SECTOR_9             (0x080A0000)         // sector9128 Kbytes
#define ADDR_FLASH_SECTOR_10            (0x080C0000)         // sector10 128 Kbytes
#define ADDR_FLASH_SECTOR_11            (0x080E0000)         // sector11 128 Kbytes
那STM32F407ZE应该是前8个扇区,但是我在不小心将数据写入第10和第11扇区可以正常读写,求大侠指点,STM32F407ZE有扇区10和11吗,如果有是怎么分配地址,如果没有写入的话存储在哪里

c疯鸟 发表于 2018-12-5 13:41:15

附上写入代码
enum bsp_err STM_FLASH_Write(uint32_t WriteAddr, uint32_t *pBuffer, uint32_t NumToWrite)       
{
        uint32_t start_addr;
        uint32_t end_addr;       
   
    uint16_t begin_sec;
    uint16_t end_sec;
   
    FLASH_Status status = FLASH_COMPLETE;
   
    if (   (WriteAddr < STM32_FLASH_BASE)
      || (WriteAddr > STM32_FLASH_END)
      || (WriteAddr % 4 != 0) )
    {
      return BSP_ERR_FLASH_ADDR;        // invalid address
    }
   
        FLASH_Unlock();                                                      
    FLASH_DataCacheCmd(DISABLE);      

    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);   
                                             
        start_addr = WriteAddr;                                           
        end_addr   = WriteAddr + (NumToWrite * 4);          
                                             
    begin_sec = STM_FLASH_GetFlashSector(start_addr);
    end_sec   = STM_FLASH_GetFlashSector(end_addr);
                                    
    while ( begin_sec <= end_sec )                  
    {
      status = FLASH_EraseSector(begin_sec, VoltageRange_3);//VCC=2.7~3.6VÖ®¼ä!!
            
      if ( status != FLASH_COMPLETE )
      {
            FLASH_DataCacheCmd(ENABLE);       
            FLASH_Lock();   
            
            return BSP_ERR_FLASH_ERASE;        // error
      }
      
      if ( begin_sec == FLASH_Sector_11)
      {
            begin_sec += 40;
      }
      else
      {
            begin_sec += 8;
      }
    }

    while ( start_addr < end_addr )   // write data
    {
      if ( FLASH_ProgramWord(start_addr, *pBuffer) != FLASH_COMPLETE )
      {
            FLASH_DataCacheCmd(ENABLE);       
            FLASH_Lock();
            
            return BSP_ERR_FLASH_WRITE;                   
      }
      
      start_addr += 4u;
      pBuffer++;
    }
   
    FLASH_DataCacheCmd(ENABLE);       
        FLASH_Lock();

    return BSP_ERR_OK;
}

andeyqi 发表于 2018-12-5 14:04:57

读出来相应的地址的内容和你写入的是否相同,确认下是否写成功了,怀疑如果没有相应的地址写有可能什么事都没干(个人猜测的)

c疯鸟 发表于 2018-12-5 15:56:05

andeyqi 发表于 2018-12-5 14:04
读出来相应的地址的内容和你写入的是否相同,确认下是否写成功了,怀疑如果没有相应的地址写有可能什么事都 ...

正确的,断电后读取正常

andeyqi 发表于 2018-12-5 15:59:56

c疯鸟 发表于 2018-12-5 15:56
正确的,断电后读取正常

那应该就是有,stm32有个寄存器能从中读出flash有多大,dbug时读下看看是不是1M的。

andeyqi 发表于 2018-12-5 16:21:08

好奇怪啊,按照命名规则应该是没有的啊,应该是512k的。

zengyi703-16313 发表于 2018-12-5 17:03:56

ST的秘密被你发现了,可能出现了stm32f103c8t6和stm32f103cbt6相同的情况

toofree 发表于 2018-12-5 18:21:56

本帖最后由 toofree 于 2018-12-5 18:26 编辑

用某坛友的话说就是,其实流片时都是大容量的,只是出于某种原因,出厂时将产品信息写成了小容量512K的,但是物理上是没有屏蔽掉后512K的。
如果每个型号都流一次片,一次少出也得几十万,那么多系列和型号,ST是扛不住的。因此都按大容量的流片,测试稳定的话,就烧成大容量信息,正常的卖;如果有些缺陷,但是不影响小容量的功能,那么就当小容量的卖;最后剩下的,连小容量的功能也无法满足,就报废。

就当成是将产品按特等、优等、良品、次品、废品分类。

五哥1 发表于 2018-12-5 22:02:55

这个是正确的,我们经常把STM32F103R8当成STM32F103RB来用,因为这些芯片有冗余。但是出了问题,就自己承担 了

c疯鸟 发表于 2018-12-6 11:16:03

:D谢谢,学习了,第一次知道这种情况
页: [1] 2
查看完整版本: STM32F407ZE有扇区10和11吗