2025-12-06 13:49:01 +08:00
|
|
|
|
/*
|
|
|
|
|
|
* spi_flash.c
|
|
|
|
|
|
*
|
|
|
|
|
|
* Created on: May 20, 2025
|
|
|
|
|
|
* Author: cc
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "spi_flash.h"
|
|
|
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t Temp_Flash_Buff[4100]; //FLash д<>뻺<EFBFBD><EBBBBA>BUFF
|
|
|
|
|
|
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void SPI_FLASH_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* SPI Flash <20><> SPI SRAM <20><><EFBFBD><EFBFBD>SPI<50><49><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPI Flash <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
|
|
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"SPI Flash ID:0x%04x\r\n",Flash_ReadID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_ReadSR
|
|
|
|
|
|
* Description : P25Q40H Flash<EFBFBD><EFBFBD>ȡ״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : P25Q40H Flash״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
BIT7 6 5 4 3 2 1 0
|
|
|
|
|
|
SPR0 BP4 BP3 BP2 BP1 BP0 WEL WIP
|
|
|
|
|
|
SPR:Ĭ<EFBFBD><EFBFBD>0,״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>WPʹ<EFBFBD><EFBFBD>
|
|
|
|
|
|
BP4,BP3,BP2,BP1,BP0:FLASH<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
WEL:дʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
BUSY:æ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ(1,æ;0,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
Ĭ<EFBFBD><EFBFBD>:0x00
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) uint8_t Flash_ReadSR(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t byte = 0;
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_ReadStatusReg); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
byte = SPI0_MasterRecvByte();
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
return byte;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_WriteSR
|
|
|
|
|
|
* Description : P25Q40H Flashд״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input :
|
|
|
|
|
|
sr_val:д<EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
BIT7 6 5 4 3 2 1 0
|
|
|
|
|
|
SPR0 BP4 BP3 BP2 BP1 BP0 WEL WIP
|
|
|
|
|
|
|
|
|
|
|
|
ֻ<EFBFBD><EFBFBD>SPR0,BP3,BP2,BP1,BP0(bit 7,5,4,3,2)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д!!!
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_WriteSR(uint8_t sr_val)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_WriteStatusReg);
|
|
|
|
|
|
SPI0_MasterSendByte(sr_val);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Write_Enable
|
|
|
|
|
|
* Description : P25Q40H дʹ<EFBFBD><EFBFBD> -- <EFBFBD><EFBFBD>WEL<EFBFBD><EFBFBD>λ
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Write_Enable(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_WriteEnable);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Write_Disable
|
|
|
|
|
|
* Description : P25Q40H д<EFBFBD><EFBFBD>ֹ -- <EFBFBD><EFBFBD>WEL<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Write_Disable(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_WriteDisable);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_ReadID
|
|
|
|
|
|
* Description : P25Q40H Flash <EFBFBD><EFBFBD>ȡоƬID
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
|
|
|
|
|
|
0x8512:<EFBFBD><EFBFBD>ʾоƬ<EFBFBD>ͺ<EFBFBD>ΪP25Q40H
|
|
|
|
|
|
0x8511:<EFBFBD><EFBFBD>ʾоƬ<EFBFBD>ͺ<EFBFBD>ΪP25Q20H
|
|
|
|
|
|
0x8510:<EFBFBD><EFBFBD>ʾоƬ<EFBFBD>ͺ<EFBFBD>ΪP25Q10H
|
|
|
|
|
|
0x8509:<EFBFBD><EFBFBD>ʾоƬ<EFBFBD>ͺ<EFBFBD>ΪP25Q05H
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) uint16_t Flash_ReadID(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t temp=0;
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_ReadManufactureID);
|
|
|
|
|
|
SPI0_MasterRecvByte();
|
|
|
|
|
|
SPI0_MasterRecvByte();
|
|
|
|
|
|
SPI0_MasterRecvByte();
|
|
|
|
|
|
temp |= SPI0_MasterRecvByte()<<8;
|
|
|
|
|
|
temp |= SPI0_MasterRecvByte();
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Wait_Busy
|
|
|
|
|
|
* Description : <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : 1<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>æ״̬
|
|
|
|
|
|
0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) uint8_t Flash_Wait_Busy(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t temp=0;
|
|
|
|
|
|
uint16_t i=0;
|
|
|
|
|
|
temp = Flash_ReadSR();
|
|
|
|
|
|
while((temp&0x01)==0x01)
|
|
|
|
|
|
{
|
|
|
|
|
|
FEED_DOG(); //ι<><CEB9>
|
|
|
|
|
|
Delay_Us(100);
|
|
|
|
|
|
temp = Flash_ReadSR();
|
|
|
|
|
|
i++;
|
|
|
|
|
|
if(i>3000) return 1;
|
|
|
|
|
|
};
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_PowerDown
|
|
|
|
|
|
* Description : Flash <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_PowerDown(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_PowerDown);
|
|
|
|
|
|
Delay_Us(3);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_PowerDown
|
|
|
|
|
|
* Description : Flash <EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Wakeup(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_ReleasePowerDown);
|
|
|
|
|
|
Delay_Us(3);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Erase_Chip
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ
|
|
|
|
|
|
* Input : None
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Erase_Chip(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Write_Enable();
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_MasterSendByte(P24Q40H_ChipErase);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Erase_Block
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : BLK_ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0~31) 2M
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Erase_Block(uint32_t BLK_ID)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t flash_buff[5];
|
|
|
|
|
|
|
|
|
|
|
|
BLK_ID*=0x10000; //64K
|
|
|
|
|
|
flash_buff[0] = P24Q40H_BlockErase;
|
|
|
|
|
|
flash_buff[1] = (uint8_t)((BLK_ID >> 16) & 0xFF);
|
|
|
|
|
|
flash_buff[2] = (uint8_t)((BLK_ID >> 8) & 0xFF);
|
|
|
|
|
|
flash_buff[3] = (uint8_t)((BLK_ID) & 0xFF);
|
|
|
|
|
|
flash_buff[4] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Write_Enable();
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_DMATrans(flash_buff,0x04);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Erase_Sector
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : DST_Addr<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0~511) 2M
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Erase_Sector(uint32_t DST_ID)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t flash_buff[5];
|
|
|
|
|
|
|
|
|
|
|
|
DST_ID*=4096;
|
|
|
|
|
|
flash_buff[0] = P24Q40H_SectorErase;
|
|
|
|
|
|
flash_buff[1] = (uint8_t)((DST_ID >> 16) & 0xFF);
|
|
|
|
|
|
flash_buff[2] = (uint8_t)((DST_ID >> 8) & 0xFF);
|
|
|
|
|
|
flash_buff[3] = (uint8_t)((DST_ID) & 0xFF);
|
|
|
|
|
|
flash_buff[4] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Write_Enable();
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_DMATrans(flash_buff,0x04);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Erase_Page
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : Page_ID<EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>(0~8191)
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Erase_Page(uint32_t Page_ID)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t flash_buff[5];
|
|
|
|
|
|
|
|
|
|
|
|
Page_ID*=256;
|
|
|
|
|
|
flash_buff[0] = P24Q40H_PageErase;
|
|
|
|
|
|
flash_buff[1] = (uint8_t)((Page_ID >> 16) & 0xFF);
|
|
|
|
|
|
flash_buff[2] = (uint8_t)((Page_ID >> 8) & 0xFF);
|
|
|
|
|
|
flash_buff[3] = (uint8_t)((Page_ID) & 0xFF);
|
|
|
|
|
|
flash_buff[4] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Write_Enable();
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_DMATrans(flash_buff,0x04);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Erase_Page
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input : Page_addr:<EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Erase_Pageaddr(uint32_t Page_addr)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t flash_buff[5];
|
|
|
|
|
|
|
|
|
|
|
|
flash_buff[0] = P24Q40H_PageErase;
|
|
|
|
|
|
flash_buff[1] = (uint8_t)((Page_addr >> 16) & 0xFF);
|
|
|
|
|
|
flash_buff[2] = (uint8_t)((Page_addr >> 8) & 0xFF);
|
|
|
|
|
|
flash_buff[3] = (uint8_t)((Page_addr) & 0xFF);
|
|
|
|
|
|
flash_buff[4] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Write_Enable();
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_DMATrans(flash_buff,0x04);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Read
|
|
|
|
|
|
* Description : P25Q40H Flash ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ȡָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input :
|
|
|
|
|
|
pBuffer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD>
|
|
|
|
|
|
NumByteToRead<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>65535)
|
|
|
|
|
|
ReadAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ(24bit)
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Read(uint8_t* pBuffer,uint16_t NumByteToRead,uint32_t ReadAddr)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t flash_buff[5];
|
|
|
|
|
|
|
|
|
|
|
|
flash_buff[0] = P24Q40H_ReadData;
|
|
|
|
|
|
flash_buff[1] = (uint8_t)((ReadAddr >> 16) & 0xFF);
|
|
|
|
|
|
flash_buff[2] = (uint8_t)((ReadAddr >> 8) & 0xFF);
|
|
|
|
|
|
flash_buff[3] = (uint8_t)((ReadAddr) & 0xFF);
|
|
|
|
|
|
flash_buff[4] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_DMATrans(flash_buff,0x04);
|
|
|
|
|
|
SPI0_DMARecv(pBuffer,NumByteToRead);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Write_Page
|
|
|
|
|
|
* Description : P25Q40H Flash ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʼдָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Input :
|
|
|
|
|
|
pBuffer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD>
|
|
|
|
|
|
NumByteToRead<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>256),<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>!!!
|
|
|
|
|
|
ReadAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ(24bit)
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Write_Page(uint8_t* pBuffer,uint16_t NumByteToWrite,uint32_t writeAddr)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t flash_buff[5];
|
|
|
|
|
|
|
|
|
|
|
|
flash_buff[0] = P24Q40H_PageProgram;
|
|
|
|
|
|
flash_buff[1] = (uint8_t)((writeAddr >> 16) & 0xFF);
|
|
|
|
|
|
flash_buff[2] = (uint8_t)((writeAddr >> 8) & 0xFF);
|
|
|
|
|
|
flash_buff[3] = (uint8_t)((writeAddr) & 0xFF);
|
|
|
|
|
|
flash_buff[4] = 0x00;
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Write_Enable();
|
|
|
|
|
|
Flash_CS_L;
|
|
|
|
|
|
SPI0_DMATrans(flash_buff,0x04);
|
|
|
|
|
|
SPI0_DMATrans(pBuffer,NumByteToWrite);
|
|
|
|
|
|
Flash_CS_H;
|
|
|
|
|
|
Flash_Wait_Busy();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Write_NoCheck
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дP25Q40H FLASH
|
|
|
|
|
|
ע<EFBFBD>⣺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>Ϊ0XFF,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>0XFF<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD>ʧ<EFBFBD><EFBFBD>!
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʼд<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD>!
|
|
|
|
|
|
* Input :
|
|
|
|
|
|
pBuffer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD>
|
|
|
|
|
|
NumByteToRead<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>65535)
|
|
|
|
|
|
ReadAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ(24bit)
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Write_NoCheck(uint8_t* pBuffer,uint16_t NumByteToWrite,uint32_t writeAddr)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint16_t pageremain;
|
|
|
|
|
|
pageremain=256-writeAddr%256; //<2F><>ҳʣ<D2B3><CAA3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
if(NumByteToWrite<=pageremain) pageremain=NumByteToWrite;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
while(1)
|
|
|
|
|
|
{
|
|
|
|
|
|
FEED_DOG(); //ι<><CEB9>
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Write_Page(pBuffer,pageremain,writeAddr);
|
|
|
|
|
|
if(pageremain == NumByteToWrite) break; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
else {
|
|
|
|
|
|
pBuffer+=pageremain;
|
|
|
|
|
|
writeAddr+=pageremain;
|
|
|
|
|
|
|
|
|
|
|
|
NumByteToWrite-=pageremain;
|
|
|
|
|
|
if(NumByteToWrite>256) pageremain=256;
|
|
|
|
|
|
else pageremain=NumByteToWrite;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : Flash_Write
|
|
|
|
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дP25Q40H FLASH
|
|
|
|
|
|
ע<EFBFBD>⣺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>Ϊ0XFF,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>0XFF<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD>ʧ<EFBFBD><EFBFBD>!
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʼд<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD>!
|
|
|
|
|
|
* Input :
|
|
|
|
|
|
pBuffer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD>
|
|
|
|
|
|
NumByteToRead<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>65535)
|
|
|
|
|
|
ReadAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ(24bit)
|
|
|
|
|
|
* Return : None
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void Flash_Write(uint8_t* pBuffer,uint16_t NumByteToWrite,uint32_t WriteAddr)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t secpos;
|
|
|
|
|
|
uint16_t secoff,secremain,i;
|
|
|
|
|
|
uint8_t* Write_Buff;
|
|
|
|
|
|
|
|
|
|
|
|
if(NumByteToWrite <= 256*2)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
Write_Buff = Temp_Flash_Buff;
|
|
|
|
|
|
|
|
|
|
|
|
secpos = WriteAddr/256; //ҳ<><D2B3><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
secoff = WriteAddr%256; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
secremain = 256 - secoff; //<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
if(NumByteToWrite<=secremain) secremain = NumByteToWrite; //<2F><>ǰҳ<C7B0><D2B3>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
while(1)
|
|
|
|
|
|
{
|
|
|
|
|
|
FEED_DOG(); //ι<><CEB9>
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Read(Write_Buff,256,secpos*256); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
for(i=0;i<secremain;i++) //У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
if(Write_Buff[secoff+i]!=0xFF) break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(i<secremain) //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Erase_Page(secpos); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
|
|
|
|
|
|
for(i=0;i<secremain;i++) //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
Write_Buff[i+secoff]=pBuffer[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
Flash_Write_NoCheck(Write_Buff,256,secpos*256); //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
|
|
|
|
|
|
}else {
|
|
|
|
|
|
if(secremain == 256)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Write_NoCheck(pBuffer,256,secpos*256); //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
|
|
|
|
|
|
|
|
|
|
|
|
}else if(secremain < 256){
|
|
|
|
|
|
Flash_Write_NoCheck(pBuffer,secremain,WriteAddr); //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(NumByteToWrite == secremain) break; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
else //д<><D0B4>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
secpos++; //ҳ<><D2B3><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>1
|
|
|
|
|
|
secoff = 0; //ҳ<><D2B3>ƫ<EFBFBD><C6AB>λ<EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
|
|
|
|
|
|
pBuffer += secremain; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
WriteAddr += secremain; //<2F><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>ַƫ<D6B7><C6AB>
|
|
|
|
|
|
NumByteToWrite -= secremain; //ʣ<><CAA3>д<EFBFBD><D0B4><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݼ<EFBFBD>
|
|
|
|
|
|
if(NumByteToWrite > 256) secremain = 256; //<2F><>һ<EFBFBD><D2BB>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
|
|
|
|
|
else secremain = NumByteToWrite; //<2F><>һ<EFBFBD><D2BB>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Write_Buff = Temp_Flash_Buff;
|
|
|
|
|
|
|
|
|
|
|
|
secpos = WriteAddr/4096; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
secoff = WriteAddr%4096; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
secremain = 4096 - secoff; //<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
if(NumByteToWrite<=secremain) secremain = NumByteToWrite; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
while(1)
|
|
|
|
|
|
{
|
|
|
|
|
|
FEED_DOG(); //ι<><CEB9>
|
|
|
|
|
|
|
|
|
|
|
|
Flash_Read(Write_Buff,2048,secpos*4096); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Flash_Read(Write_Buff+2048,2048,secpos*4096+2048); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
for(i=0;i<secremain;i++) //У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
if(Write_Buff[secoff+i]!=0xFF)break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(i<secremain) //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Erase_Sector(secpos); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
for(i=0;i<secremain;i++) //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
Write_Buff[i+secoff]=pBuffer[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
Flash_Write_NoCheck(Write_Buff,2048,secpos*4096); //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Flash_Write_NoCheck(Write_Buff+2048,2048,secpos*4096+2048); //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}else {
|
|
|
|
|
|
if(secremain == 4096)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Write_NoCheck(pBuffer,2048,secpos*4096); //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
Flash_Write_NoCheck(pBuffer+2048,2048,secpos*4096+2048); //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}else if(secremain < 4096){
|
|
|
|
|
|
Flash_Write_NoCheck(pBuffer,secremain,WriteAddr); //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(NumByteToWrite == secremain) break; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
else //д<><D0B4>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
secpos++; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>1
|
|
|
|
|
|
secoff = 0; //<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>λ<EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
|
|
|
|
|
|
pBuffer += secremain; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
WriteAddr += secremain; //<2F><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>ַƫ<D6B7><C6AB>
|
|
|
|
|
|
NumByteToWrite -= secremain; //ʣ<><CAA3>д<EFBFBD><D0B4><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݼ<EFBFBD>
|
|
|
|
|
|
if(NumByteToWrite > 4096) secremain = 4096; //<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
|
|
|
|
|
else secremain = NumByteToWrite; //<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-10 14:06:45 +08:00
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : SPI_FLASH_APP_Data_Erase
|
|
|
|
|
|
* Description : <EFBFBD>ⲿFlash APP<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* APP<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD>С Size: 0x00070000 <EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>0x00000000 ~ 0x0006FFFF
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void SPI_FLASH_APP_Data_Erase(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(uint8_t i = 0;i < 7;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Erase_Block(i);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-06 13:49:01 +08:00
|
|
|
|
|
2025-12-10 14:06:45 +08:00
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
* Function Name : SPI_FLASH_Logic_File_Erase
|
|
|
|
|
|
* Description : <EFBFBD>ⲿFlash <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* APP<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD>С Size: 0x00090000 <EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>0x00070000 ~ 0x000FFFFF
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
__attribute__((section(".non_0_wait"))) void SPI_FLASH_Logic_File_Erase(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(uint8_t i = 7;i < 16;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
Flash_Erase_Block(i);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-06 13:49:01 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|