?? 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 + -