⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 easyarm1001_CDROM.rar 需要的快快下载
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: flash.c
** Last modified Date: 2006-11-15 
** Last Version: v1.0
** Description: Stellaris系列单片机FLASH编程
** 
**------------------------------------------------------------------------------------------------------
** Created By: Zhou Lishan
** Created date: 2006-11-15 
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/

#define HWREG(x)            (*((volatile unsigned long *)(x)))

#define FLASH_USECRL     0x400FE140  // uSec reload register

#define FLASH_FMA        0x400FD000  // Memory address register
#define FLASH_FMD        0x400FD004  // Memory data register
#define FLASH_FMC        0x400FD008  // Memory control register
#define FLASH_FCRIS      0x400FD00c  // Raw interrupt status register
#define FLASH_FCMISC     0x400FD014  // Interrupt status register


#define FLASH_FMC_WRKEY         0xA4420000  // FLASH write key
#define FLASH_FMC_ERASE         0x00000002  // Erase FLASH page
#define FLASH_FMC_WRITE         0x00000001  // Write FLASH word

#define FLASH_FCMISC_ACCESS     0x00000001  // Invalid access status
#define FLASH_FCRIS_ACCESS      0x00000001  // Invalid access status

// 擦除Flash函数
long FlashErase(unsigned long ulAddress)
{

    HWREG(FLASH_FCMISC) = FLASH_FCMISC_ACCESS; 			// 清上次访问出错中断


    HWREG(FLASH_FMA) = ulAddress;				// 写擦除扇区偏移地址
    HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_ERASE;	// 写擦除命令


    while(HWREG(FLASH_FMC) & FLASH_FMC_ERASE)                   // 等待擦除
    {
    }


    if(HWREG(FLASH_FCRIS) & FLASH_FCRIS_ACCESS)                 // 查询是否访问出错
    {
        return(-1);                                             // 编程失败
    }

    return(0);                                                  // 成功擦除
}


// Flash编程
long FlashProgram(unsigned long *pulData, unsigned long ulAddress,
             		unsigned long ulCount)
{

    if(ulAddress & 3)
    {
    	 return(-1);						// 编程的地址不字对齐,退出
    }
    if(ulCount & 3)							
    {
    	 return(-1);						// 编程数据的个数不为4的倍数,退出
    }


    HWREG(FLASH_FCMISC) = FLASH_FCMISC_ACCESS;			// 清上次访问出错中断

    while(ulCount)							// 循环编程多个字
    {
        HWREG(FLASH_FMA) = ulAddress;		// 写入字的地址
        HWREG(FLASH_FMD) = *pulData;		// 写入的数据
        HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_WRITE;// 写操命令


        while(HWREG(FLASH_FMC) & FLASH_FMC_WRITE)		// 等待编程完成
        {
        }

        pulData++;								// 指向下一个需要写入的字数据
        ulAddress += 4;							// 指向下一个需要编和的Flash地址
        ulCount -= 4;							// 需编程的字个数减1
    }


    if(HWREG(FLASH_FCRIS) & FLASH_FCRIS_ACCESS)	// 检查编程是否出错
    {
        return(-1);				// 编程出错
    }

    return(0);	// 正常完成编程
}



int main(void)
{
    unsigned long Data[4]={0x12345678,0xaa55aa55,0x55aa55aa,0xaabbccdd};
    int i;
    // 当使用6MHz的晶振时,复位时系统时中为6MHz
    HWREG(FLASH_USECRL) = 6 - 1;	// 写或擦除Flash时钟要求为系统时中减1MHz的频率

    if(FlashErase(1024*6))		// 擦除Flash的第7个扇区,即偏移地址为0x1800
    {
        while(1);				// 擦除Flash出错
    }
 	
    if(FlashProgram(Data,1024*6,4*4))
    {
        while(1);				// 编程Flash出错
    }
  
    for(i=0;i<4;i++)
    {
        if(HWREG(1024*6+i*4)!=Data[i])	// 比较写入Flash的数据是否正确
            while(1);					// 写入的数据与不对
    }
 	
    while(1); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -