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