📄 ext_flash.c
字号:
/****************************************Copyright (c)**************************************************** ** 公 司** 部 门**** http://www.armgcc.com****--------------文件信息--------------------------------------------------------------------------------** 文 件 名: ext_flash.c** 创 建 人: 李海军** 创建日期: 2006年5月24日** 描 述: 该文件提供外部FLASH 的所有操作****--------------历史版本--------------------------------------------------------------------------------** 创 建 人: 李海军** 版 本: V1.0** 日 期: 2006年5月24日** 描 述: 原始版本****------------------------------------------------------------------------------------------------------********************************************************************************************************/#include "config.h"/******************************************* 全局变量定义 ***********************************************//******************************************* 局部函数声明 ***********************************************//*********************************************************************************************************;** 函数名称: ext_flash_init;** 功能描述: 外部flash 初始化;** ;** 参 数: 无;** ;** 返 回 值: 无;** ;** 作 者: 李海军;** 日 期: 2006年5月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/void ext_flash_init(void){}/*********************************************************************************************************;** 函数名称: ext_flash_get_id;** 功能描述: 获取外部flash ID;** ;** 参 数: 无;** ;** 返 回 值: 32 位ID;** ;** 作 者: 李海军;** 日 期: 2006年5月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/UINT32 ext_flash_get_id(void){ UINT32 id = 0; EXT_FLASH_WRITE (0xAAAA, 0xAA); EXT_FLASH_WRITE (0x5555, 0x55); EXT_FLASH_WRITE (0xAAAA, 0x90); id = EXT_FLASH_READ(0x0000) << 16; id += EXT_FLASH_READ(0x0002); EXT_FLASH_WRITE (0xAAAA, 0xAA); EXT_FLASH_WRITE (0x5555, 0x55); EXT_FLASH_WRITE (0xAAAA, 0xF0); return id; } /*********************************************************************************************************;** 函数名称: ext_flash_erase_sector;** 功能描述: FLASH 扇区擦除;** ;** 参 数: sector 要擦除的扇区;** ;** 返 回 值: 错误信息或成功;** ;** 作 者: 李海军;** 日 期: 2006年5月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/EXT_FLASH_RETURN_T ext_flash_erase_sector(UINT32 sector){ UINT16 status = 0; UINT32 time = 0; if(sector >= EXT_FLASH_SECTORS) return EXT_FLASH_PARA_ERROR; sector <<= 12; EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(0xAAAA, 0x80); EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(sector,0x30); for(time = 0; time < 0x07ffffff; time ++) { status = EXT_FLASH_READ(sector); if(status & EXT_FLASH_DQ7) return EXT_FLASH_SUCCESS; } return EXT_FLASH_TIMEOUT;}/*********************************************************************************************************;** 函数名称: ext_flash_erase_block;** 功能描述: FLASH 块擦除;** ;** 参 数: block 要擦除的块;** ;** 返 回 值: 错误信息或成功;** ;** 作 者: 李海军;** 日 期: 2006年5月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/EXT_FLASH_RETURN_T ext_flash_erase_block(UINT32 block){ UINT16 status = 0; UINT32 time = 0; if(block >= EXT_FLASH_BLOCKS) return EXT_FLASH_PARA_ERROR; block <<= 16; EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(0xAAAA, 0x80); EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(block,0x50); for(time = 0; time < 0x07ffffff; time ++) { status = EXT_FLASH_READ(block); if(status & EXT_FLASH_DQ7) return EXT_FLASH_SUCCESS; } return EXT_FLASH_TIMEOUT;}/*********************************************************************************************************;** 函数名称: ext_flash_erase_chip;** 功能描述: FLASH 整片擦除;** ;** 参 数: 无;** ;** 返 回 值: 错误信息或成功;** ;** 作 者: 李海军;** 日 期: 2006年5月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/EXT_FLASH_RETURN_T ext_flash_erase_chip(void){ UINT16 status = 0; UINT32 time = 0; EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(0xAAAA, 0x80); EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(0xAAAA, 0x10); for(time = 0; time < 0x07ffffff; time ++) { status = EXT_FLASH_READ(0); if(status & EXT_FLASH_DQ7) return EXT_FLASH_SUCCESS; } return EXT_FLASH_TIMEOUT;}/*********************************************************************************************************;** 函数名称: ext_flash_program;** 功能描述: 写数据到指定的FLASH 地址,写之前确保已擦除 ;** ;** 参 数: ;** address 目标FLASH 地址;** p_data 要写的数据;** size 大小;**;** 返 回 值: 错误信息或成功;** ;** 作 者: 李海军;** 日 期: 2006年5月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/EXT_FLASH_RETURN_T ext_flash_program(UINT32 address, UINT16 * p_data, UINT32 size){ UINT16 status = 0; UINT32 time = 0; UINT16 *p_temp = (UINT16 *)p_data; while (size--) { EXT_FLASH_WRITE(0xAAAA, 0xAA); EXT_FLASH_WRITE(0x5555, 0x55); EXT_FLASH_WRITE(0xAAAA, 0xA0); EXT_FLASH_WRITE(address, *p_temp); for(time = 0; time < 0xffff; time ++) { status = EXT_FLASH_READ(address); if((status & EXT_FLASH_DQ7) == (*p_temp & EXT_FLASH_DQ7)) break; } if(time >= 0xffff) return EXT_FLASH_TIMEOUT; address += 2; p_temp++; } return EXT_FLASH_SUCCESS;}/*********************************************************************************************************;** 函数名称: ext_flash_read;** 功能描述: 从指定的FLASH 地址读取指定大小的数据。 ;** ;** 参 数: ;** address 目标FLASH地址;** p_data 读出数据缓冲区;** size 大小;**;** 返 回 值: 错误信息或成功;** ;** 作 者: 罗辉联;** 日 期: 2006年10月24日;**-------------------------------------------------------------------------------------------------------;** 修 改 人: ;** 日 期: ;**------------------------------------------------------------------------------------------------------;********************************************************************************************************/EXT_FLASH_RETURN_T ext_flash_read(UINT32 address, UINT16 * p_data, UINT32 size){ UINT16 *p_temp = (UINT16 *)p_data; while(size--) { *p_temp = *((volatile UINT16 *)(EXT_FLASH_BASE + address)); address += 2; p_temp++; } return EXT_FLASH_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -