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吗,如果有是怎么分配地址,如果没有写入的话存储在哪里
附上写入代码
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
读出来相应的地址的内容和你写入的是否相同,确认下是否写成功了,怀疑如果没有相应的地址写有可能什么事都 ...
正确的,断电后读取正常 c疯鸟 发表于 2018-12-5 15:56
正确的,断电后读取正常
那应该就是有,stm32有个寄存器能从中读出flash有多大,dbug时读下看看是不是1M的。 好奇怪啊,按照命名规则应该是没有的啊,应该是512k的。
ST的秘密被你发现了,可能出现了stm32f103c8t6和stm32f103cbt6相同的情况
本帖最后由 toofree 于 2018-12-5 18:26 编辑
用某坛友的话说就是,其实流片时都是大容量的,只是出于某种原因,出厂时将产品信息写成了小容量512K的,但是物理上是没有屏蔽掉后512K的。
如果每个型号都流一次片,一次少出也得几十万,那么多系列和型号,ST是扛不住的。因此都按大容量的流片,测试稳定的话,就烧成大容量信息,正常的卖;如果有些缺陷,但是不影响小容量的功能,那么就当小容量的卖;最后剩下的,连小容量的功能也无法满足,就报废。
就当成是将产品按特等、优等、良品、次品、废品分类。
这个是正确的,我们经常把STM32F103R8当成STM32F103RB来用,因为这些芯片有冗余。但是出了问题,就自己承担 了 :D谢谢,学习了,第一次知道这种情况
页:
[1]
2