查看: 8172|回复: 0

[S32] 关于S32K144 flash读写问题

[复制链接]

该用户从未签到

1

主题

1

帖子

0

新手上路

Rank: 1

积分
25
最后登录
2020-5-13
发表于 2020-5-12 17:15:57 | 显示全部楼层 |阅读模式
本帖最后由 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底下跑的,没有开任何中断
我知道答案 目前已有0人回答
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-10 00:04 , Processed in 0.076384 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表