Flash: 1 MiB 通过 STM32F769 的手册可以知道,它的 FLASH 大小是 2M,这里 U-Boot 显示为 1M,明显是不对的!关于 FLASH 的初始化可以在文件:drivers\mtd\stm32_flash.c 找到如下接口:
unsigned long flash_init(void) { unsigned long total_size = 0; u8 i, j;
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) { flash_info.flash_id = FLASH_STM32; flash_info.sector_count = CONFIG_SYS_MAX_FLASH_SECT; flash_info.start[0] = CONFIG_SYS_FLASH_BASE + (i << 20); flash_info.size = sect_sz_kb[0]; for (j = 1; j < CONFIG_SYS_MAX_FLASH_SECT; j++) { flash_info.start[j] = flash_info.start[j - 1] + (sect_sz_kb[j - 1]); flash_info.size += sect_sz_kb[j]; } total_size += flash_info.size; }
return total_size; }
其中,宏 CONFIG_SYS_MAX_FLASH_BANKS 很重要。在前面的移植章节我们已经说过,STM32F769 是复用了 STM32F746 的相关文件的。那么,最终我们会在在 include\configs\stm32f746-disco.h 中找到该宏的定义:
对比这个 STM32F769 和 STM32F746 这两个 CPU,STM32F746 只有一个 BANK,但是 STM32F769 却有两个 BANK。那么是不是把他改成 2 就可以了呢?答案是不可以!我们继续分析上面的代码。
我们再看第二个宏值 CONFIG_SYS_MAX_FLASH_SECT,它被定义为 8,接下来的 for 循环就是把这 8 个扇区的大小加起来,每个扇区的值放在了 arch\arm\include\asm\arch-stm32f7\stm32.h 文件中的 sect_sz_kb 变量中,如下所示:
static const u32 sect_sz_kb[CONFIG_SYS_MAX_FLASH_SECT] = {
[0 ... 3] = 32 * 1024,
[4] = 128 * 1024,
[5 ... 7] = 256 * 1024
};
这个就很清楚了,就是 SMT32 的 FLASH 的扇区大小分配。知道了代码的实现,我们再来看看 STM32 手册手册中对于 FLASH 的定义,如下图所示:
通过上面的图我们可以看到,STM32F769 的 FLASH 本身支持单 BANK 和 双 BANK 模式,不过双 BANK 模式,每个扇区的大小与 单 BANK 不一样。默认情况是 单 BANK 模式的。因此,我们最终的处理方案是 CONFIG_SYS_MAX_FLASH_BANKS 保持为 1,把宏 CONFIG_SYS_MAX_FLASH_SECT 改为 12 ,并且必须要修改 sect_sz_kb 。
|