/**
******************************************************************************
* 文件名程:
* 作 者: liwen
* 版 本: v1.0
* 编写日期: 2019-04-10
* 功 能:
******************************************************************************
*/
#include "FlashOS.h"
/*
*********************************************************************************************************
*********************************************************************************************************
*/
#include "led/bsp_led.h"
#include "MCU_Periphlib.h"
/*
*********************************************************************************************************
*********************************************************************************************************
*/
#include "bsp_dly/bsp.h"
#include "bsp_init.h"
#include "flashaddr.h"
#include "bsp_spi_flash.h"
#include "sys_app.h"
/*
*********************************************************************************************************
*********************************************************************************************************
*/
#define SPI_FLASH_MEM_ADDR 0xC0000000
//
#define DEBUG_BAUD_RATE (921600)
//
/*
*********************************************************************************************************
*********************************************************************************************************
*/
volatile uint8_t aux_buf[FLASH_EARSE_PAGESIZE] __attribute__ ((aligned (32)));
volatile uint8_t aux_buf2[FLASH_EARSE_PAGESIZE] __attribute__ ((aligned (32)));
/*
*********************************************************************************************************
*********************************************************************************************************
*/
void System_User_ParamInit (void)
{
w25qxx_param_init();
}
/*
*********************************************************************************************************
*********************************************************************************************************
*/
void spi_sys_init(void)
{
//
SystemInit();
//参数清空
System_User_ParamInit();
//时钟初始化函数
System_Init();
//获取systick的频率
bsp_Get_SystickParam();
/* 初始化外设 */
bsp_Init();
//
uart_init(400,DEBUG_BAUD_RATE);
//sfud的rtos系统
sfud_set_rtos(1);
//
w25qxx_driver_init();
//led灯初始化
BSP_RTOS_GPIO_Init();
//
BSP_RTOS_Led_On();
//
}
/*
*********************************************************************************************************
* 函 数 名: Init
* 功能说明: Flash编程初始化
* 形 参: adr Flash基地址,芯片首地址。
* clk 时钟频率
* fnc 函数代码,1 - Erase, 2 - Program, 3 - Verify
* 返 回 值: 0 表示成功, 1表示失败
*********************************************************************************************************
*/
int Init (unsigned long adr, unsigned long clk, unsigned long fnc)
{
spi_sys_init();
return 0;
}
/*
*********************************************************************************************************
* 函 数 名: UnInit
* 功能说明: 复位初始化
* 形 参: fnc 函数代码,1 - Erase, 2 - Program, 3 - Verify
* 返 回 值: 0 表示成功, 1表示失败
*********************************************************************************************************
*/
int UnInit (unsigned long fnc)
{
//
spi_sys_init();
//
return (0);
}
/*
*********************************************************************************************************
* 函 数 名: EraseChip
* 功能说明: 整个芯片擦除
* 形 参: 无
* 返 回 值: 0 表示成功, 1表示失败
*********************************************************************************************************
*/
int EraseChip (void)
{
//
spi_sys_init();
//
printf("EraseChip \r\n");
//
w25qxx_chiperase();
return 0;
}
/*
*********************************************************************************************************
* 函 数 名: EraseSector
* 功能说明: 扇区擦除
* 形 参: adr 擦除地址
* 返 回 值: 无
*********************************************************************************************************
*/
int EraseSector (unsigned long adr)
{
//
spi_sys_init();
//
printf("EraseSector adr: %x \r\n",adr);
//
if(adr>=SPI_FLASH_MEM_ADDR)
{
adr -= SPI_FLASH_MEM_ADDR;
w25qxx_sector_erase(adr);
}
return 0;
}
/*
*********************************************************************************************************
* 函 数 名: ProgramPage
* 功能说明: 页编程
* 形 参: adr 页起始地址
* sz 页大小
* buf 要写入的数据地址
* 返 回 值: 无
*********************************************************************************************************
*/
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf)
{
uint32_t result=0;
uint32_t size_shi=0;
uint32_t size_ge=0;
uint32_t i=0;
uint8_t *pbuf=(uint8_t *)buf;
//
spi_sys_init();
//
size_shi=sz/FLASH_EARSE_PAGESIZE;
//
size_ge =sz%FLASH_EARSE_PAGESIZE;
//
usr_printf("ProgramPage adr:0x%x ,sz: %ld ,buf :0x%x \r\n",(uint32_t)adr,sz,(uint32_t)pbuf);
//
if(adr>=SPI_FLASH_MEM_ADDR)
{
if(size_shi>0)
{
for(i=0;i<size_shi;i++)
{
w25qxx_write_buff((pbuf+i*FLASH_EARSE_PAGESIZE),(adr-SPI_FLASH_MEM_ADDR)+i*FLASH_EARSE_PAGESIZE,FLASH_EARSE_PAGESIZE);
}
}
//
if(size_ge>0)
{
w25qxx_write_buff((pbuf+size_shi*FLASH_EARSE_PAGESIZE), (adr-SPI_FLASH_MEM_ADDR)+size_shi*FLASH_EARSE_PAGESIZE, size_ge);
}
//
}
return (0);
}
/*
*********************************************************************************************************
* 函 数 名: Verify
* 功能说明: 校验
* 形 参: adr 起始地址
* sz 数据大小
* buf 要校验的数据缓冲地址
* 返 回 值: -
*********************************************************************************************************
*/
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf)
{
volatile unsigned char *psrc=buf;
volatile unsigned long i;
uint32_t result=0;
uint32_t size_shi=0;
uint32_t size_ge=0;
uint32_t j=0;
uint8_t *pbuf=(uint8_t *)aux_buf;
//
spi_sys_init();
//
size_shi=sz/FLASH_EARSE_PAGESIZE;
//
size_ge =sz%FLASH_EARSE_PAGESIZE;
//
printf("start verify :0x%x ,0x%x,%d ,0x%x\r\n",(uint32_t)adr,(uint32_t)sz,(uint32_t)sz,(uint32_t)buf);
//
if((sz> 0)&&(adr>=SPI_FLASH_MEM_ADDR))
{
//
if(size_shi>0)
{
for(i=0;i<size_shi;i++)
{
//
memset((uint8_t*)pbuf,0,FLASH_EARSE_PAGESIZE);
//
w25qxx_fast_read((pbuf),(adr-SPI_FLASH_MEM_ADDR)+i*FLASH_EARSE_PAGESIZE,FLASH_EARSE_PAGESIZE);
//
for(j = 0; j< FLASH_EARSE_PAGESIZE; j++)
{
if(aux_buf[j] != psrc[j+i*FLASH_EARSE_PAGESIZE])
{
//
usr_printf("erroffset:%d base addr:%x addr:%lx data--read:%x write:%x\r\n",
(uint32_t)(j+i*FLASH_EARSE_PAGESIZE),SPI_FLASH_MEM_ADDR,adr,aux_buf[j],psrc[j+i*FLASH_EARSE_PAGESIZE]);