在使用suta功能的时候,flash分布的map图如下
offset#0开始地址在0x0000
AN-B-001 Header(spi)数据分布如下 8个字节大小
#Image#0 Bootloader 开始地址 0x0008 开始
offset#1 开始地址在0x8000
offset#2 开始地址在0x13000
Last section 开始地址为0x1f000
AN-B-001Header+Image 0 (bootloader )大小为 0x8000 = 32kb
Header#1+Image 1大小为 0x13000 -0x8000 = 44kb
Header#2+Image 2大小为 0x1f000 -0x13000 = 48kb
Lastsection 大小为4kb (最小单位扇区)
44+48+4+32=128kb
所以整体大小最小需要128kb的大小才能实现空中升级等功能
flash 0x0000 --0x1ffff 的空间是放程序用的地方
0x20000之后的地址就是可以随便存储东西了
接下来来分析往SPI-flash写数据操作
图片中 自定义flash大小 为我们使用的flash的型号以及大小等等参数 根据自己使用来变化
#include "flash.h"
#define SECTION_ADDRESS 80 //这个扇区的地址必须大于128kb 原因上面写了
void flash_spi_init(void)
{
SPI_Pad_t cs_pad_param = { GPIO_PORT_0,GPIO_PIN_3 };
spi_init(&cs_pad_param, SPI_MODE_8BIT, SPI_ROLE_MASTER,SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);
//初始化flash
spi_flash_init(W25Q40_FLASH_SIZE,W25Q40_FLASH_PAGE_SIZE);
}
uint8_treadbuf[100]={0};
void Flash_test(void)
{
uint8_t writebuf[88]={0};
for(uint8_t i=0;i<sizeof(writebuf)/sizeof(uint8_t);i++)
{
writebuf[i]= i ;
}
//spi_flash_sector_earse
spi_flash_release_from_power_down();
spi_flash_write_data(writebuf,(uint32_t)((SECTION_ADDRESS)*4096),sizeof(writebuf));
spi_flash_power_down();
spi_flash_release_from_power_down();
spi_flash_read_data(readbuf,(uint32_t)((SECTION_ADDRESS)*4096),sizeof(readbuf));
spi_flash_power_down();
}
#ifndef __FLASH__H
#define __FLASH__H
#include "stdio.h"
#include "spi_flash.h"
void flash_spi_init(void);
void Flash_test(void);
#endif
这里是flash 初始化过程
Flash_test 里面写进去和读出来的数据一样 表示操作flash,ok