📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
** Description: 将SRAM中的数据写入到NOR Flash中,实现程序的固化。
** 将要烧写的BIN文件改名为flash.bin,然后复制到本工程目录的src目录下,接着重新编译本工程(一定要
** 重新编译),再启动AXD调试,全速运行程序即可。
** 要求系统存储器分配为Bank0:Flash,Bank1:RAM。本工程要使用DebugInExram生成目标来编译。
********************************************************************************************************/
#include "config.h"
// 定义蜂鸣器控制口
#define BEEP (1 << 7) /* P0.7口 */
// 声明外部标号(flash.bin文件的存储地址)
extern uint16 FLASH_FUNCTION[];
extern uint16 FLASH_FUNCTION_END[];
/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
** 延时时间与系统时钟有关。
** Input: dly 延时参数,值越大,延时越久
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;
for(; dly > 0; dly--)
for(i = 0; i < 50000; i++);
}
/*********************************************************************************************************
** Function name: RunBeep
** Descriptions: 控制蜂鸣器Be一声音。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2006-01-05
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RunBeep(void)
{
IO0CLR = BEEP; // BEEP = 0
DelayNS (5);
IO0SET = BEEP; // BEEP = 1
DelayNS (5);
}
// FLASH的起始地址(分配为Bank0块,16位宽度)
#define FLASH_ADDR 0x80000000
/*********************************************************************************************************
** Function name: GetAddr (宏函数)
** Descriptions: 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于S3C2410A输出。
** 由于SST39VF1601的A0是与S3C2410A的A1相连,所以addr要左移1位。
** Input: addr SST39VF1601的内部地址值
** Output: 返回转换出的地址
** Created by: 黄绍斌
** Created Date: 2006-01-05
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))
/*********************************************************************************************************
** Function name: WordProgram
** Descriptions: 半字(16位)数据编程。
** Input: Addr 编程地址(SST39VF1601内部地址)
** Data 编程数据
** Output: 返回TRUE表示操作成功,返回FALSE表示操作失败
** Created by: 黄绍斌
** Created Date: 2006-01-05
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int WordProgram(uint32 Addr, uint16 Data)
{
volatile uint16 *ip;
uint16 temp1, temp2;
ip = GetAddr(0x5555); // 转换地址0x5555
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0xa0a0; // 第三个写周期,地址0x5555,数据0xA0
ip = GetAddr(Addr);
*ip = Data; // 第四个写周期,地址Addr,数据Data
temp1 = *ip; // 预读处理
while(1) // 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
{
temp1 = *ip;
temp2 = *ip;
if(temp1 == temp2)
{
if(temp1 != Data)
{
return(FALSE);
}
else
{
return(TRUE);
}
} // end of if(temp1 == temp2)...
} // end of while(1)...
return(TRUE);
}
/*********************************************************************************************************
** Function name: WordRead
** Descriptions: 读取指定地址(Flash内部的)上的半字(16位)数据。
** Input: Addr 编程地址(SST39VF1601内部地址)
** Output: 返回值即是读出的数据
** Created by: 黄绍斌
** Created Date: 2006-01-05
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 WordRead(uint32 Addr)
{
volatile uint16 *ip;
ip = GetAddr(Addr);
return(*ip);
}
/*********************************************************************************************************
** Function name: ChipErase
** Descriptions: 芯片全片擦除。
** Input: 无
** Output: 返回TRUE表示操作成功,返回FALSE表示操作失败
** Created by: 黄绍斌
** Created Date: 2006-01-05
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int ChipErase(void)
{
volatile uint16 *ip;
uint16 temp1, temp2;
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第一个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第二个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x8080; // 第三个写周期,地址0x5555,数据0x80
ip = GetAddr(0x5555);
ip[0] = 0xaaaa; // 第四个写周期,地址0x5555,数据0xAA
ip = GetAddr(0x2aaa);
ip[0] = 0x5555; // 第五个写周期,地址0x2aaa,数据0x55
ip = GetAddr(0x5555);
ip[0] = 0x1010; // 第六个写周期,地址0x5555,数据0x10
temp1 = *ip;
while(1) // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
{
temp1 = *ip;
temp2 = *ip;
if(temp1 == temp2)
{
if(temp1 != 0xffff)
{
return(FALSE);
}
else
{
return(TRUE);
}
} // end of if(temp1 == temp2)...
} // end of while(1)...
return(TRUE);
}
uint16 wr_data;
/*********************************************************************************************************
** Function name: main
** Descriptions: 将FLASH_FUNCTION起始地址上的数据写入到NOR Flash的0x000000地址。
** 写入字节个数为flash.bin文件的大小。
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2006-01-05
**-------------------------------------------------------------------------------------------------------
** Modified by: zouchao
** Modified Date: 2006-02-09
** Descriptions: 增加Flash编程的全局校验,程序编程成功,蜂鸣器响一声,否则蜂鸣器持续间断蜂鸣
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main (void)
{
uint32 addr, size;
uint32 err;
PINSEL0 = 0x00000000; // I/O初始化
PINSEL1 = 0x00000000;
IO0DIR = BEEP;
IO0SET = BEEP;
ChipErase(); // 全片擦除操作
DelayNS(1);
size = FLASH_FUNCTION_END - FLASH_FUNCTION; // 计算flash.bin文件的大小
for(addr = 0; addr < size; addr++) // 开始写数据
{
wr_data = FLASH_FUNCTION[addr];
WordProgram(addr, wr_data);
}
err = 0; // 将写入Flash中的数据与原bin文件中的数据相校验
for(addr = 0; addr < size; addr++)
{
wr_data = WordRead(addr);
if(wr_data != FLASH_FUNCTION[addr]) err++;
}
while(err)
{
RunBeep(); // 校验出错报警
}
RunBeep(); // 编程正确
while(1);
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -