嵌入式技术论坛
直播中

訾存贵

7年用户 920经验值
私信 关注
[问答]

FAL stm32片上flash数据结构大小是多少?

stm32片上flash数据结构

const struct fal_flash_dev stm32f2_onchip_flash ={
.name = "stm32_onchip",
.addr = 0x08000000,
.len = 10241024,
.blk_size = 128
1024,
.ops = {init, read, write, erase}, .write_gran = 8};
.blk_size = 128 × 1024:Flash 块/扇区大小(因为 STM32F2 各块大小不均匀,所以擦除粒度为最大块的大小:128K)
这儿的blksize到底填2048还是填128 × 1024如此大的数,有些blog说是这儿是最小擦除单位,填2048或者4096.

回帖(6)

李鑫

2023-4-17 14:18:57
看你具体擦除的地方块大小是多少,就是起始地址那里到size结束,block是多少就是多少。
举报

訾存贵

2023-4-17 14:19:10
意思是说整片片上flash的大小吗,但是这个名字是blocksize,是每个块的大小啊,按理说每块大小应该是2048或者4096字节才合理,一般spiflash才有block的参数,片上flash按芯片参考手册上都是按page和bank来划分区域,没有block这个参数。

  
举报

李鑫

2023-4-17 14:19:17
学会融会贯通,每家芯片叫法可能不一样,一般是page大小。
举报

訾存贵

2023-4-17 14:19:29
主要是stm32片上flash没有block这个概念,只有page的概念,这儿就按页大小填写?
举报

杨帆

2023-4-17 14:19:44
rtt驱动是这样分块定义的
#if defined(RT_USING_FAL)
static int fal_flash_read_16k(long offset, rt_uint8_t *buf, size_t size);
static int fal_flash_read_64k(long offset, rt_uint8_t *buf, size_t size);
static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size);
static int fal_flash_write_16k(long offset, const rt_uint8_t *buf, size_t size);
static int fal_flash_write_64k(long offset, const rt_uint8_t *buf, size_t size);
static int fal_flash_write_128k(long offset, const rt_uint8_t *buf, size_t size);
static int fal_flash_erase_16k(long offset, size_t size);
static int fal_flash_erase_64k(long offset, size_t size);
static int fal_flash_erase_128k(long offset, size_t size);
const struct fal_flash_dev stm32_onchip_flash_16k = { "onchip_flash_16k", STM32_FLASH_START_ADRESS_16K, FLASH_SIZE_GRANULARITY_16K, (16 * 1024), {NULL, fal_flash_read_16k, fal_flash_write_16k, fal_flash_erase_16k} };
const struct fal_flash_dev stm32_onchip_flash_64k = { "onchip_flash_64k", STM32_FLASH_START_ADRESS_64K, FLASH_SIZE_GRANULARITY_64K, (64 * 1024), {NULL, fal_flash_read_64k, fal_flash_write_64k, fal_flash_erase_64k} };
const struct fal_flash_dev stm32_onchip_flash_128k = { "onchip_flash_128k", STM32_FLASH_START_ADRESS_128K, FLASH_SIZE_GRANULARITY_128K, (128 * 1024), {NULL, fal_flash_read_128k, fal_flash_write_128k, fal_flash_erase_128k} };
static int fal_flash_read_16k(long offset, rt_uint8_t *buf, size_t size)
{
    return stm32_flash_read(stm32_onchip_flash_16k.addr + offset, buf, size);
}
static int fal_flash_read_64k(long offset, rt_uint8_t *buf, size_t size)
{
    return stm32_flash_read(stm32_onchip_flash_64k.addr + offset, buf, size);
}
static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size)
{
    return stm32_flash_read(stm32_onchip_flash_128k.addr + offset, buf, size);
}
static int fal_flash_write_16k(long offset, const rt_uint8_t *buf, size_t size)
{
    return stm32_flash_write(stm32_onchip_flash_16k.addr + offset, buf, size);
}
static int fal_flash_write_64k(long offset, const rt_uint8_t *buf, size_t size)
{
    return stm32_flash_write(stm32_onchip_flash_64k.addr + offset, buf, size);
}
static int fal_flash_write_128k(long offset, const rt_uint8_t *buf, size_t size)
{
    return stm32_flash_write(stm32_onchip_flash_128k.addr + offset, buf, size);
}
static int fal_flash_erase_16k(long offset, size_t size)
{
    return stm32_flash_erase(stm32_onchip_flash_16k.addr + offset, size);
}
static int fal_flash_erase_64k(long offset, size_t size)
{
    return stm32_flash_erase(stm32_onchip_flash_64k.addr + offset, size);
}
static int fal_flash_erase_128k(long offset, size_t size)
{
    return stm32_flash_erase(stm32_onchip_flash_128k.addr + offset, size);
}
#endif
#endif /* BSP_USING_ON_CHIP_FLASH */
举报

李俊

2023-4-17 14:19:57
fal_rtt.c中,对blk_size的处理如下:

blk_dev->fal_part = fal_part;
blk_dev->geometry.bytes_per_sector = fal_flash->blk_size;
blk_dev->geometry.block_size = fal_flash->blk_size;
blk_dev->geometry.sector_count = fal_part->len / fal_flash->blk_size;
内部按字节来计算的。有些Blog说填128,应该是说错了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分