S3C6410裸机程序相关系统函数


S3C6410裸机程序中可能用到的文件以及函数

//system.c

  1. /************************************************************************************************************* 
  2.  * 文件名: system.c 
  3.  * 功能:      S3C6410相关系统函数 
  4.  * 作者:      cp1300@139.com 
  5.  * 创建时间:    2012年3月4日11:25 
  6.  * 最后修改时间:2012年3月4日 
  7.  * 详细:      2012年3月5日17:00 添加VIC相关函数 
  8. *************************************************************************************************************/ 
  9. #include "system.h"  
  10.  
  11.  
  12. /************************************************************************************************************************* 
  13. *函数        :    void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger) 
  14. *功能        :    设置外部中断组0触发模式 
  15. *参数        :    EINT0_N:中断源的编号(见:中断组0编号定义);Trigger:触发模式(EXT_LowLevel:低电平触发;EXT_HighLevel:高电平触发; 
  16.                     EXT_NegEdge:下降沿触发;EXT_PosEdge:上升沿触发;EXT_Edge:边沿触发) 
  17. *返回        :    无 
  18. *依赖        :    底层宏定义 
  19. *作者        :    cp1300@139.com 
  20. *时间        :    20120304 
  21. *最后修改时间:    20120304 
  22. *说明        :    编号 GPN0--->GPN15  GPL8--->GPL14  GPM0--->GPM4,中断设置必须两个两个一起 
  23. *************************************************************************************************************************/ 
  24. void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger) 
  25. {     
  26.     if(EINT0_N & 0x80) //EINT0CON1  
  27.     { 
  28.         EINT0_N -= 0x80;//减去标记  
  29.         rEINT0CON1 &= ~(7 << EINT0_N);//清楚原来的设置  
  30.         rEINT0CON1 |= Trigger << EINT0_N; 
  31.     } 
  32.     else    //EINT0CON0  
  33.     { 
  34.         rEINT0CON0 &= ~(7 << EINT0_N);//清楚原来的设置  
  35.         rEINT0CON0 |= Trigger << EINT0_N; 
  36.     } 
  37.  
  38.  
  39.  
  40. /************************************************************************************************************************* 
  41. *函数        :    void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable) 
  42. *功能        :  CLK时钟门控设置(HCLK,PCLK,SCLK) 
  43. *参数        :  CLK_DIV:外设(见:CLK门控时钟定义);Enable = ENABLE,1使能;=DISABLE,0失能 
  44. *返回        :  无 
  45. *依赖        :    底层宏定义 
  46. *作者        :  cp1300@139.com 
  47. *时间        :    20120305 
  48. *最后修改时间:    20121005 
  49. *说明        :  PCLK_GATE添加标识0x40,SCLK_GATE添加标示0x80; 
  50. *************************************************************************************************************************/ 
  51.  
  52. void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable) 
  53.     vu32 *P = &rHCLK_GATE; 
  54.      
  55.     if(CLK_DIV & 0x80)      //SCLK  
  56.     { 
  57.         P = &rSCLK_GATE; 
  58.         CLK_DIV -= 0x80;    //去掉标示  
  59.     } 
  60.     else if(CLK_DIV & 0x40) //PCLK  
  61.     { 
  62.         P = &rPCLK_GATE; 
  63.         CLK_DIV -= 0x40;    //去掉标示  
  64.     } 
  65.     if(Enable == ENABLE)    //使能  
  66.         *P |= 1 << CLK_DIV; 
  67.     else        //失能  
  68.         *P &= ~(1 << CLK_DIV); 
  69.  
  70.  
  71.  
  72. /************************************************************************************************************************* 
  73. *函数        :    void Set_INTtoIRQ(u8 INT_N) 
  74. *功能        :  设置一个中断为IRQ 
  75. *参数        :  INT_N:中断编号(见:中断源编号定义); 
  76. *返回        :  无 
  77. *依赖        :    底层宏定义 
  78. *作者        :  cp1300@139.com 
  79. *时间        :    20120305 
  80. *最后修改时间:    20120305 
  81. *说明        :  设置一个中断为普通中断模式 
  82. *************************************************************************************************************************/ 
  83. void Set_INTtoIRQ(vu8 INT_N) 
  84.     if(INT_N > 31)   //VIC1  
  85.     { 
  86.         INT_N -= 32; 
  87.         VIC1->INTSELECT &= ~(1 << INT_N); 
  88.     } 
  89.     else            //VIC0  
  90.         VIC0->INTSELECT &= ~(1 << INT_N); 
  91.  
  92.  
  93. /************************************************************************************************************************* 
  94. *函数        :    void Set_INTtoFIQ(u8 INT_N) 
  95. *功能        :  设置一个中断为FIQ 
  96. *参数        :  INT_N:中断编号(见:中断源编号定义); 
  97. *返回        :  无 
  98. *依赖        :    底层宏定义 
  99. *作者        :  cp1300@139.com 
  100. *时间        :    20120305 
  101. *最后修改时间:    20120305 
  102. *说明        :  设置一个中断为快速中断模式 
  103. *************************************************************************************************************************/ 
  104. void Set_INTtoFIQ(vu8 INT_N) 
  105.     if(INT_N > 31)   //VIC1  
  106.     { 
  107.         INT_N -= 32; 
  108.         VIC1->INTSELECT |= (1 << INT_N); 
  109.     } 
  110.     else            //VIC0  
  111.         VIC0->INTSELECT |= (1 << INT_N); 
  112.  
  113.  
  114. /************************************************************************************************************************* 
  115. *函数        :    void Set_IntEnable(u8 INT_N,FunctionalState EnInt) 
  116. *功能        :  开启或关闭一个VIC中断 
  117. *参数        :  INT_N:中断编号(见:中断源编号定义), 
  118. *           EnInt = ENABLE,1使能;=DISABLE,0失能; 
  119. *返回        :  无 
  120. *依赖        :    底层宏定义 
  121. *作者        :  cp1300@139.com 
  122. *时间        :    20120305 
  123. *最后修改时间:    20120305 
  124. *说明        :  使能或失能VIC0,VIC1的一个中断 
  125. *************************************************************************************************************************/ 
  126. void Set_IntEnable(vu8 INT_N,FunctionalState EnInt) 
  127.     VICx_TypeDef *P = VIC0; 
  128.      
  129.     if(INT_N > 31)   //VIC1  
  130.     { 
  131.         INT_N -= 32; 
  132.         P = VIC1; 
  133.     }   
  134.     if(EnInt == ENABLE) //使能中断  
  135.         P->INTENABLE = 1 << INT_N; //写1使能中断,写0无影响  
  136.     else        //取消中断  
  137.         P->INTENCLEAR = 1 << INT_N;    //写1清除中断使能,写0无影响  
  138.  
  139.  
  140. /************************************************************************************************************************* 
  141. *函数        :    u8 Get_IntEnable(vu8 INT_N) 
  142. *功能        :  获取一个中断屏蔽状态 
  143. *参数        :  中断编号 
  144. *返回        :  1:该中断失能,0:该中断失能 
  145. *依赖        :    底层宏定义 
  146. *作者        :  cp1300@139.com 
  147. *时间        :    20120524 
  148. *最后修改时间:    20120524 
  149. *说明        :  获取一个中断屏蔽状态 
  150. *************************************************************************************************************************/ 
  151. u8 Get_IntEnable(vu8 INT_N) 
  152.     VICx_TypeDef *P = VIC0; 
  153.      
  154.     if(INT_N > 31)   //VIC1  
  155.     { 
  156.         INT_N -= 32; 
  157.         P = VIC1; 
  158.     }   
  159.     if(P->INTENABLE & (1 << INT_N)) //该中断使能  
  160.         return 1; 
  161.     else   
  162.         return 0; 
  163.  
  164.  
  165. /************************************************************************************************************************* 
  166. *函数        :    void Set_SoftInt(u8 INT_N,u8 ENABLE) 
  167. *功能        :  开启或关闭一个软件中断 
  168. *参数        :  INT_N:中断编号(见:中断源编号定义),ENABLE = Enable,1使能;=Disable,0失能; 
  169. *返回        :  无 
  170. *依赖        :    底层宏定义 
  171. *作者        :  cp1300@139.com 
  172. *时间        :    20120305 
  173. *最后修改时间:    20120305 
  174. *说明        :  使能或失能VIC0,VIC1的一个软件中断 
  175. *************************************************************************************************************************/ 
  176. void Set_SoftInt(vu8 INT_N,vu8 ENABLE) 
  177.     VICx_TypeDef *P = VIC0; 
  178.      
  179.     if(INT_N > 31)   //VIC1  
  180.     { 
  181.         INT_N -= 32; 
  182.         P = VIC1; 
  183.     }   
  184.     if(ENABLE) //使能中断  
  185.         P->SOFTINT = 1 << INT_N;   //写1使能软件中断,写0无影响  
  186.     else        //取消中断  
  187.         P->SOFTINTCLEAR = 1 << INT_N;  //写1清除软件中断使能,写0无影响  
  188.  
  189.  
  190.  
  191. /************************************************************************************************************************* 
  192. *函数        :    void Set_IsrAddr(u8 INT_N,vu32 IsrAdd) 
  193. *功能        :  设置中断矢量入口 
  194. *参数        :  INT_N:中断编号(见:中断源编号定义),IsrAdd:中断服务程序指针; 
  195. *返回        :  无 
  196. *依赖        :    底层宏定义 
  197. *作者        :  cp1300@139.com 
  198. *时间        :    20120305 
  199. *最后修改时间:    20120311 
  200. *说明        :  设置矢量地址寄存器 
  201. *************************************************************************************************************************/ 
  202. void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd) 
  203.     VICx_TypeDef *P = VIC0; 
  204.      
  205.     if(INT_N > 31)   //VIC1  
  206.     { 
  207.         INT_N -= 32; 
  208.         P = VIC1; 
  209.     } 
  210.     P->VECTADDR[INT_N] = IsrAdd;//将中断服务程序入口地址写入矢量地址寄存器  
  211.  
  212.  
  213. /************************************************************************************************************************* 
  214. *函数        :    void Set_VectorPriority(u8 INT_N,u8 Priority) 
  215. *功能        :  设置矢量优先级 
  216. *参数        :  INT_N:中断编号(见:中断源编号定义),Priority:优先级0-15; 
  217. *返回        :  无 
  218. *依赖        :    底层宏定义 
  219. *作者        :  cp1300@139.com 
  220. *时间        :    20120305 
  221. *最后修改时间:    20120305 
  222. *说明        :  优先级为0-15,值越大优先级越高,15最高,0最低; 
  223. *************************************************************************************************************************/ 
  224. void Set_VectorPriority(vu8 INT_N,vu8 Priority) 
  225.     VICx_TypeDef *P = VIC0; 
  226.      
  227.     if(INT_N > 31)   //VIC1  
  228.     { 
  229.         INT_N -= 32; 
  230.         P = VIC1; 
  231.     } 
  232.     P->VECTRPRIORITY[INT_N] = Priority;//将中断优先级写入寄存器  
  233.  
  234.  
  235.  
  236.  
  237.  
  238. /************************************************************************************************************************* 
  239. *函数        :    u32 Get_PLLCLK(int pllreg) 
  240. *功能        :  获取PLL时钟频率 
  241. *参数        :  pllreg : PLL选择 
  242.                     APLL    0   //ARM内核时钟PLL 
  243.                     MPLL    1   //主时钟PLL 
  244.                     EPLL    2   //外设时钟PLL 
  245. *返回        :  频率,HZ 
  246. *依赖        :    底层宏定义 
  247. *作者        :  cp1300@139.com 
  248. *时间        :    20120526 
  249. *最后修改时间:    20120526 
  250. *说明        :  无 
  251. *************************************************************************************************************************/ 
  252. u32 Get_PLLCLK(u8 pllreg) 
  253.     u32 r = 0, m, p, s; 
  254.  
  255.     if (pllreg == APLL) 
  256.         r = rAPLL_CON; 
  257.     else if (pllreg == MPLL) 
  258.         r = rMPLL_CON; 
  259.     else if (pllreg == EPLL) 
  260.         r = rEPLL_CON0; 
  261.  
  262.     m = (r>>16) & 0x3ff; 
  263.     p = (r>>8) & 0x3f; 
  264.     s = r & 0x7; 
  265.  
  266.     return (m * (SYSTEM_MAIN_CLK_IN / (p * (1 << s)))); 
  267.  
  268.  
  269. /************************************************************************************************************************* 
  270. *函数        :    u32 Get_FCLK(void) 
  271. *功能        :  获取FCLK时钟频率 
  272. *参数        :  无 
  273. *返回        :  频率,HZ 
  274. *依赖        :    底层宏定义 
  275. *作者        :  cp1300@139.com 
  276. *时间        :    20120526 
  277. *最后修改时间:    20120526 
  278. *说明        :  无 
  279. *************************************************************************************************************************/ 
  280. u32 Get_FCLK(void
  281.     return (Get_PLLCLK(APLL)); 
  282.  
  283.  
  284.  
  285. /************************************************************************************************************************* 
  286. *函数        :    u32 Get_PCLK(void) 
  287. *功能        :  获取PCLK时钟频率 
  288. *参数        :  无 
  289. *返回        :  频率,HZ 
  290. *依赖        :    底层宏定义 
  291. *作者        :  cp1300@139.com 
  292. *时间        :    20120526 
  293. *最后修改时间:    20120526 
  294. *说明        :  无 
  295. *************************************************************************************************************************/ 
  296. u32 Get_PCLK(void
  297.     u32 fclk; 
  298.     u32 hclkx2_div = ((rCLK_DIV0 >> 9) & 0x7) + 1; 
  299.     u32 pre_div = ((rCLK_DIV0 >> 12) & 0xf) + 1; 
  300.  
  301.     if(rOTHERS & 0x80) 
  302.         fclk = Get_FCLK();      // SYNC Mode  
  303.     else 
  304.         fclk = Get_PLLCLK(MPLL);    // ASYNC Mode  
  305.  
  306.     return fclk/(hclkx2_div * pre_div); 
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319. //////////////////////////////////////////////////////////////////  
  320. //???????′???,???printf????,  
  321. //PRINTF_EN == 1,?????printf??????  
  322. #if (PRINTF_EN_ == 1)  
  323. #include "uart.h"   
  324.  
  325. int fputc(int ch,FILE *f) 
  326. {       
  327.     UART0_SendByte((u8)ch);       
  328.     return ch; 
  329. #endif  
  330.  
  331. //PRINTF_EN == 2,?????printf?????  
  332. #if (PRINTF_EN_== 2)  
  333. #include "tft_lcd.h"  
  334.  
  335. int fputc(int ch, FILE *f) 
  336. {     
  337.     static u16 X; 
  338.     static u16 X1; 
  339.     static u16 Y; 
  340.     static u8 flag; 
  341.      
  342.     if(flag == 0) 
  343.     { 
  344.         if(Y > LCD_YSIZE-1-16) 
  345.         { 
  346.              
  347.             Y = 0; 
  348.             X = X1 = LCD_XSIZE/2; 
  349.             flag = 1; 
  350.             LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);  //????????  
  351.         } 
  352.     } 
  353.     else 
  354.     { 
  355.         if(Y > LCD_YSIZE-1-16) 
  356.         { 
  357.             Y = 0; 
  358.             X = X1 = 0; 
  359.             flag = 0; 
  360.             LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????  
  361.         } 
  362.     } 
  363.      
  364.      
  365.     if((u8)ch == '\n'
  366.     { 
  367.         X = X1; 
  368.         Y += 12; 
  369.     } 
  370.     else if((u8)ch > 0x80) //????  
  371.     { 
  372.         return ch; 
  373.     } 
  374.     else 
  375.     { 
  376.         LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80); 
  377.          
  378.         if(flag == 0) 
  379.         { 
  380.             if(X > LCD_XSIZE/2-1-8) 
  381.             { 
  382.                 X = X1; 
  383.                 Y += 12; 
  384.             } 
  385.             else 
  386.                 X += 8; 
  387.         } 
  388.         else 
  389.         { 
  390.             if(X > LCD_XSIZE-1-8) 
  391.             { 
  392.                 X = X1; 
  393.                 Y += 12; 
  394.             } 
  395.             else 
  396.                 X += 8; 
  397.         } 
  398.     }       
  399.  
  400.     return ch; 
  401. #endif  
  402.  
  403.  
  404. //PRINTF_EN == 3,???????printf??????????  
  405. #if (PRINTF_EN_ == 3)  
  406. #include "tft_lcd.h"  
  407. #include "uart.h"  
  408. #include <locale.h>  
  409. u8 PrintfSet = 0;   //0:????printf??????;1:????printf?????  
  410.  
  411. int fputc(int ch, FILE *f) 
  412. {     
  413.     static u16 X; 
  414.     static u16 X1; 
  415.     static u16 Y; 
  416.     static u8 flag; 
  417.      
  418.     if(PrintfSet) 
  419.     { 
  420.         if(flag == 0) 
  421.         { 
  422.             if(Y > LCD_YSIZE-1-16) 
  423.             { 
  424.                  
  425.                 Y = 0; 
  426.                 X = X1 = LCD_XSIZE/2; 
  427.                 flag = 1; 
  428.                 LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);  //????????  
  429.             } 
  430.         } 
  431.         else 
  432.         { 
  433.             if(Y > LCD_YSIZE-1-16) 
  434.             { 
  435.                 Y = 0; 
  436.                 X = X1 = 0; 
  437.                 flag = 0; 
  438.                 LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????  
  439.             } 
  440.         } 
  441.          
  442.          
  443.         if((u8)ch == '\n'
  444.         { 
  445.             X = X1; 
  446.             Y += 12; 
  447.         } 
  448.         else if((u8)ch > 0x80) //????  
  449.         { 
  450.             return ch; 
  451.         } 
  452.         else 
  453.         { 
  454.             LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80); 
  455.              
  456.             if(flag == 0) 
  457.             { 
  458.                 if(X > LCD_XSIZE/2-1-8) 
  459.                 { 
  460.                     X = X1; 
  461.                     Y += 12; 
  462.                 } 
  463.                 else 
  464.                     X += 8; 
  465.             } 
  466.             else 
  467.             { 
  468.                 if(X > LCD_XSIZE-1-8) 
  469.                 { 
  470.                     X = X1; 
  471.                     Y += 12; 
  472.                 } 
  473.                 else 
  474.                     X += 8; 
  475.             } 
  476.         } 
  477.     } 
  478.     else 
  479.         UART0_SendByte((u8)ch); 
  480.  
  481.     return ch; 
  482. #endif 


//system.h

 

 

[cpp] view plaincopyprint?
  1. /************************************************************************************************************* 
  2.  * 文件名: system.h 
  3.  * 功能:      S3C6410相关系统函数 
  4.  * 作者:      cp1300@139.com 
  5.  * 创建时间:    2012年3月4日11:25 
  6.  * 最后修改时间:2012年3月4日 
  7.  * 详细:      相关系统操作宏定义 
  8. *************************************************************************************************************/ 
  9.  
  10. #ifndef _SYSTEM_H_  
  11. #define _SYSTEM_H_   
  12.  
  13. #include "sys_types.h"  
  14. #include "stdio.h"  
  15. #include "s3c6410_map.h"  
  16.  
  17. #define Debug printf    //调试支持  
  18.  
  19. #define nop __nop()     //空指令延时一个系统时钟周期  
  20.  
  21.  
  22.  
  23. //相关外部函数申明  
  24. void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger);//设置外部中断组0触发模式  
  25. void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable);   //CLK时钟门控设置(HCLK,PCLK,SCLK)  
  26. void Set_INTtoIRQ(vu8 INT_N);   //设置一个中断为IRQ  
  27. void Set_INTtoFIQ(vu8 INT_N);   //设置一个中断为FIQ  
  28. void Set_IntEnable(vu8 INT_N,FunctionalState EnInt);    //开启或关闭一个VIC中断  
  29. void Set_SoftInt(vu8 INT_N,vu8 ENABLE); //开启或关闭一个软件中断  
  30. void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd);    //设置中断矢量入口  
  31. void Set_VectorPriority(vu8 INT_N,vu8 Priority);    //设置矢量优先级  
  32. u8 Get_IntEnable(vu8 INT_N);    //获取一个中断屏蔽状态  
  33. u32 Get_PCLK(void);         //获取PCLK时钟频率  
  34. u32 Get_FCLK(void);         //获取FCLK时钟频率  
  35. u32 Get_PLLCLK(u8 pllreg);  //获取PLL时钟频率  
  36.  
  37. //相关外部全局变量声明  
  38. extern u8 PrintfSet;    //0:定义printf到串口;1:定义printf到液晶  
  39.  
  40. //IO模式宏定义  
  41. #define IO_IN_PUT       0   //输入模式  
  42. #define IO_OUT_PUT      1   //输出模式  
  43. #define IO_SF_MODE      2   //特殊模式,复用功能  
  44. #define IO_EXT_INT      7   //外部中断输入模式  
  45. #define IO_NO_UP        0   //禁止上拉,下拉  
  46. #define IO_DROP_DOWM    1   //下拉  
  47. #define IO_PULL_UP      2   //上拉  
  48.  
  49. //外部中断触发模式定义  
  50. #define EXT_LowLevel    0   //低电平触发  
  51. #define EXT_HighLevel   1   //高电平触发  
  52. #define EXT_NegEdge     2   //下降沿触发  
  53. #define EXT_PosEdge     4   //上升沿触发  
  54. #define EXT_Edge        6   //边沿触发  
  55.  
  56. //使能printf输出  
  57. //0:关闭printf输出;1:使能printf到串口;2:使能printf到液晶;3:同时使能printf到串口和液晶  
  58. #define PRINTF_EN_      3  
  59.  
  60.  
  61.  
  62. //中断组0编号定义  
  63. //   外部中断组0的IO  偏移+标示   中断组0中的编号  
  64. #define EINT0_GPN0      0           //0  
  65. #define EINT0_GPN1      0           //1  
  66. #define EINT0_GPN2      4           //2  
  67. #define EINT0_GPN3      4           //3  
  68. #define EINT0_GPN4      8           //4  
  69. #define EINT0_GPN5      8           //5  
  70. #define EINT0_GPN6      12          //6   
  71. #define EINT0_GPN7      12          //7  
  72. #define EINT0_GPN8      16          //8  
  73. #define EINT0_GPN9      16          //9  
  74. #define EINT0_GPN10     20          //10  
  75. #define EINT0_GPN11     20          //11  
  76. #define EINT0_GPN12     24          //12  
  77. #define EINT0_GPN13     24          //13  
  78. #define EINT0_GPN14     28          //14  
  79. #define EINT0_GPN15     28          //15  
  80. #define EINT0_GPL8      (0x80 + 0)  //16  
  81. #define EINT0_GPL9      (0x80 + 0)  //17  
  82. #define EINT0_GPL10     (0x80 + 4)  //18  
  83. #define EINT0_GPL11     (0x80 + 4)  //19  
  84. #define EINT0_GPL12     (0x80 + 8)  //20  
  85. #define EINT0_GPL13     (0x80 + 8)  //21  
  86. #define EINT0_GPL14     (0x80 + 12) //22  
  87. #define EINT0_GPM0      (0x80 + 12) //23  
  88. #define EINT0_GPM1      (0x80 + 16) //24  
  89. #define EINT0_GPM2      (0x80 + 16) //25  
  90. #define EINT0_GPM3      (0x80 + 20) //26  
  91. #define EINT0_GPM4      (0x80 + 20) //27  
  92.  
  93.  
  94.  
  95.  
  96. //外部中断分组定义  
  97. //      组名          //组号            //范围  
  98. #define EINT_Group0     0               //GPN0--->GPN15        GPL8--->GPL14         GPM0--->GPM4  
  99. #define EINT_Group01    1               //GPA0--->GPA7         GPB0--->GPB6  
  100. #define EINT_Group02    1               //GPC0--->GPC7  
  101. #define EINT_Group03    2               //GPD0--->GPD5  
  102. #define EINT_Group04    2               //GPF0--->GPF14  
  103. #define EINT_Group05    3               //GPG0--->GPG7  
  104. #define EINT_Group06    3               //GPH0--->GPH9  
  105. #define EINT_Group07    4               //GPO0--->GPO15  
  106. #define EINT_Group08    4               //GPP0--->GPP14  
  107. #define EINT_Group09    5               //GPQ0--->GPQ9  
  108.  
  109.  
  110. //HCLK门控时钟定义  
  111. /*HCLK_GATE控制所有Ips的HCLK,如果区域为‘1’,则HCLK被提供,否则,HCLK被屏蔽。当S3C6410 
  112. 转换成掉电模式时,系统控制器检查一些模块(IROM,MEM0,MEM1和MFC模块)的状态。因此,位25,22, 
  113. 21,0必须为‘1’,以符合掉电的要求。 
  114.         HCLK_GATE       位       描述                                                              初始状态*/ 
  115. #define HCLK_UHOST      29      //为UHOST 选通HCLK(0:屏蔽,1:通过)。                                 1  
  116. #define HCLK_SECUR      28      //为安全子系统选通HCLK(0:屏蔽,1:通过)。                          1  
  117. #define HCLK_SDMA1      27      //为SDMA1 选通HCLK(0:屏蔽,1:通过)。                                 1  
  118. #define HCLK_SDMA0      26      //为SDMA0 选通HCLK(0:屏蔽,1:通过)。                                 1  
  119. #define HCLK_IROM       25      //为IROM 选通HCLK(0:屏蔽,1:通过)。                              1  
  120. #define HCLK_DDR1       24      //为DDR1 选通HCLK(0:屏蔽,1:通过)。                              1  
  121. #define HCLK_DDR0       23      //为DDR0 选通HCLK(0:屏蔽,1:通过)。                              1  
  122. #define HCLK_MEM1       22      //为DMC1 选通HCLK(0:屏蔽,1:通过)。                              1  
  123. #define HCLK_MEM0       21      //为DMC0,SROM,OneNAND,NFCON 和CFCON 选通HCLK(0:屏蔽,1:通过)。    1  
  124. #define HCLK_USB        20      //为USB OTG 选通HCLK(0:屏蔽,1:通过)。                           1  
  125. #define HCLK_HSMMC2     19      //为HSMMC2 选通HCLK(0:屏蔽,1:通过)。                            1  
  126. #define HCLK_HSMMC1     18      //为HSMMC1 选通HCLK(0:屏蔽,1:通过)。                            1  
  127. #define HCLK_HSMMC0     17      //为HSMMC0 选通HCLK(0:屏蔽,1:通过)。                            1  
  128. #define HCLK_MDP        16      //为MDP 选通HCLK(0:屏蔽,1:通过)。                               1  
  129. #define HCLK_DHOST      15      //为直接HOST 接口选通HCLK(0:屏蔽,1:通过)。                      1  
  130. #define HCLK_IHOST      14      //为间接HOST 接口选通HCLK(0:屏蔽,1:通过)。                      1  
  131. #define HCLK_DMA1       13      //为DMA1 选通HCLK(0:屏蔽,1:通过)。                              1  
  132. #define HCLK_DMA0       12      //为DMA0 选通HCLK(0:屏蔽,1:通过)。                              1  
  133. #define HCLK_JPEG       11      //为JPEG 选通HCLK(0:屏蔽,1:通过)。                              1  
  134. #define HCLK_CAMIF      10      //为相机接口选通HCLK(0:屏蔽,1:通过)。                           1  
  135. #define HCLK_SCALER     9       //为定标器选通HCLK(0:屏蔽,1:通过)。                                1  
  136. #define HCLK_2D         8       //为2D 选通HCLK(0:屏蔽,1:通过)。                                1  
  137. #define HCLK_TV         7       //为TV 译码器选通HCLK(0:屏蔽,1:通过)。                             1  
  138. #define HCLK_POST0      5       //为POST0 选通HCLK(0:屏蔽,1:通过)。                                 1  
  139. #define HCLK_ROT        4       //为旋转器选通HCLK(0:屏蔽,1:通过)。                                1  
  140. #define HCLK_LCD        3       //为LCD 控制器选通HCLK(0:屏蔽,1:通过)。                            1  
  141. #define HCLK_TZIC       2       //为中断控制器选通HCLK(0:屏蔽,1:通过)。                          1  
  142. #define HCLK_INTC       1       //为向量中断控制器选通HCLK(0:屏蔽,1:通过)。                        1  
  143. #define HCLK_MFC        0       //为MFC 选通HCLK(0:屏蔽,1:通过)。                               1  
  144.  
  145.  
  146. //PCLK门控时钟定义  
  147. //      PCLK_GATE       位               描述                                          初始状态  
  148. #define PCLK_SKEY       (0x40 | 24)     // 为安全键选通PCLK(0:屏蔽,1:通过)。       1  
  149. #define PCLK_CHIPID     (0x40 | 23)     // 为片上ID 选通PCLK(0:屏蔽,1:通过)。         1  
  150. #define PCLK_SPI1       (0x40 | 22)     // 为SPI1 选通PCLK(0:屏蔽,1:通过)。             1  
  151. #define PCLK_SPI0       (0x40 | 21)     // 为SPI0 选通PCLK(0:屏蔽,1:通过)。             1  
  152. #define PCLK_HSIRX      (0x40 | 20)     // 为HSI 接收器选通PCLK(0:屏蔽,1:通过)。   1  
  153. #define PCLK_HSITX      (0x40 | 19)     // 为HIS 发送器选通PCLK(0:屏蔽,1:通过)。   1  
  154. #define PCLK_GPIO       (0x40 | 18)     // 为GPIO 选通PCLK(0:屏蔽,1:通过)。             1  
  155. #define PCLK_IIC        (0x40 | 17)     // 为IIC 选通PCLK(0:屏蔽,1:通过)。          1  
  156. #define PCLK_IIS1       (0x40 | 16)     // 为IIS1 选通PCLK(0:屏蔽,1:通过)。             1  
  157. #define PCLK_IIS0       (0x40 | 15)     // 为IIS0 选通PCLK(0:屏蔽,1:通过)。         1  
  158. #define PCLK_AC97       (0x40 | 14)     // 为AC97 选通PCLK(0:屏蔽,1:通过)。             1  
  159. #define PCLK_TZPC       (0x40 | 13)     // 为TZPC 选通PCLK(0:屏蔽,1:通过)。             1  
  160. #define PCLK_TSADC      (0x40 | 12)     // 为触摸屏ADC 选通PCLK(0:屏蔽,1:通过。        1  
  161. #define PCLK_KEYPAD     (0x40 | 11)     // 为Key PAD 选通PCLK(0:屏蔽,1:通过)。      1  
  162. #define PCLK_IRDA       (0x40 | 10)     // 为IRDA 选通PCLK(0:屏蔽,1:通过)。             1  
  163. #define PCLK_PCM1       (0x40 | 9)      // 为PCM1 选通PCLK(0:屏蔽,1:通过)。             1  
  164. #define PCLK_PCM0       (0x40 | 8)      // 为PCM0 选通PCLK(0:屏蔽,1:通过)。             1  
  165. #define PCLK_PWM        (0x40 | 7)      // 为PWM 选通PCLK(0:屏蔽,1:通过)。          1  
  166. #define PCLK_RTC        (0x40 | 6)      // 为RTC 选通PCLK(0:屏蔽,1:通过)。          1  
  167. #define PCLK_WDT        (0x40 | 5)      // 为看门狗定时器选通PCLK(0:屏蔽,1:通过)。    1  
  168. #define PCLK_UART3      (0x40 | 4)      // 为UART3 选通PCLK(0:屏蔽,1:通过)。        1  
  169. #define PCLK_UART2      (0x40 | 3)      // 为UART2 选通PCLK(0:屏蔽,1:通过)。        1  
  170. #define PCLK_UART1      (0x40 | 2)      // 为UART1 选通PCLK(0:屏蔽,1:通过)。        1  
  171. #define PCLK_UART0      (0x40 | 1)      // 为UART0 选通PCLK(0:屏蔽,1:通过)。        1  
  172. #define PCLK_MFC        (0x40 | 0)      // 为MFC 选通PCLK(0:屏蔽,1:通过)。          1  
  173.  
  174.  
  175. //PCLK门控时钟定义  
  176. //PCLK_GATE 位 描述 初始状态  
  177. #define SCLK_UHOST      (0x80 | 30)     // 为USB-HOST 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  178. #define SCLK_MMC2_48    (0x80 | 29)     // 为MMC2 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  179. #define SCLK_MMC1_48    (0x80 | 28)     // 为MMC1 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  180. #define SCLK_MMC0_48    (0x80 | 27)     // 为MMC0 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  181. #define SCLK_MMC2       (0x80 | 26)     // 为MMC2 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  182. #define SCLK_MMC1       (0x80 | 25)     // 为MMC1 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  183. #define SCLK_MMC0       (0x80 | 24)     // 为MMC0 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  184. #define SCLK_SPI1_48    (0x80 | 23)     // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  185. #define SCLK_SPI0_48    (0x80 | 22)     // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  186. #define SCLK_SPI1       (0x80 | 21)     // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  187. #define SCLK_SPI0       (0x80 | 20)     // 为SPI 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  188. #define SCLK_DAC27      (0x80 | 19)     // 为DAC 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  189. #define SCLK_TV27       (0x80 | 18)     // 为TV 译码器选通特殊时钟 (0:屏蔽,1:通过)。 1  
  190. #define SCLK_SCALER27   (0x80 | 17)     // 为scaler27 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  191. #define SCLK_SCALER     (0x80 | 16)     // 为定标器选通特殊时钟 (0:屏蔽,1:通过)。 1  
  192. #define SCLK_LCD27      (0x80 | 15)     // 为LCD 控制器选通特殊时钟 (0:屏蔽,1:通过)。 1  
  193. #define SCLK_LCD        (0x80 | 14)     // 为LCD 控制器选通特殊时钟 (0:屏蔽,1:通过)。 1  
  194. #define SCLK_POST0_27   (0x80 | 12)     // 为POST0 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  195. #define SCLK_POST0      (0x80 | 10)     // 为POST0 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  196. #define SCLK_AUDIO1     (0x80 | 9)      // 为PCM1,IIS1 和AC97 1 选通特殊时钟 (0:屏蔽,1:通过)。1  
  197. #define SCLK_AUDIO0     (0x80 | 8)      // 为PCM0,IIS0 和AC97 0 选通特殊时钟 (0:屏蔽,1:通过)。1  
  198. #define SCLK_SECUR      (0x80 | 7)      // 为安全模块选通特殊时钟 (0:屏蔽,1:通过)。 1  
  199. #define SCLK_IRDA       (0x80 | 6)      // 为IRDA 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  200. #define SCLK_UART       (0x80 | 5)      // 为UART0~3 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  201. #define SCLK_OneNAND    (0x80 | 4)      // 为OneNAND 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  202. #define SCLK_MFC        (0x80 | 3)      // 为MFC 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  203. #define SCLK_CAM        (0x80 | 2)      // 为相机接口选通特殊时钟 (0:屏蔽,1:通过)。 1  
  204. #define SCLK_JPEG       (0x80 | 1)      // 为JPEG 选通特殊时钟 (0:屏蔽,1:通过)。 1  
  205.  
  206. //中断源编号定义  
  207. /*      S3C6410X 支持64 位中断源,不支持ARM1176HZF-S 镜像中断运行. 
  208.  
  209.                 中断源                 中断号 描述                                  组*/ 
  210. #define         INT_ADC             63      //ADC EOC 中断                            VIC1  
  211. #define         INT_PENDNUP         62      //ADC 笔向下/向上中断 中断               VIC1  
  212. #define         INT_SEC             61      //安全中断                              VIC1  
  213. #define         INT_RTC_ALARM       60      //RTC 警告中断                          VIC1  
  214. #define         INT_IrDA            59      //IrDA 中断                           VIC1  
  215. #define         INT_OTG             58      //USB OTG 中断                            VIC1  
  216. #define         INT_HSMMC1          57      //HSMMC1 中断                             VIC1  
  217. #define         INT_HSMMC0          56      //HSMMC0 中断                             VIC1  
  218. #define         INT_HOSTIF          55      //主机接口中断                            VIC1  
  219. #define         INT_MSM             54      //MSM 调制解调器 I/F 中断              VIC1  
  220. #define         INT_EINT4           53      //外部中断组1~组9                         VIC1  
  221. #define         INT_HSIrx           52      //HS Rx 中断                          VIC1  
  222. #define         INT_HSItx           51      //HS Tx 中断                          VIC1  
  223. #define         INT_I2C0            50      //I2C 0 中断                          VIC1  
  224. #define         INT_SPI_INT_HSMMC2  49      //SPI 中断或HSMMC2 中断              VIC1  
  225. #define         INT_SPI0            48      //SPI0 中断                           VIC1  
  226. #define         INT_UHOST           47      //USB 主机中断                          VIC1  
  227. #define         INT_CFC             46      //CFCON 中断                          VIC1  
  228. #define         INT_NFC             45      //NFCON 中断                          VIC1  
  229. #define         INT_ONENAND1        44      //板块1 的ONENANE 中断                   VIC1  
  230. #define         INT_ONENAND0        43      //板块0 的ONENAND 中断                   VIC1  
  231. #define         INT_DMA1            42      //DMA1 中断                           VIC1  
  232. #define         INT_DMA0            41      //DMA0 中断                           VIC1  
  233. #define         INT_UART3           40      //UART3 中断                          VIC1  
  234. #define         INT_UART2           39      //UART2 中断                          VIC1  
  235. #define         INT_UART1           38      //UART1 中断                          VIC1  
  236. #define         INT_UART0           37      //UART0 中断                          VIC1  
  237. #define         INT_AC97            36      //AC 中断                                 VIC1  
  238. #define         INT_PCM1            35      //PCM1 中断                           VIC1  
  239. #define         INT_PCM0            34      //PCM0 中断                           VIC1  
  240. #define         INT_EINT3           33      //外部中断20~27                         VIC1  
  241. #define         INT_EINT2           32      //外部中断12~19                         VIC1  
  242. #define         INT_LCD_2           31      //LCD 中断.系统I/F 完成               VIC0  
  243. #define         INT_LCD_1           30      //LCD 中断.VSYNC 中断                   VIC0  
  244. #define         INT_LCD_0           29      //LCD 中断.FIFO 不足                    VIC0  
  245. #define         INT_TIMER4          28      //定时器4 中断.                      VIC0  
  246. #define         INT_TIMER3          27      //定时器3 中断.                      VIC0  
  247. #define         INT_WDT             26      //看门狗定时器中断.                     VIC0  
  248. #define         INT_TIMER2          25      //定时器2 中断.                      VIC0  
  249. #define         INT_TIMER1          24      //定时器1 中断.                      VIC0  
  250. #define         INT_TIMER0          23      //定时器0 中断.                      VIC0  
  251. #define         INT_KEYPAD          22      //键盘中断.                             VIC0  
  252. #define         INT_ARM_DMAS        21      //ARM DMAS 中断.                      VIC0  
  253. #define         INT_ARM_DMA         20      //ARM DMA 中断.                       VIC0  
  254. #define         INT_ARM_DMAERR      19      //ARM DMA 错误中断.                     VIC0  
  255. #define         INT_SDMA1           18      //安全 DMA1 中断.                       VIC0  
  256. #define         INT_SDMA0           17      //安全 DMA0 中断.                       VIC0  
  257. #define         INT_MFC             16      //MFC 中断.                           VIC0  
  258. #define         INT_JPEG            15      //JPEG 中断.                          VIC0  
  259. #define         INT_BATF            14      //电池故障中断.                       VIC0  
  260. #define         INT_SCALER          13      //TV 转换器中断.                         VIC0  
  261. #define         INT_TVENC           12      //TV 编码器中断.                         VIC0  
  262. #define         INT_2D              11      //2D 中断.                                VIC0  
  263. #define         INT_ROTATOR         10      //旋转器中断.                            VIC0  
  264. #define         INT_POSTO           9       //后处理器中断.                       VIC0  
  265. #define         INT_3D              8       //3D 图像控制器中断.                   VIC0  
  266. //#define       Reserved            7       //保留                                    VIC0  
  267. #define         INT_I2S             6       //I2S0/I2S1/INT_I2SV40/I2SV40中断     VIC0                 
  268. #define         INT_I2C1            5       //I2C1 中断                               VIC0  
  269. #define         INT_CAMIF_P         4       //照相机接口中断                       VIC0  
  270. #define         INT_CAMIF_C         3       //照相机接口中断                       VIC0  
  271. #define         INT_RTC_TIC         2       //RTC TIC 中断                            VIC0  
  272. #define         INT_EINT1           1       //外部中断4~11                          VIC0  
  273. #define         INT_EINT0           0       //外部中断0~3                           VIC0     
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281. /*************************************************************************************************/ 
  282. /*          对应位声明,方便位操作     */ 
  283. #define BIT0    (0x0001 << 0)  
  284. #define BIT1    (0x0001 << 1)  
  285. #define BIT2    (0x0001 << 2)  
  286. #define BIT3    (0x0001 << 3)  
  287. #define BIT4    (0x0001 << 4)  
  288. #define BIT5    (0x0001 << 5)  
  289. #define BIT6    (0x0001 << 6)  
  290. #define BIT7    (0x0001 << 7)  
  291. #define BIT8    (0x0001 << 8)  
  292. #define BIT9    (0x0001 << 9)  
  293. #define BIT10   (0x0001 << 10)  
  294. #define BIT11   (0x0001 << 11)  
  295. #define BIT12   (0x0001 << 12)  
  296. #define BIT13   (0x0001 << 13)  
  297. #define BIT14   (0x0001 << 14)  
  298. #define BIT15   (0x0001 << 15)  
  299. #define BIT16   (0x00000001 << 16)  
  300. #define BIT17   (0x00000001 << 17)  
  301. #define BIT18   (0x00000001 << 18)  
  302. #define BIT19   (0x00000001 << 19)  
  303. #define BIT20   (0x00000001 << 20)  
  304. #define BIT21   (0x00000001 << 21)  
  305. #define BIT22   (0x00000001 << 22)  
  306. #define BIT23   (0x00000001 << 23)  
  307. #define BIT24   (0x00000001 << 24)  
  308. #define BIT25   (0x00000001 << 25)  
  309. #define BIT26   (0x00000001 << 26)  
  310. #define BIT27   (0x00000001 << 27)  
  311. #define BIT28   (0x00000001 << 28)  
  312. #define BIT29   (0x00000001 << 29)  
  313. #define BIT30   (0x00000001 << 30)  
  314. #define BIT31   (0x00000001 << 31)  
  315.  
  316. //PLL选择  
  317. #define APLL    0   //ARM内核时钟PLL  
  318. #define MPLL    1   //主时钟PLL  
  319. #define EPLL    2   //外设时钟PLL  
  320.  
  321. //主时钟输入  
  322. #define SYSTEM_MAIN_CLK_IN  12000000        //12MHZ  
  323.  
  324. /************************************************************************************************************************* 
  325. *函数        :    __inline void VICInterruptEnd(void) 
  326. *功能        :  在中断快要结束时清除中断 
  327. *参数        :  无 
  328. *返回        :  无 
  329. *依赖        :    底层宏定义 
  330. *作者        :  陈鹏 
  331. *时间        :    20120305 
  332. *最后修改时间:    20120305 
  333. *说明        :  写入任何数据清除中断,只有在中断服务程序中才可读,结束时才写 
  334.                 两个要一起清除,否则可能导致无法再次进入中断,无意间发现的 
  335. *************************************************************************************************************************/ 
  336. __inline void VICInterruptEnd(void
  337.     VIC0->ADDRESS = 0xffffffff;  //写入任何值都可以清除当前中断  
  338.     VIC1->ADDRESS = 0xffffffff;  //写入任何值都可以清除当前中断  
  339.  
  340.  
  341. //通道选择  
  342. #define ch0     0  
  343. #define ch1     1  
  344. #define ch2     2  
  345.  
  346.  
  347.  
  348. //printf输出定义  
  349. #if (PRINTF_EN_ == 1)   //使能到串口  
  350. #define uart_printf(format,...) (printf(format, ##__VA_ARGS__)) //串口打印  
  351. #define DEBUG(format,...)       (printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG输出  
  352. #endif  
  353.  
  354.  
  355. //printf输出定义  
  356. #if (PRINTF_EN_ == 2)   //使能到液晶  
  357. #define lcd_printf(format,...)  (printf(format, ##__VA_ARGS__)) //LCD打印  
  358. #define DEBUG(format,...)       (printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)) //DEBUG输出  
  359. #endif  
  360.  
  361.  
  362. //printf输出定义  
  363. #if (PRINTF_EN_ == 3)   //同时使能到液晶和串口  
  364. #define uart_printf(format,...) PrintfSet=0;printf(format, ##__VA_ARGS__)   //串口打印  
  365. #define lcd_printf(format,...)  PrintfSet=1;printf(format, ##__VA_ARGS__)   //LCD打印  
  366. #define DEBUG(format,...)       PrintfSet=0;printf("<DebugFile: "__FILE__", Line: %d> "format, __LINE__, ##__VA_ARGS__)   //DEBUG输出  
  367. #endif  
  368.  
  369. #endif 

相关内容