📄 flash.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 + -