在线时间3 小时
UID3348232
注册时间2017-1-19
NXP金币0
该用户从未签到
新手上路

- 积分
- 25
- 最后登录
- 2020-5-13
|
本帖最后由 nico666 于 2020-5-12 17:17 编辑
程序如下:
void FLASH_ErasePage(uint32_t EraseAddr)
{
//erase 4KB flash sector (the smallest entity that can be erased) at 0x0004_0000
while((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0); //wait if operation in progress
FTFC->FSTAT = FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_FPVIOL_MASK; //clear flags if set
FTFC->FCCOB[3] = 0x09; //Erase Flash Sector command (0x09)
FTFC->FCCOB[2] = (EraseAddr>>16); //Flash address [23:16]
FTFC->FCCOB[1] = (EraseAddr>>8); //Flash address [15:08]
FTFC->FCCOB[0] = EraseAddr; //Flash address [7:0]
FTFC->FSTAT = FTFC_FSTAT_CCIF_MASK; //launch command
while((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0); //wait for done
}
//==========================================================================
//函数名称:Flash_init
//函数返回:无
//参数说明:无
//功能概要:初始化flash模块
//==========================================================================
void Flash_Init(void)
{
LMEM->PCCCR = 0x85000001; /* Invalidate cache & enable write buffer, cache */
MSCM->OCMDR[0] = 0x00000020; /* Bit 5 = 1: Enable program flash prefetch buffer */
MSCM->OCMDR[1] = 0x00000020; /* Bit 5 = 1: Enable data flash prefetch buffer */
}
//WriteAddr:起始地址
//pBuffer:数据指针
//NumToWrite:要写入的32位数据的个数
#define S32K_SECTOR_SIZE 4096
uint32_t S32KFLASH_BUF[1024];//
void FLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint16_t NumToWrite)
{
uint32_t secpos; //扇区地址
uint16_t secoff; //扇区内偏移地址(32位字计算)
uint16_t secremain; //扇区内剩余地址(32位字计算)
uint16_t i;
uint32_t offaddr; //
if(WriteAddr<0||(WriteAddr>=(0+1024*512)))return;//非法地址
offaddr=WriteAddr-0; //.
secpos=offaddr/S32K_SECTOR_SIZE; //éè??μ??· 0~127 for STM32F103RBT6
secoff=(offaddr%S32K_SECTOR_SIZE)/4; //?úéè???úμ???ò?(2??×??ú?a?ù±?μ¥??.)
secremain=S32K_SECTOR_SIZE/4-secoff; //éè??ê£óà????′óD?
if(NumToWrite<=secremain)secremain=NumToWrite;//2?′óóú??éè??·??§
while(1)
{
FLASH_Read(secpos*S32K_SECTOR_SIZE+0,S32KFLASH_BUF,S32K_SECTOR_SIZE/4);//?á3?????éè??μ??úèY
//FLASH_Read(0x00040000,S32KFLASH_BUF,1024);
for(i=0;i<secremain;i++)//
{
if(S32KFLASH_BUF[secoff+i]!=0XFFFFFFFF)break;//Dèòa2á3y
}
if(i<secremain)//Dèòa2á3y
{
FLASH_ErasePage(secpos*S32K_SECTOR_SIZE);//2á3y?a??éè??
for(i=0;i<secremain;i++)//?′??
{
S32KFLASH_BUF[i+secoff]=pBuffer;
}
Flash_Write_NoCheck(secpos*S32K_SECTOR_SIZE+0,S32KFLASH_BUF,S32K_SECTOR_SIZE/4);//D′è?????éè??
}else Flash_Write_NoCheck(WriteAddr,pBuffer,secremain);//D′ò??-2á3yá?μ?,?±?óD′è?éè??ê£óà????.
if(NumToWrite==secremain)break;//D′è??áê?á?
else//D′è??′?áê?
{
secpos++; //éè??μ??·??1
secoff=0; //??ò??????a0
pBuffer+=secremain; //??????ò?
WriteAddr+=secremain; //D′μ??·??ò?
NumToWrite-=secremain; //×??ú(16??)êyμY??
if(NumToWrite>(S32K_SECTOR_SIZE/4))secremain=S32K_SECTOR_SIZE/4;//??ò???éè???1ê?D′2?íê
else secremain=NumToWrite;//??ò???éè???éò?D′íêá?
}
};
}
void Flash_Write_NoCheck(uint32_t WriteAddr,uint32_t* puffer,uint16_t NumToWrite)
{
uint16_t i;
for(i=0;i<NumToWrite;i+=2)
{
FLASH_ProgramDoubleWord(WriteAddr,puffer[i+1],puffer);
WriteAddr+=8;
}
}
void FLASH_ProgramDoubleWord(uint32_t WriteAddr,uint32_t DataH,uint32_t DataL)
{
//program phrase at address 0x0004_0000
while((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0); //wait if operation in progress
FTFC->FSTAT = FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_FPVIOL_MASK;
FTFC->FCCOB[3] = 0x07; //Program Phrase command (0x07)
FTFC->FCCOB[2] = (WriteAddr>>16); //Flash address [23:16]
FTFC->FCCOB[1] = (WriteAddr>>8); //Flash address [15:08]
FTFC->FCCOB[0] = WriteAddr; //Flash address [7:0]
FTFC->FCCOB[7] = (DataL>>24); //data
FTFC->FCCOB[6] = (DataL>>16);
FTFC->FCCOB[5] = (DataL>>8);
FTFC->FCCOB[4] = DataL;
FTFC->FCCOB[11] = (DataH>>24);
FTFC->FCCOB[10] = (DataH>>16);
FTFC->FCCOB[9] = (DataH>>8);
FTFC->FCCOB[8] = DataH;
FTFC->FSTAT = FTFC_FSTAT_CCIF_MASK; //launch command
while((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0); //wait for done
}
void FLASH_Read(uint32_t ReadAddr,uint32_t *pBuffer,uint16_t NumToRead) //NumToRead表示要读取的字个数
{
uint16_t i;
for(i=0;i<NumToRead;i++)
{
pBuffer=FLASH_ReadWord(ReadAddr);//读取4个字节.
ReadAddr+=4;//偏移4个字节.
}
}
uint32_t FLASH_ReadWord(uint32_t faddr)
{
return *(uint32_t*)faddr;
}
uint32_t temp[4];
uint32_t pbuffer[2]={0xFEEDFACE,0xCAFEBEEF};
void main()
{
SOSC_init_8MHz(); /* Initialize system oscillator for 8 MHz xtal */
SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
NormalRUNmode_80MHz(); /* Init clocks: 80 MHz SPLL & core, 40 MHz bus, 20 MHz flash */
SystemCoreClockUpdate();
Flash_Init();
FLASH_Write(0x00040000,pbuffer,2);
FLASH_Read(0x00040000,temp,4);
while(1)
{}
}
麻烦各位大佬看下,我这个程序为什么一debug就疯狂复位,程序是全部在flash底下跑的,没有开任何中断
|
|