S3C6410裸機程序中可能用到的文件以及函數
//system.c
- /*************************************************************************************************************
- * 文件名: system.c
- * 功能: S3C6410相關系統函數
- * 作者: [email protected]
- * 創建時間: 2012年3月4日11:25
- * 最後修改時間:2012年3月4日
- * 詳細: 2012年3月5日17:00 添加VIC相關函數
- *************************************************************************************************************/
- #include "system.h"
-
-
- /*************************************************************************************************************************
- *函數 : void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger)
- *功能 : 設置外部中斷組0觸發模式
- *參數 : EINT0_N:中斷源的編號(見:中斷組0編號定義);Trigger:觸發模式(EXT_LowLevel:低電平觸發;EXT_HighLevel:高電平觸發;
- EXT_NegEdge:下降沿觸發;EXT_PosEdge:上升沿觸發;EXT_Edge:邊沿觸發)
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120304
- *最後修改時間: 20120304
- *說明 : 編號 GPN0--->GPN15 GPL8--->GPL14 GPM0--->GPM4,中斷設置必須兩個兩個一起
- *************************************************************************************************************************/
- void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger)
- {
- if(EINT0_N & 0x80) //EINT0CON1
- {
- EINT0_N -= 0x80;//減去標記
- rEINT0CON1 &= ~(7 << EINT0_N);//清楚原來的設置
- rEINT0CON1 |= Trigger << EINT0_N;
- }
- else //EINT0CON0
- {
- rEINT0CON0 &= ~(7 << EINT0_N);//清楚原來的設置
- rEINT0CON0 |= Trigger << EINT0_N;
- }
- }
-
-
-
- /*************************************************************************************************************************
- *函數 : void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable)
- *功能 : CLK時鐘門控設置(HCLK,PCLK,SCLK)
- *參數 : CLK_DIV:外設(見:CLK門控時鐘定義);Enable = ENABLE,1使能;=DISABLE,0失能
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120305
- *最後修改時間: 20121005
- *說明 : PCLK_GATE添加標識0x40,SCLK_GATE添加標示0x80;
- *************************************************************************************************************************/
-
- void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable)
- {
- vu32 *P = &rHCLK_GATE;
-
- if(CLK_DIV & 0x80) //SCLK
- {
- P = &rSCLK_GATE;
- CLK_DIV -= 0x80; //去掉標示
- }
- else if(CLK_DIV & 0x40) //PCLK
- {
- P = &rPCLK_GATE;
- CLK_DIV -= 0x40; //去掉標示
- }
- if(Enable == ENABLE) //使能
- *P |= 1 << CLK_DIV;
- else //失能
- *P &= ~(1 << CLK_DIV);
- }
-
-
-
- /*************************************************************************************************************************
- *函數 : void Set_INTtoIRQ(u8 INT_N)
- *功能 : 設置一個中斷為IRQ
- *參數 : INT_N:中斷編號(見:中斷源編號定義);
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120305
- *最後修改時間: 20120305
- *說明 : 設置一個中斷為普通中斷模式
- *************************************************************************************************************************/
- 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);
- }
-
-
- /*************************************************************************************************************************
- *函數 : void Set_INTtoFIQ(u8 INT_N)
- *功能 : 設置一個中斷為FIQ
- *參數 : INT_N:中斷編號(見:中斷源編號定義);
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120305
- *最後修改時間: 20120305
- *說明 : 設置一個中斷為快速中斷模式
- *************************************************************************************************************************/
- 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);
- }
-
-
- /*************************************************************************************************************************
- *函數 : void Set_IntEnable(u8 INT_N,FunctionalState EnInt)
- *功能 : 開啟或關閉一個VIC中斷
- *參數 : INT_N:中斷編號(見:中斷源編號定義),
- * EnInt = ENABLE,1使能;=DISABLE,0失能;
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 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無影響
- }
-
-
- /*************************************************************************************************************************
- *函數 : u8 Get_IntEnable(vu8 INT_N)
- *功能 : 獲取一個中斷屏蔽狀態
- *參數 : 中斷編號
- *返回 : 1:該中斷失能,0:該中斷失能
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120524
- *最後修改時間: 20120524
- *說明 : 獲取一個中斷屏蔽狀態
- *************************************************************************************************************************/
- 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;
- }
-
-
- /*************************************************************************************************************************
- *函數 : void Set_SoftInt(u8 INT_N,u8 ENABLE)
- *功能 : 開啟或關閉一個軟件中斷
- *參數 : INT_N:中斷編號(見:中斷源編號定義),ENABLE = Enable,1使能;=Disable,0失能;
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 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無影響
- }
-
-
-
- /*************************************************************************************************************************
- *函數 : void Set_IsrAddr(u8 INT_N,vu32 IsrAdd)
- *功能 : 設置中斷矢量入口
- *參數 : INT_N:中斷編號(見:中斷源編號定義),IsrAdd:中斷服務程序指針;
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120305
- *最後修改時間: 20120311
- *說明 : 設置矢量地址寄存器
- *************************************************************************************************************************/
- 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;//將中斷服務程序入口地址寫入矢量地址寄存器
- }
-
-
- /*************************************************************************************************************************
- *函數 : void Set_VectorPriority(u8 INT_N,u8 Priority)
- *功能 : 設置矢量優先級
- *參數 : INT_N:中斷編號(見:中斷源編號定義),Priority:優先級0-15;
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120305
- *最後修改時間: 20120305
- *說明 : 優先級為0-15,值越大優先級越高,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;//將中斷優先級寫入寄存器
- }
-
-
-
-
-
- /*************************************************************************************************************************
- *函數 : u32 Get_PLLCLK(int pllreg)
- *功能 : 獲取PLL時鐘頻率
- *參數 : pllreg : PLL選擇
- APLL 0 //ARM內核時鐘PLL
- MPLL 1 //主時鐘PLL
- EPLL 2 //外設時鐘PLL
- *返回 : 頻率,HZ
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 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))));
- }
-
-
- /*************************************************************************************************************************
- *函數 : u32 Get_FCLK(void)
- *功能 : 獲取FCLK時鐘頻率
- *參數 : 無
- *返回 : 頻率,HZ
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 20120526
- *最後修改時間: 20120526
- *說明 : 無
- *************************************************************************************************************************/
- u32 Get_FCLK(void)
- {
- return (Get_PLLCLK(APLL));
- }
-
-
-
- /*************************************************************************************************************************
- *函數 : u32 Get_PCLK(void)
- *功能 : 獲取PCLK時鐘頻率
- *參數 : 無
- *返回 : 頻率,HZ
- *依賴 : 底層宏定義
- *作者 : [email protected]
- *時間 : 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"
- #include <locale.h>
- u8 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.c
* 功能: S3C6410相關系統函數
* 作者: [email protected]
* 創建時間: 2012年3月4日11:25
* 最後修改時間:2012年3月4日
* 詳細: 2012年3月5日17:00 添加VIC相關函數
*************************************************************************************************************/
#include "system.h"
/*************************************************************************************************************************
*函數 : void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger)
*功能 : 設置外部中斷組0觸發模式
*參數 : EINT0_N:中斷源的編號(見:中斷組0編號定義);Trigger:觸發模式(EXT_LowLevel:低電平觸發;EXT_HighLevel:高電平觸發;
EXT_NegEdge:下降沿觸發;EXT_PosEdge:上升沿觸發;EXT_Edge:邊沿觸發)
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120304
*最後修改時間: 20120304
*說明 : 編號 GPN0--->GPN15 GPL8--->GPL14 GPM0--->GPM4,中斷設置必須兩個兩個一起
*************************************************************************************************************************/
void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger)
{
if(EINT0_N & 0x80) //EINT0CON1
{
EINT0_N -= 0x80;//減去標記
rEINT0CON1 &= ~(7 << EINT0_N);//清楚原來的設置
rEINT0CON1 |= Trigger << EINT0_N;
}
else //EINT0CON0
{
rEINT0CON0 &= ~(7 << EINT0_N);//清楚原來的設置
rEINT0CON0 |= Trigger << EINT0_N;
}
}
/*************************************************************************************************************************
*函數 : void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable)
*功能 : CLK時鐘門控設置(HCLK,PCLK,SCLK)
*參數 : CLK_DIV:外設(見:CLK門控時鐘定義);Enable = ENABLE,1使能;=DISABLE,0失能
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120305
*最後修改時間: 20121005
*說明 : PCLK_GATE添加標識0x40,SCLK_GATE添加標示0x80;
*************************************************************************************************************************/
void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable)
{
vu32 *P = &rHCLK_GATE;
if(CLK_DIV & 0x80) //SCLK
{
P = &rSCLK_GATE;
CLK_DIV -= 0x80; //去掉標示
}
else if(CLK_DIV & 0x40) //PCLK
{
P = &rPCLK_GATE;
CLK_DIV -= 0x40; //去掉標示
}
if(Enable == ENABLE) //使能
*P |= 1 << CLK_DIV;
else //失能
*P &= ~(1 << CLK_DIV);
}
/*************************************************************************************************************************
*函數 : void Set_INTtoIRQ(u8 INT_N)
*功能 : 設置一個中斷為IRQ
*參數 : INT_N:中斷編號(見:中斷源編號定義);
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120305
*最後修改時間: 20120305
*說明 : 設置一個中斷為普通中斷模式
*************************************************************************************************************************/
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);
}
/*************************************************************************************************************************
*函數 : void Set_INTtoFIQ(u8 INT_N)
*功能 : 設置一個中斷為FIQ
*參數 : INT_N:中斷編號(見:中斷源編號定義);
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120305
*最後修改時間: 20120305
*說明 : 設置一個中斷為快速中斷模式
*************************************************************************************************************************/
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);
}
/*************************************************************************************************************************
*函數 : void Set_IntEnable(u8 INT_N,FunctionalState EnInt)
*功能 : 開啟或關閉一個VIC中斷
*參數 : INT_N:中斷編號(見:中斷源編號定義),
* EnInt = ENABLE,1使能;=DISABLE,0失能;
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 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無影響
}
/*************************************************************************************************************************
*函數 : u8 Get_IntEnable(vu8 INT_N)
*功能 : 獲取一個中斷屏蔽狀態
*參數 : 中斷編號
*返回 : 1:該中斷失能,0:該中斷失能
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120524
*最後修改時間: 20120524
*說明 : 獲取一個中斷屏蔽狀態
*************************************************************************************************************************/
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;
}
/*************************************************************************************************************************
*函數 : void Set_SoftInt(u8 INT_N,u8 ENABLE)
*功能 : 開啟或關閉一個軟件中斷
*參數 : INT_N:中斷編號(見:中斷源編號定義),ENABLE = Enable,1使能;=Disable,0失能;
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 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無影響
}
/*************************************************************************************************************************
*函數 : void Set_IsrAddr(u8 INT_N,vu32 IsrAdd)
*功能 : 設置中斷矢量入口
*參數 : INT_N:中斷編號(見:中斷源編號定義),IsrAdd:中斷服務程序指針;
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120305
*最後修改時間: 20120311
*說明 : 設置矢量地址寄存器
*************************************************************************************************************************/
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;//將中斷服務程序入口地址寫入矢量地址寄存器
}
/*************************************************************************************************************************
*函數 : void Set_VectorPriority(u8 INT_N,u8 Priority)
*功能 : 設置矢量優先級
*參數 : INT_N:中斷編號(見:中斷源編號定義),Priority:優先級0-15;
*返回 : 無
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120305
*最後修改時間: 20120305
*說明 : 優先級為0-15,值越大優先級越高,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;//將中斷優先級寫入寄存器
}
/*************************************************************************************************************************
*函數 : u32 Get_PLLCLK(int pllreg)
*功能 : 獲取PLL時鐘頻率
*參數 : pllreg : PLL選擇
APLL 0 //ARM內核時鐘PLL
MPLL 1 //主時鐘PLL
EPLL 2 //外設時鐘PLL
*返回 : 頻率,HZ
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 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))));
}
/*************************************************************************************************************************
*函數 : u32 Get_FCLK(void)
*功能 : 獲取FCLK時鐘頻率
*參數 : 無
*返回 : 頻率,HZ
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 20120526
*最後修改時間: 20120526
*說明 : 無
*************************************************************************************************************************/
u32 Get_FCLK(void)
{
return (Get_PLLCLK(APLL));
}
/*************************************************************************************************************************
*函數 : u32 Get_PCLK(void)
*功能 : 獲取PCLK時鐘頻率
*參數 : 無
*返回 : 頻率,HZ
*依賴 : 底層宏定義
*作者 : [email protected]
*時間 : 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"
#include <locale.h>
u8 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
[cpp] view plaincopyprint?
- /*************************************************************************************************************
- * 文件名: system.h
- * 功能: S3C6410相關系統函數
- * 作者: [email protected]
- * 創建時間: 2012年3月4日11:25
- * 最後修改時間:2012年3月4日
- * 詳細: 相關系統操作宏定義
- *************************************************************************************************************/
-
- #ifndef _SYSTEM_H_
- #define _SYSTEM_H_
-
- #include "sys_types.h"
- #include "stdio.h"
- #include "s3c6410_map.h"
-
- #define Debug printf //調試支持
-
- #define nop __nop() //空指令延時一個系統時鐘周期
-
-
-
- //相關外部函數申明
- void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger);//設置外部中斷組0觸發模式
- void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable); //CLK時鐘門控設置(HCLK,PCLK,SCLK)
- void Set_INTtoIRQ(vu8 INT_N); //設置一個中斷為IRQ
- void Set_INTtoFIQ(vu8 INT_N); //設置一個中斷為FIQ
- void Set_IntEnable(vu8 INT_N,FunctionalState EnInt); //開啟或關閉一個VIC中斷
- void Set_SoftInt(vu8 INT_N,vu8 ENABLE); //開啟或關閉一個軟件中斷
- void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd); //設置中斷矢量入口
- void Set_VectorPriority(vu8 INT_N,vu8 Priority); //設置矢量優先級
- u8 Get_IntEnable(vu8 INT_N); //獲取一個中斷屏蔽狀態
- u32 Get_PCLK(void); //獲取PCLK時鐘頻率
- u32 Get_FCLK(void); //獲取FCLK時鐘頻率
- u32 Get_PLLCLK(u8 pllreg); //獲取PLL時鐘頻率
-
- //相關外部全局變量聲明
- extern u8 PrintfSet; //0:定義printf到串口;1:定義printf到液晶
-
- //IO模式宏定義
- #define IO_IN_PUT 0 //輸入模式
- #define IO_OUT_PUT 1 //輸出模式
- #define IO_SF_MODE 2 //特殊模式,復用功能
- #define IO_EXT_INT 7 //外部中斷輸入模式
- #define IO_NO_UP 0 //禁止上拉,下拉
- #define IO_DROP_DOWM 1 //下拉
- #define IO_PULL_UP 2 //上拉
-
- //外部中斷觸發模式定義
- #define EXT_LowLevel 0 //低電平觸發
- #define EXT_HighLevel 1 //高電平觸發
- #define EXT_NegEdge 2 //下降沿觸發
- #define EXT_PosEdge 4 //上升沿觸發
- #define EXT_Edge 6 //邊沿觸發
-
- //使能printf輸出
- //0:關閉printf輸出;1:使能printf到串口;2:使能printf到液晶;3:同時使能printf到串口和液晶
- #define PRINTF_EN_ 3
-
-
-
- //中斷組0編號定義
- // 外部中斷組0的IO 偏移+標示 中斷組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,如果區域為‘1’,則HCLK被提供,否則,HCLK被屏蔽。當S3C6410
- 轉換成掉電模式時,系統控制器檢查一些模塊(IROM,MEM0,MEM1和MFC模塊)的狀態。因此,位25,22,
- 21,0必須為‘1’,以符合掉電的要求。
- HCLK_GATE 位 描述 初始狀態*/
- #define HCLK_UHOST 29 //為UHOST 選通HCLK(0:屏蔽,1:通過)。 1
- #define HCLK_SECUR 28 //為安全子系統選通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 //為相機接口選通HCLK(0:屏蔽,1:通過)。 1
- #define HCLK_SCALER 9 //為定標器選通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 //為旋轉器選通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 位 描述 初始狀態
- #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 發送器選通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 位 描述 初始狀態
- #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) // 為定標器選通特殊時鐘 (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) // 為相機接口選通特殊時鐘 (0:屏蔽,1:通過)。 1
- #define SCLK_JPEG (0x80 | 1) // 為JPEG 選通特殊時鐘 (0:屏蔽,1:通過)。 1
-
- //中斷源編號定義
- /* S3C6410X 支持64 位中斷源,不支持ARM1176HZF-S 鏡像中斷運行.
-
- 中斷源 中斷號 描述 組*/
- #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 //主機接口中斷 VIC1
- #define INT_MSM 54 //MSM 調制解調器 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 主機中斷 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 中斷.系統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 轉換器中斷. VIC0
- #define INT_TVENC 12 //TV 編碼器中斷. VIC0
- #define INT_2D 11 //2D 中斷. VIC0
- #define INT_ROTATOR 10 //旋轉器中斷. 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 //照相機接口中斷 VIC0
- #define INT_CAMIF_C 3 //照相機接口中斷 VIC0
- #define INT_RTC_TIC 2 //RTC TIC 中斷 VIC0
- #define INT_EINT1 1 //外部中斷4~11 VIC0
- #define INT_EINT0 0 //外部中斷0~3 VIC0
-
-
-
-
-
-
-
- /*************************************************************************************************/
- /* 對應位聲明,方便位操作 */
- #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內核時鐘PLL
- #define MPLL 1 //主時鐘PLL
- #define EPLL 2 //外設時鐘PLL
-
- //主時鐘輸入
- #define SYSTEM_MAIN_CLK_IN 12000000 //12MHZ
-
- /*************************************************************************************************************************
- *函數 : __inline void VICInterruptEnd(void)
- *功能 : 在中斷快要結束時清除中斷
- *參數 : 無
- *返回 : 無
- *依賴 : 底層宏定義
- *作者 : 陳鵬
- *時間 : 20120305
- *最後修改時間: 20120305
- *說明 : 寫入任何數據清除中斷,只有在中斷服務程序中才可讀,結束時才寫
- 兩個要一起清除,否則可能導致無法再次進入中斷,無意間發現的
- *************************************************************************************************************************/
- __inline void VICInterruptEnd(void)
- {
- VIC0->ADDRESS = 0xffffffff; //寫入任何值都可以清除當前中斷
- VIC1->ADDRESS = 0xffffffff; //寫入任何值都可以清除當前中斷
- }
-
-
- //通道選擇
- #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("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG輸出
- #endif
-
-
- //printf輸出定義
- #if (PRINTF_EN_ == 2) //使能到液晶
- #define lcd_printf(format,...) (printf(format, ##__VA_ARGS__)) //LCD打印
- #define DEBUG(format,...) (printf("<DebugFile: "__FILE__", Line: %d> "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("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__) //DEBUG輸出
- #endif
-
- #endif