S3C6410裸機(jī)程序相關(guān)系統(tǒng)函數(shù)
裸機(jī)程序中可能用到的文件以及函數(shù)
//system.c
/*************************************************************************************************************
?*?文件名: system.c
?*?功能: S3C6410相關(guān)系統(tǒng)函數(shù)
?*?作者: cp1300@139.com
?*?創(chuàng)建時間: 2012年3月4日11:25
?*?最后修改時間:2012年3月4日
?*?詳細(xì): 2012年3月5日17:00?添加VIC相關(guān)函數(shù)
*************************************************************************************************************/
#include?"system.h"
/*************************************************************************************************************************
*函數(shù)????????: void?SetEINT_TriggerMode(u8?EINT0_N,u8?Trigger)
*功能????????: 設(shè)置外部中斷組0觸發(fā)模式
*參數(shù)????????: EINT0_N:中斷源的編號(見:中斷組0編號定義);Trigger:觸發(fā)模式(EXT_LowLevel:低電平觸發(fā);EXT_HighLevel:高電平觸發(fā);
EXT_NegEdge:下降沿觸發(fā);EXT_PosEdge:上升沿觸發(fā);EXT_Edge:邊沿觸發(fā))
*返回????????: 無
*依賴????????: 底層宏定義
*作者????????: cp1300@139.com
*時間????????: 20120304
*最后修改時間: 20120304
*說明????????: 編號?GPN0--->GPN15??GPL8--->GPL14??GPM0--->GPM4,中斷設(shè)置必須兩個兩個一起
*************************************************************************************************************************/
void?SetEINT0_TriggerMode(vu8?EINT0_N,vu8?Trigger)
{
if(EINT0_N?&?0x80)?//EINT0CON1
{
EINT0_N?-=?0x80;//減去標(biāo)記
rEINT0CON1?&=?~(7?<<?EINT0_N);//清楚原來的設(shè)置
rEINT0CON1?|=?Trigger?<<?EINT0_N;
}
else //EINT0CON0
{
rEINT0CON0?&=?~(7?<<?EINT0_N);//清楚原來的設(shè)置
rEINT0CON0?|=?Trigger?<<?EINT0_N;
}
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_GateClk(u8?HCLK_DIV,FunctionalState?Enable)
*功能????????:??CLK時鐘門控設(shè)置(HCLK,PCLK,SCLK)
*參數(shù)????????:??CLK_DIV:外設(shè)(見:CLK門控時鐘定義);Enable?=?ENABLE,1使能;=DISABLE,0失能
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20121005
*說明????????:??PCLK_GATE添加標(biāo)識0x40,SCLK_GATE添加標(biāo)示0x80;
*************************************************************************************************************************/
void?Set_GateClk(vu8?CLK_DIV,FunctionalState?Enable)
{
vu32?*P?=?&rHCLK_GATE;
if(CLK_DIV?&?0x80) //SCLK
{
P?=?&rSCLK_GATE;
CLK_DIV?-=?0x80; //去掉標(biāo)示
}
else?if(CLK_DIV?&?0x40) //PCLK
{
P?=?&rPCLK_GATE;
CLK_DIV?-=?0x40; //去掉標(biāo)示
}
if(Enable?==?ENABLE) //使能
*P?|=?1?<<?CLK_DIV;
else //失能
*P?&=?~(1?<<?CLK_DIV);
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_INTtoIRQ(u8?INT_N)
*功能????????:??設(shè)置一個中斷為IRQ
*參數(shù)????????:??INT_N:中斷編號(見:中斷源編號定義);
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20120305
*說明????????:??設(shè)置一個中斷為普通中斷模式
*************************************************************************************************************************/
void?Set_INTtoIRQ(vu8?INT_N)
{
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
VIC1->INTSELECT?&=?~(1?<<?INT_N);
}
else //VIC0
VIC0->INTSELECT?&=?~(1?<<?INT_N);
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_INTtoFIQ(u8?INT_N)
*功能????????:??設(shè)置一個中斷為FIQ
*參數(shù)????????:??INT_N:中斷編號(見:中斷源編號定義);
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20120305
*說明????????:??設(shè)置一個中斷為快速中斷模式
*************************************************************************************************************************/
void?Set_INTtoFIQ(vu8?INT_N)
{
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
VIC1->INTSELECT?|=?(1?<<?INT_N);
}
else //VIC0
VIC0->INTSELECT?|=?(1?<<?INT_N);
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_IntEnable(u8?INT_N,FunctionalState?EnInt)
*功能????????:??開啟或關(guān)閉一個VIC中斷
*參數(shù)????????:??INT_N:中斷編號(見:中斷源編號定義),
*? EnInt?=?ENABLE,1使能;=DISABLE,0失能;
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20120305
*說明????????:??使能或失能VIC0,VIC1的一個中斷
*************************************************************************************************************************/
void?Set_IntEnable(vu8?INT_N,FunctionalState?EnInt)
{
VICx_TypeDef?*P?=?VIC0;
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
P?=?VIC1;
}?
if(EnInt?==?ENABLE)?//使能中斷
P->INTENABLE?=?1?<<?INT_N; //寫1使能中斷,寫0無影響
else //取消中斷
P->INTENCLEAR?=?1?<<?INT_N; //寫1清除中斷使能,寫0無影響
}
/*************************************************************************************************************************
*函數(shù)????????: u8?Get_IntEnable(vu8?INT_N)
*功能????????:??獲取一個中斷屏蔽狀態(tài)
*參數(shù)????????:??中斷編號
*返回????????:??1:該中斷失能,0:該中斷失能
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120524
*最后修改時間:? 20120524
*說明????????:??獲取一個中斷屏蔽狀態(tài)
*************************************************************************************************************************/
u8?Get_IntEnable(vu8?INT_N)
{
VICx_TypeDef?*P?=?VIC0;
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
P?=?VIC1;
}?
if(P->INTENABLE?&?(1?<<?INT_N))?//該中斷使能
return?1;
else?
return?0;
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_SoftInt(u8?INT_N,u8?ENABLE)
*功能????????:??開啟或關(guān)閉一個軟件中斷
*參數(shù)????????:??INT_N:中斷編號(見:中斷源編號定義),ENABLE?=?Enable,1使能;=Disable,0失能;
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20120305
*說明????????:??使能或失能VIC0,VIC1的一個軟件中斷
*************************************************************************************************************************/
void?Set_SoftInt(vu8?INT_N,vu8?ENABLE)
{
VICx_TypeDef?*P?=?VIC0;
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
P?=?VIC1;
}?
if(ENABLE)?//使能中斷
P->SOFTINT?=?1?<<?INT_N; //寫1使能軟件中斷,寫0無影響
else //取消中斷
P->SOFTINTCLEAR?=?1?<<?INT_N; //寫1清除軟件中斷使能,寫0無影響
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_IsrAddr(u8?INT_N,vu32?IsrAdd)
*功能????????:??設(shè)置中斷矢量入口
*參數(shù)????????:??INT_N:中斷編號(見:中斷源編號定義),IsrAdd:中斷服務(wù)程序指針;
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20120311
*說明????????:??設(shè)置矢量地址寄存器
*************************************************************************************************************************/
void?Set_IsrAddr(vu8?INT_N,vu32?IsrAdd)
{
VICx_TypeDef?*P?=?VIC0;
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
P?=?VIC1;
}
P->VECTADDR[INT_N]?=?IsrAdd;//將中斷服務(wù)程序入口地址寫入矢量地址寄存器
}
/*************************************************************************************************************************
*函數(shù)????????: void?Set_VectorPriority(u8?INT_N,u8?Priority)
*功能????????:??設(shè)置矢量優(yōu)先級
*參數(shù)????????:??INT_N:中斷編號(見:中斷源編號定義),Priority:優(yōu)先級0-15;
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120305
*最后修改時間:? 20120305
*說明????????:??優(yōu)先級為0-15,值越大優(yōu)先級越高,15最高,0最低;
*************************************************************************************************************************/
void?Set_VectorPriority(vu8?INT_N,vu8?Priority)
{
VICx_TypeDef?*P?=?VIC0;
if(INT_N?>?31) //VIC1
{
INT_N?-=?32;
P?=?VIC1;
}
P->VECTRPRIORITY[INT_N]?=?Priority;//將中斷優(yōu)先級寫入寄存器
}
/*************************************************************************************************************************
*函數(shù)????????: u32?Get_PLLCLK(int?pllreg)
*功能????????:??獲取PLL時鐘頻率
*參數(shù)????????:??pllreg?:?PLL選擇
APLL? 0 //ARM內(nèi)核時鐘PLL
MPLL? 1 //主時鐘PLL
EPLL? 2 //外設(shè)時鐘PLL
*返回????????:??頻率,HZ
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120526
*最后修改時間:? 20120526
*說明????????:??無
*************************************************************************************************************************/
u32?Get_PLLCLK(u8?pllreg)
{
u32?r?=?0,?m,?p,?s;
if?(pllreg?==?APLL)
r?=?rAPLL_CON;
else?if?(pllreg?==?MPLL)
r?=?rMPLL_CON;
else?if?(pllreg?==?EPLL)
r?=?rEPLL_CON0;
m?=?(r>>16)?&?0x3ff;
p?=?(r>>8)?&?0x3f;
s?=?r?&?0x7;
return?(m?*?(SYSTEM_MAIN_CLK_IN?/?(p?*?(1?<<?s))));
}
/*************************************************************************************************************************
*函數(shù)????????: u32?Get_FCLK(void)
*功能????????:??獲取FCLK時鐘頻率
*參數(shù)????????:??無
*返回????????:??頻率,HZ
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120526
*最后修改時間:? 20120526
*說明????????:??無
*************************************************************************************************************************/
u32?Get_FCLK(void)
{
return?(Get_PLLCLK(APLL));
}
/*************************************************************************************************************************
*函數(shù)????????: u32?Get_PCLK(void)
*功能????????:??獲取PCLK時鐘頻率
*參數(shù)????????:??無
*返回????????:??頻率,HZ
*依賴????????: 底層宏定義
*作者????????:??cp1300@139.com
*時間????????: 20120526
*最后修改時間:? 20120526
*說明????????:??無
*************************************************************************************************************************/
u32?Get_PCLK(void)
{
u32?fclk;
u32?hclkx2_div?=?((rCLK_DIV0?>>?9)?&?0x7)?+?1;
u32?pre_div?=?((rCLK_DIV0?>>?12)?&?0xf)?+?1;
if(rOTHERS?&?0x80)
fclk?=?Get_FCLK(); //?SYNC?Mode
else
fclk?=?Get_PLLCLK(MPLL); //?ASYNC?Mode
return?fclk/(hclkx2_div?*?pre_div);
}
//////////////////////////////////////////////////////////////////
//???????′???,???printf????,
//PRINTF_EN?==?1,?????printf??????
#if?(PRINTF_EN_?==?1)
#include?"uart.h"?
int?fputc(int?ch,FILE?*f)
{?????
UART0_SendByte((u8)ch);?????
return?ch;
}
#endif
//PRINTF_EN?==?2,?????printf?????
#if?(PRINTF_EN_==?2)
#include?"tft_lcd.h"
int?fputc(int?ch,?FILE?*f)
{????
static?u16?X;
static?u16?X1;
static?u16?Y;
static?u8?flag;
?
? if(flag?==?0)
? {
? if(Y?>?LCD_YSIZE-1-16)
{
Y?=?0;
X?=?X1?=?LCD_XSIZE/2;
flag?=?1;
LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff); //????????
}
? }
? else
? {
? if(Y?>?LCD_YSIZE-1-16)
{
Y?=?0;
X?=?X1?=?0;
flag?=?0;
LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????
}
? }
if((u8)ch?==?'n')
{
? X?=?X1;
Y?+=?12;
}
else?if((u8)ch?>?0x80)?//????
{
return?ch;
}
else
{
LCD_Char(X,Y,(u8?*)&ch,0x0000,0xffff,0x80);
if(flag?==?0)
{
if(X?>?LCD_XSIZE/2-1-8)
{
? X?=?X1;
Y?+=?12;
}
else
X?+=?8;
}
else
{
if(X?>?LCD_XSIZE-1-8)
{
? X?=?X1;
Y?+=?12;
}
else
X?+=?8;
}
}?????
return?ch;
}
#endif
//PRINTF_EN?==?3,???????printf??????????
#if?(PRINTF_EN_?==?3)
#include?"tft_lcd.h"
#include?"uart.h"
#includeu8?PrintfSet?=?0; //0:????printf??????;1:????printf?????
int?fputc(int?ch,?FILE?*f)
{????
static?u16?X;
static?u16?X1;
static?u16?Y;
static?u8?flag;
?
if(PrintfSet)
{
if(flag?==?0)
? {
? if(Y?>?LCD_YSIZE-1-16)
{
Y?=?0;
X?=?X1?=?LCD_XSIZE/2;
flag?=?1;
LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff); //????????
}
? }
? else
? {
? if(Y?>?LCD_YSIZE-1-16)
{
Y?=?0;
X?=?X1?=?0;
flag?=?0;
LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????
}
? }
if((u8)ch?==?'n')
{
? X?=?X1;
Y?+=?12;
}
else?if((u8)ch?>?0x80)?//????
{
return?ch;
}
else
{
LCD_Char(X,Y,(u8?*)&ch,0x0000,0xffff,0x80);
if(flag?==?0)
{
if(X?>?LCD_XSIZE/2-1-8)
{
? X?=?X1;
Y?+=?12;
}
else
X?+=?8;
}
else
{
if(X?>?LCD_XSIZE-1-8)
{
? X?=?X1;
Y?+=?12;
}
else
X?+=?8;
}
}
}
else
UART0_SendByte((u8)ch);
return?ch;
}
#endif
//system.h
/*************************************************************************************************************
?*?文件名: system.h
?*?功能: S3C6410相關(guān)系統(tǒng)函數(shù)
?*?作者: cp1300@139.com
?*?創(chuàng)建時間: 2012年3月4日11:25
?*?最后修改時間:2012年3月4日
?*?詳細(xì): 相關(guān)系統(tǒng)操作宏定義
*************************************************************************************************************/
#ifndef _SYSTEM_H_
#define _SYSTEM_H_?
#include?"sys_types.h"
#include?"stdio.h"
#include?"s3c6410_map.h"
#define?Debug?printf //調(diào)試支持
#define?nop?__nop() //空指令延時一個系統(tǒng)時鐘周期
//相關(guān)外部函數(shù)申明
void?SetEINT0_TriggerMode(vu8?EINT0_N,vu8?Trigger);//設(shè)置外部中斷組0觸發(fā)模式
void?Set_GateClk(vu8?CLK_DIV,FunctionalState?Enable); //CLK時鐘門控設(shè)置(HCLK,PCLK,SCLK)
void?Set_INTtoIRQ(vu8?INT_N); //設(shè)置一個中斷為IRQ
void?Set_INTtoFIQ(vu8?INT_N); //設(shè)置一個中斷為FIQ
void?Set_IntEnable(vu8?INT_N,FunctionalState?EnInt); //開啟或關(guān)閉一個VIC中斷
void?Set_SoftInt(vu8?INT_N,vu8?ENABLE); //開啟或關(guān)閉一個軟件中斷
void?Set_IsrAddr(vu8?INT_N,vu32?IsrAdd); //設(shè)置中斷矢量入口
void?Set_VectorPriority(vu8?INT_N,vu8?Priority); //設(shè)置矢量優(yōu)先級
u8?Get_IntEnable(vu8?INT_N); //獲取一個中斷屏蔽狀態(tài)
u32?Get_PCLK(void); //獲取PCLK時鐘頻率
u32?Get_FCLK(void); //獲取FCLK時鐘頻率
u32?Get_PLLCLK(u8?pllreg); //獲取PLL時鐘頻率
//相關(guān)外部全局變量聲明
extern?u8?PrintfSet; //0:定義printf到串口;1:定義printf到液晶
//IO模式宏定義
#define IO_IN_PUT 0 //輸入模式
#define?IO_OUT_PUT 1 //輸出模式
#define?IO_SF_MODE 2 //特殊模式,復(fù)用功能
#define?IO_EXT_INT 7 //外部中斷輸入模式
#define?IO_NO_UP 0 //禁止上拉,下拉
#define?IO_DROP_DOWM 1 //下拉
#define?IO_PULL_UP 2 //上拉
//外部中斷觸發(fā)模式定義
#define?EXT_LowLevel 0 //低電平觸發(fā)
#define?EXT_HighLevel 1 //高電平觸發(fā)
#define?EXT_NegEdge 2 //下降沿觸發(fā)
#define?EXT_PosEdge 4 //上升沿觸發(fā)
#define?EXT_Edge 6 //邊沿觸發(fā)
//使能printf輸出
//0:關(guān)閉printf輸出;1:使能printf到串口;2:使能printf到液晶;3:同時使能printf到串口和液晶
#define?PRINTF_EN_ 3
//中斷組0編號定義
// ?外部中斷組0的IO 偏移+標(biāo)示 中斷組0中的編號
#define?EINT0_GPN0 0 //0
#define?EINT0_GPN1 0 //1
#define?EINT0_GPN2 4 //2
#define?EINT0_GPN3 4 //3
#define?EINT0_GPN4 8 //4
#define?EINT0_GPN5 8 //5
#define?EINT0_GPN6 12 //6
#define?EINT0_GPN7 12 //7
#define?EINT0_GPN8 16 //8
#define?EINT0_GPN9 16 //9
#define?EINT0_GPN10 20 //10
#define?EINT0_GPN11 20 //11
#define?EINT0_GPN12 24 //12
#define?EINT0_GPN13 24 //13
#define?EINT0_GPN14 28 //14
#define?EINT0_GPN15 28 //15
#define?EINT0_GPL8 (0x80?+?0) //16
#define?EINT0_GPL9 (0x80?+?0) //17
#define?EINT0_GPL10 (0x80?+?4) //18
#define?EINT0_GPL11 (0x80?+?4) //19
#define?EINT0_GPL12 (0x80?+?8) //20
#define?EINT0_GPL13 (0x80?+?8) //21
#define?EINT0_GPL14 (0x80?+?12) //22
#define?EINT0_GPM0 (0x80?+?12) //23
#define?EINT0_GPM1 (0x80?+?16) //24
#define?EINT0_GPM2 (0x80?+?16) //25
#define?EINT0_GPM3 (0x80?+?20) //26
#define?EINT0_GPM4 (0x80?+?20) //27
//外部中斷分組定義
// 組名 //組號 //范圍
#define?EINT_Group0???? 0 //GPN0--->GPN15????????GPL8--->GPL14?????????GPM0--->GPM4
#define?EINT_Group01????1 //GPA0--->GPA7?????????GPB0--->GPB6
#define?EINT_Group02????1 //GPC0--->GPC7
#define?EINT_Group03????2 //GPD0--->GPD5
#define?EINT_Group04????2 //GPF0--->GPF14
#define?EINT_Group05??? 3 //GPG0--->GPG7
#define?EINT_Group06????3 //GPH0--->GPH9
#define?EINT_Group07????4 //GPO0--->GPO15
#define?EINT_Group08????4 //GPP0--->GPP14
#define?EINT_Group09????5 //GPQ0--->GPQ9
//HCLK門控時鐘定義
/*HCLK_GATE控制所有Ips的HCLK,如果區(qū)域?yàn)椤?’,則HCLK被提供,否則,HCLK被屏蔽。當(dāng)S3C6410
轉(zhuǎn)換成掉電模式時,系統(tǒng)控制器檢查一些模塊(IROM,MEM0,MEM1和MFC模塊)的狀態(tài)。因此,位25,22,
21,0必須為‘1’,以符合掉電的要求。
HCLK_GATE? 位? 描述? 初始狀態(tài)*/
#define?HCLK_UHOST 29 //為UHOST?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_SECUR 28 //為安全子系統(tǒng)選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_SDMA1 27 //為SDMA1?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_SDMA0 26 //為SDMA0?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_IROM 25 //為IROM?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_DDR1 24 //為DDR1?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_DDR0 23 //為DDR0?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_MEM1 22 //為DMC1?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_MEM0 21 //為DMC0,SROM,OneNAND,NFCON?和CFCON?選通HCLK(0:屏蔽,1:通過)。 1
#define?HCLK_USB 20 //為USB?OTG?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_HSMMC2 19 //為HSMMC2?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_HSMMC1 18 //為HSMMC1?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_HSMMC0 17 //為HSMMC0?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_MDP 16 //為MDP?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_DHOST 15 //為直接HOST?接口選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_IHOST 14 //為間接HOST?接口選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_DMA1 13 //為DMA1?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_DMA0 12 //為DMA0?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_JPEG 11 //為JPEG?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_CAMIF 10 //為相機(jī)接口選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_SCALER 9 //為定標(biāo)器選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_2D 8 //為2D?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_TV 7 //為TV?譯碼器選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_POST0 5 //為POST0?選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_ROT 4 //為旋轉(zhuǎn)器選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_LCD 3 //為LCD?控制器選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_TZIC 2 //為中斷控制器選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_INTC 1 //為向量中斷控制器選通HCLK(0:屏蔽,1:通過)。? 1
#define?HCLK_MFC 0 //為MFC?選通HCLK(0:屏蔽,1:通過)。? 1
//PCLK門控時鐘定義
// PCLK_GATE? 位? 描述? 初始狀態(tài)
#define?PCLK_SKEY (0x40?|?24) //?為安全鍵選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_CHIPID (0x40?|?23) //?為片上ID?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_SPI1 (0x40?|?22) //?為SPI1?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_SPI0 (0x40?|?21) //?為SPI0?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_HSIRX (0x40?|?20) //?為HSI?接收器選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_HSITX (0x40?|?19) //?為HIS?發(fā)送器選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_GPIO (0x40?|?18) //?為GPIO?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_IIC (0x40?|?17) //?為IIC?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_IIS1 (0x40?|?16) //?為IIS1?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_IIS0 (0x40?|?15) //?為IIS0?選通PCLK(0:屏蔽,1:通過)。 1
#define?PCLK_AC97 (0x40?|?14) //?為AC97?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_TZPC (0x40?|?13) //?為TZPC?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_TSADC (0x40?|?12) //?為觸摸屏ADC?選通PCLK(0:屏蔽,1:通過。? 1
#define?PCLK_KEYPAD (0x40?|?11) //?為Key?PAD?選通PCLK(0:屏蔽,1:通過)。 1
#define?PCLK_IRDA (0x40?|?10) //?為IRDA?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_PCM1 (0x40?|?9) //?為PCM1?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_PCM0 (0x40?|?8) //?為PCM0?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_PWM (0x40?|?7) //?為PWM?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_RTC (0x40?|?6) //?為RTC?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_WDT (0x40?|?5) //?為看門狗定時器選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_UART3 (0x40?|?4) //?為UART3?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_UART2 (0x40?|?3) //?為UART2?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_UART1 (0x40?|?2) //?為UART1?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_UART0 (0x40?|?1) //?為UART0?選通PCLK(0:屏蔽,1:通過)。? 1
#define?PCLK_MFC (0x40?|?0) //?為MFC?選通PCLK(0:屏蔽,1:通過)。? 1
//PCLK門控時鐘定義
//PCLK_GATE?位?描述?初始狀態(tài)
#define?SCLK_UHOST (0x80?|?30)? //?為USB-HOST?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MMC2_48 (0x80?|?29) //?為MMC2?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MMC1_48 (0x80?|?28) //?為MMC1?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MMC0_48 (0x80?|?27) //?為MMC0?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MMC2 (0x80?|?26) //?為MMC2?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MMC1 (0x80?|?25) //?為MMC1?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MMC0 (0x80?|?24) //?為MMC0?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_SPI1_48 (0x80?|?23) //?為SPI?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_SPI0_48 (0x80?|?22) //?為SPI?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_SPI1 (0x80?|?21) //?為SPI?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_SPI0 (0x80?|?20) //?為SPI?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_DAC27 (0x80?|?19) //?為DAC?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_TV27 (0x80?|?18) //?為TV?譯碼器選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_SCALER27 (0x80?|?17) //?為scaler27?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_SCALER (0x80?|?16) //?為定標(biāo)器選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_LCD27 (0x80?|?15) //?為LCD?控制器選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_LCD (0x80?|?14) //?為LCD?控制器選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_POST0_27 (0x80?|?12) //?為POST0?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_POST0 (0x80?|?10) //?為POST0?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_AUDIO1 (0x80?|?9) //?為PCM1,IIS1?和AC97?1?選通特殊時鐘?(0:屏蔽,1:通過)。1
#define?SCLK_AUDIO0 (0x80?|?8) //?為PCM0,IIS0?和AC97?0?選通特殊時鐘?(0:屏蔽,1:通過)。1
#define?SCLK_SECUR (0x80?|?7) //?為安全模塊選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_IRDA (0x80?|?6) //?為IRDA?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_UART (0x80?|?5) //?為UART0~3?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_OneNAND (0x80?|?4) //?為OneNAND?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_MFC (0x80?|?3) //?為MFC?選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_CAM (0x80?|?2) //?為相機(jī)接口選通特殊時鐘?(0:屏蔽,1:通過)。?1
#define?SCLK_JPEG (0x80?|?1) //?為JPEG?選通特殊時鐘?(0:屏蔽,1:通過)。?1
//中斷源編號定義
/* S3C6410X?支持64?位中斷源,不支持ARM1176HZF-S?鏡像中斷運(yùn)行.
? 中斷源? 中斷號 描述? 組*/
#define? INT_ADC? 63 //ADC?EOC?中斷? VIC1
#define? INT_PENDNUP? 62 //ADC?筆向下/向上中斷?中斷? VIC1
#define? INT_SEC? 61 //安全中斷? VIC1
#define? INT_RTC_ALARM? 60 //RTC?警告中斷? VIC1
#define? INT_IrDA? 59 //IrDA?中斷? VIC1
#define? INT_OTG? 58 //USB?OTG?中斷? VIC1
#define? INT_HSMMC1? 57 //HSMMC1?中斷? VIC1
#define? INT_HSMMC0? 56 //HSMMC0?中斷? VIC1
#define? INT_HOSTIF? 55 //主機(jī)接口中斷? VIC1
#define? INT_MSM? 54 //MSM?調(diào)制解調(diào)器?I/F?中斷? VIC1
#define? INT_EINT4? 53 //外部中斷組1~組9? VIC1
#define? INT_HSIrx? 52 //HS?Rx?中斷? VIC1
#define? INT_HSItx? 51 //HS?Tx?中斷? VIC1
#define? INT_I2C0? 50 //I2C?0?中斷? VIC1
#define? INT_SPI_INT_HSMMC2? 49 //SPI?中斷或HSMMC2?中斷? VIC1
#define? INT_SPI0? 48 //SPI0?中斷? VIC1
#define? INT_UHOST? 47 //USB?主機(jī)中斷? VIC1
#define? INT_CFC? 46 //CFCON?中斷? VIC1
#define ? INT_NFC? 45 //NFCON?中斷? VIC1
#define? INT_ONENAND1? 44 //板塊1?的ONENANE?中斷? VIC1
#define? INT_ONENAND0? 43 //板塊0?的ONENAND?中斷? VIC1
#define? INT_DMA1? 42 //DMA1?中斷? VIC1
#define? INT_DMA0? 41 //DMA0?中斷? VIC1
#define? INT_UART3? 40 //UART3?中斷? VIC1
#define? INT_UART2? 39 //UART2?中斷? VIC1
#define? INT_UART1? 38 //UART1?中斷? VIC1
#define? INT_UART0? 37 //UART0?中斷? VIC1
#define? INT_AC97? 36 //AC?中斷? VIC1
#define? INT_PCM1? 35 //PCM1?中斷? VIC1
#define? INT_PCM0? 34 //PCM0?中斷? VIC1
#define? INT_EINT3? 33 //外部中斷20~27? VIC1
#define? INT_EINT2? 32 //外部中斷12~19? VIC1
#define? INT_LCD_2? 31 //LCD?中斷.系統(tǒng)I/F?完成? VIC0
#define? INT_LCD_1? 30 //LCD?中斷.VSYNC?中斷? VIC0
#define? INT_LCD_0? 29 //LCD?中斷.FIFO?不足? VIC0
#define? INT_TIMER4? 28 //定時器4?中斷.? VIC0
#define? INT_TIMER3? 27 //定時器3?中斷.? VIC0
#define? INT_WDT? 26 //看門狗定時器中斷.? VIC0
#define? INT_TIMER2? 25 //定時器2?中斷.? VIC0
#define? INT_TIMER1? 24 //定時器1?中斷.? VIC0
#define? INT_TIMER0? 23 //定時器0?中斷.? VIC0
#define? INT_KEYPAD? 22 //鍵盤中斷.? VIC0
#define? INT_ARM_DMAS? 21 //ARM?DMAS?中斷.? VIC0
#define? INT_ARM_DMA? 20 //ARM?DMA?中斷.? VIC0
#define? INT_ARM_DMAERR? 19 //ARM?DMA?錯誤中斷.? VIC0
#define? INT_SDMA1? 18 //安全?DMA1?中斷.? VIC0
#define? INT_SDMA0? 17 //安全?DMA0?中斷.? VIC0
#define? INT_MFC? 16 //MFC?中斷.? VIC0
#define? INT_JPEG? 15 //JPEG?中斷.? VIC0
#define? INT_BATF? 14 //電池故障中斷.? VIC0
#define? INT_SCALER? 13 //TV?轉(zhuǎn)換器中斷.? VIC0
#define? INT_TVENC? 12 //TV?編碼器中斷.? VIC0
#define? INT_2D? 11 //2D?中斷.? VIC0
#define? INT_ROTATOR? 10 //旋轉(zhuǎn)器中斷.? VIC0
#define? INT_POSTO? 9 //后處理器中斷.? VIC0
#define? INT_3D? 8 //3D?圖像控制器中斷.? VIC0
//#define? Reserved? 7 //保留? VIC0
#define? INT_I2S 6 //I2S0/I2S1/INT_I2SV40/I2SV40中斷 VIC0
#define? INT_I2C1? 5 //I2C1?中斷 ? VIC0
#define? INT_CAMIF_P? 4 //照相機(jī)接口中斷? VIC0
#define? INT_CAMIF_C? 3 //照相機(jī)接口中斷? VIC0
#define? INT_RTC_TIC? 2 //RTC?TIC?中斷? VIC0
#define? INT_EINT1? 1 //外部中斷4~11? VIC0
#define? INT_EINT0? 0 //外部中斷0~3? VIC0
/*************************************************************************************************/
/* 對應(yīng)位聲明,方便位操作 */
#define?BIT0 (0x0001?<<?0)
#define?BIT1 (0x0001?<<?1)
#define?BIT2 (0x0001?<<?2)
#define?BIT3 (0x0001?<<?3)
#define?BIT4 (0x0001?<<?4)
#define?BIT5 (0x0001?<<?5)
#define?BIT6 (0x0001?<<?6)
#define?BIT7 (0x0001?<<?7)
#define?BIT8 (0x0001?<<?8)
#define?BIT9 (0x0001?<<?9)
#define?BIT10 (0x0001?<<?10)
#define?BIT11 (0x0001?<<?11)
#define?BIT12 (0x0001?<<?12)
#define?BIT13 (0x0001?<<?13)
#define?BIT14 (0x0001?<<?14)
#define?BIT15 (0x0001?<<?15)
#define?BIT16 (0x00000001?<<?16)
#define?BIT17 (0x00000001?<<?17)
#define?BIT18 (0x00000001?<<?18)
#define?BIT19 (0x00000001?<<?19)
#define?BIT20 (0x00000001?<<?20)
#define?BIT21 (0x00000001?<<?21)
#define?BIT22 (0x00000001?<<?22)
#define?BIT23 (0x00000001?<<?23)
#define?BIT24 (0x00000001?<<?24)
#define?BIT25 (0x00000001?<<?25)
#define?BIT26 (0x00000001?<<?26)
#define?BIT27 (0x00000001?<<?27)
#define?BIT28 (0x00000001?<<?28)
#define?BIT29 (0x00000001?<<?29)
#define?BIT30 (0x00000001?<<?30)
#define?BIT31 (0x00000001?<<?31)
//PLL選擇
#define APLL? 0 //ARM內(nèi)核時鐘PLL
#define?MPLL? 1 //主時鐘PLL
#define?EPLL? 2 //外設(shè)時鐘PLL
//主時鐘輸入
#define?SYSTEM_MAIN_CLK_IN 12000000 //12MHZ
/*************************************************************************************************************************
*函數(shù)????????: __inline?void?VICInterruptEnd(void)
*功能????????:??在中斷快要結(jié)束時清除中斷
*參數(shù)????????:??無
*返回????????:??無
*依賴????????: 底層宏定義
*作者????????:??陳鵬
*時間????????: 20120305
*最后修改時間:? 20120305
*說明????????:??寫入任何數(shù)據(jù)清除中斷,只有在中斷服務(wù)程序中才可讀,結(jié)束時才寫
兩個要一起清除,否則可能導(dǎo)致無法再次進(jìn)入中斷,無意間發(fā)現(xiàn)的
*************************************************************************************************************************/
__inline?void?VICInterruptEnd(void)
{
VIC0->ADDRESS?=?0xffffffff; //寫入任何值都可以清除當(dāng)前中斷
VIC1->ADDRESS?=?0xffffffff; //寫入任何值都可以清除當(dāng)前中斷
}
//通道選擇
#define?ch0 0
#define?ch1 1
#define?ch2 2
//printf輸出定義
#if?(PRINTF_EN_?==?1) //使能到串口
#define?uart_printf(format,...) (printf(format,?##__VA_ARGS__)) //串口打印
#define?DEBUG(format,...)? (printf(""format,?__LINE__,?##__VA_ARGS__)) //DEBUG輸出
#endif
//printf輸出定義
#if?(PRINTF_EN_?==?2) //使能到液晶
#define?lcd_printf(format,...) (printf(format,?##__VA_ARGS__)) //LCD打印
#define?DEBUG(format,...)? (printf(""format,?__LINE__,?##__VA_ARGS__)) //DEBUG輸出
#endif
//printf輸出定義
#if?(PRINTF_EN_?==?3) //同時使能到液晶和串口
#define?uart_printf(format,...) PrintfSet=0;printf(format,?##__VA_ARGS__) //串口打印
#define?lcd_printf(format,...) PrintfSet=1;printf(format,?##__VA_ARGS__) //LCD打印
#define?DEBUG(format,...) PrintfSet=0;printf(""format,?__LINE__,?##__VA_ARGS__) //DEBUG輸出
#endif
#endif




