223 lines
5.4 KiB
C
Raw Normal View History

2021-07-28 13:15:22 +08:00
#include "stmflash.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
/**************************************************************************/
//STM32<33>ڲ<EFBFBD>FLASH<53><48>д <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/
//////////////////////////////////////////////////////////////////////////////////
/*************************************************************************/
/*************************<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>BANK1****************************/
/*************************************************************************/
/**************************************************************************/
//<2F><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>(32λ<32><CEBB><EFBFBD><EFBFBD>)
//faddr:<3A><><EFBFBD><EFBFBD>ַ
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>.
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/
//<2F><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>(32λ<32><CEBB><EFBFBD><EFBFBD>)
//faddr:<3A><><EFBFBD><EFBFBD>ַ
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>.
u32 STMFLASH_ReadWord(u32 faddr)
{
return *(__IO uint32_t *)faddr;
}
/**************************************************************************/
//<2F><>ȡij<C8A1><C4B3><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ڵ<EFBFBD>flash<73><68><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BANK1<4B><31><EFBFBD><EFBFBD>
//addr:flash<73><68>ַ
//<2F><><EFBFBD><EFBFBD>ֵ:0~11,<2C><>addr<64><72><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/
uint16_t STMFLASH_GetFlashSector(u32 addr)
{
if(addr<ADDR_FLASH_SECTOR_1_BANK1)return FLASH_SECTOR_0;
else if(addr<ADDR_FLASH_SECTOR_2_BANK1)return FLASH_SECTOR_1;
else if(addr<ADDR_FLASH_SECTOR_3_BANK1)return FLASH_SECTOR_2;
else if(addr<ADDR_FLASH_SECTOR_4_BANK1)return FLASH_SECTOR_3;
else if(addr<ADDR_FLASH_SECTOR_5_BANK1)return FLASH_SECTOR_4;
else if(addr<ADDR_FLASH_SECTOR_6_BANK1)return FLASH_SECTOR_5;
else if(addr<ADDR_FLASH_SECTOR_7_BANK1)return FLASH_SECTOR_6;
return FLASH_SECTOR_7;
}
/**************************************************************************/
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//<2F>ر<EFBFBD>ע<EFBFBD><D7A2>:<3A><>ΪSTM32H7<48><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>̫<EFBFBD><CCAB><><EFBFBD><ECB7A8><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>
// д<><D0B4>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0XFF,<2C><>ô<EFBFBD><C3B4><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD>
// д<><D0B4>0XFF<46>ĵ<EFBFBD>ַ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ.<2E><><EFBFBD><EFBFBD>д֮ǰȷ<C7B0><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// û<><C3BB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD><><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д.
//<2F>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>OTP<54><50><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>Ч!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дOTP<54><50>!
//OTP<54><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Χ:0X1FF0F000~0X1FF0F41F
//WriteAddr:<3A><>ʼ<EFBFBD><CABC>ַ(<28>˵<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ϊ4<CEAA>ı<EFBFBD><C4B1><EFBFBD>!!)
//pBuffer:<3A><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//NumToWrite:<3A><>(32λ)<29><>(<28><><EFBFBD><EFBFBD>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD>32λ<32><CEBB><EFBFBD>ݵĸ<DDB5><C4B8><EFBFBD>.)
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
FLASH_EraseInitTypeDef FlashEraseInit;
HAL_StatusTypeDef FlashStatus=HAL_OK;
u32 SectorError=0;
u32 addrx=0;
u32 endaddr=0;
if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD>ַ
HAL_FLASH_Unlock(); //<2F><><EFBFBD><EFBFBD>
addrx=WriteAddr; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
endaddr=WriteAddr+NumToWrite*4; //д<><D0B4><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>ַ
if(addrx<0X1FF00000)
{
while(addrx<endaddr) //ɨ<><C9A8>һ<EFBFBD><D2BB><EFBFBD>ϰ<EFBFBD>.(<28>Է<EFBFBD>FFFFFFFF<46>ĵط<C4B5>,<2C>Ȳ<EFBFBD><C8B2><EFBFBD>)
{
if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//<2F>з<EFBFBD>0XFFFFFFFF<46>ĵط<C4B5><><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx); //Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FlashEraseInit.Banks=FLASH_BANK_1; //<2F><><EFBFBD><EFBFBD>BANK1
FlashEraseInit.NbSectors=1; //һ<><D2BB>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3; //<2F><>ѹ<EFBFBD><D1B9>Χ<EFBFBD><CEA7>VCC=2.7~3.6V֮<EFBFBD><EFBFBD>!!
if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK)
{
break;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
SCB_CleanInvalidateDCache(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>D-Cache
}else addrx+=4;
FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1); //<2F>ȴ<EFBFBD><C8B4>ϴβ<CFB4><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1); //<2F>ȴ<EFBFBD><C8B4>ϴβ<CFB4><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(FlashStatus==HAL_OK)
{
while(WriteAddr<endaddr)//д<><D0B4><EFBFBD><EFBFBD>
{
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer)!=HAL_OK)//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
break; //д<><D0B4><EFBFBD>
}
WriteAddr+=32;
pBuffer+=8;
}
}
HAL_FLASH_Lock(); //<2F><><EFBFBD><EFBFBD>
}
/**************************************************************************/
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//ReadAddr:<3A><>ʼ<EFBFBD><CABC>ַ
//pBuffer:<3A><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//NumToRead:<3A><>(32λ)<29><>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/
void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)
{
u32 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//<2F><>ȡ4<C8A1><34><EFBFBD>ֽ<EFBFBD>.
ReadAddr+=4;//ƫ<><C6AB>4<EFBFBD><34><EFBFBD>ֽ<EFBFBD>.
}
}
/**************************************************************************/
//STM32<33>ڲ<EFBFBD>FLASH<53><48>д <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/