×
单片机 > 单片机程序设计 > 详情

S3C6410裸机程序相关系统函数

发布时间:2020-06-06 发布时间:
|

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

//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 <

  30.         rEINT0CON1 |= Trigger <

  31.     }  

  32.     else    //EINT0CON0  

  33.     {  

  34.         rEINT0CON0 &= ~(7 <

  35.         rEINT0CON0 |= Trigger <

  36.     }  

  37. }  

  38.   

  39.   

  40.   

  41. /************************************************************************************************************************* 

  42. *函数        :    void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable) 

  43. *功能        :  CLK时钟门控设置(HCLK,PCLK,SCLK) 

  44. *参数        :  CLK_DIV:外设(见:CLK门控时钟定义);Enable = ENABLE,1使能;=DISABLE,0失能 

  45. *返回        :  无 

  46. *依赖        :    底层宏定义 

  47. *作者        :  cp1300@139.com 

  48. *时间        :    20120305 

  49. *最后修改时间:    20121005 

  50. *说明        :  PCLK_GATE添加标识0x40,SCLK_GATE添加标示0x80; 

  51. *************************************************************************************************************************/  

  52.   

  53. void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable)  

  54. {  

  55.     vu32 *P = &rHCLK_GATE;  

  56.       

  57.     if(CLK_DIV & 0x80)      //SCLK  

  58.     {  

  59.         P = &rSCLK_GATE;  

  60.         CLK_DIV -= 0x80;    //去掉标示  

  61.     }  

  62.     else if(CLK_DIV & 0x40) //PCLK  

  63.     {  

  64.         P = &rPCLK_GATE;  

  65.         CLK_DIV -= 0x40;    //去掉标示  

  66.     }  

  67.     if(Enable == ENABLE)    //使能  

  68.         *P |= 1 <

  69.     else        //失能  

  70.         *P &= ~(1 <

  71. }  

  72.   

  73.   

  74.   

  75. /************************************************************************************************************************* 

  76. *函数        :    void Set_INTtoIRQ(u8 INT_N) 

  77. *功能        :  设置一个中断为IRQ 

  78. *参数        :  INT_N:中断编号(见:中断源编号定义); 

  79. *返回        :  无 

  80. *依赖        :    底层宏定义 

  81. *作者        :  cp1300@139.com 

  82. *时间        :    20120305 

  83. *最后修改时间:    20120305 

  84. *说明        :  设置一个中断为普通中断模式 

  85. *************************************************************************************************************************/  

  86. void Set_INTtoIRQ(vu8 INT_N)  

  87. {  

  88.     if(INT_N > 31)   //VIC1  

  89.     {  

  90.         INT_N -= 32;  

  91.         VIC1->INTSELECT &= ~(1 <

  92.     }  

  93.     else            //VIC0  

  94.         VIC0->INTSELECT &= ~(1 <

  95. }  

  96.   

  97.   

  98. /************************************************************************************************************************* 

  99. *函数        :    void Set_INTtoFIQ(u8 INT_N) 

  100. *功能        :  设置一个中断为FIQ 

  101. *参数        :  INT_N:中断编号(见:中断源编号定义); 

  102. *返回        :  无 

  103. *依赖        :    底层宏定义 

  104. *作者        :  cp1300@139.com 

  105. *时间        :    20120305 

  106. *最后修改时间:    20120305 

  107. *说明        :  设置一个中断为快速中断模式 

  108. *************************************************************************************************************************/  

  109. void Set_INTtoFIQ(vu8 INT_N)  

  110. {  

  111.     if(INT_N > 31)   //VIC1  

  112.     {  

  113.         INT_N -= 32;  

  114.         VIC1->INTSELECT |= (1 <

  115.     }  

  116.     else            //VIC0  

  117.         VIC0->INTSELECT |= (1 <

  118. }  

  119.   

  120.   

  121. /************************************************************************************************************************* 

  122. *函数        :    void Set_IntEnable(u8 INT_N,FunctionalState EnInt) 

  123. *功能        :  开启或关闭一个VIC中断 

  124. *参数        :  INT_N:中断编号(见:中断源编号定义), 

  125. *           EnInt = ENABLE,1使能;=DISABLE,0失能; 

  126. *返回        :  无 

  127. *依赖        :    底层宏定义 

  128. *作者        :  cp1300@139.com 

  129. *时间        :    20120305 

  130. *最后修改时间:    20120305 

  131. *说明        :  使能或失能VIC0,VIC1的一个中断 

  132. *************************************************************************************************************************/  

  133. void Set_IntEnable(vu8 INT_N,FunctionalState EnInt)  

  134. {  

  135.     VICx_TypeDef *P = VIC0;  

  136.       

  137.     if(INT_N > 31)   //VIC1  

  138.     {  

  139.         INT_N -= 32;  

  140.         P = VIC1;  

  141.     }   

  142.     if(EnInt == ENABLE) //使能中断  

  143.         P->INTENABLE = 1 <

  144.     else        //取消中断  

  145.         P->INTENCLEAR = 1 <

  146. }  

  147.   

  148.   

  149. /************************************************************************************************************************* 

  150. *函数        :    u8 Get_IntEnable(vu8 INT_N) 

  151. *功能        :  获取一个中断屏蔽状态 

  152. *参数        :  中断编号 

  153. *返回        :  1:该中断失能,0:该中断失能 

  154. *依赖        :    底层宏定义 

  155. *作者        :  cp1300@139.com 

  156. *时间        :    20120524 

  157. *最后修改时间:    20120524 

  158. *说明        :  获取一个中断屏蔽状态 

  159. *************************************************************************************************************************/  

  160. u8 Get_IntEnable(vu8 INT_N)  

  161. {  

  162.     VICx_TypeDef *P = VIC0;  

  163.       

  164.     if(INT_N > 31)   //VIC1  

  165.     {  

  166.         INT_N -= 32;  

  167.         P = VIC1;  

  168.     }   

  169.     if(P->INTENABLE & (1 <

  170.         return 1;  

  171.     else   

  172.         return 0;  

  173. }  

  174.   

  175.   

  176. /************************************************************************************************************************* 

  177. *函数        :    void Set_SoftInt(u8 INT_N,u8 ENABLE) 

  178. *功能        :  开启或关闭一个软件中断 

  179. *参数        :  INT_N:中断编号(见:中断源编号定义),ENABLE = Enable,1使能;=Disable,0失能; 

  180. *返回        :  无 

  181. *依赖        :    底层宏定义 

  182. *作者        :  cp1300@139.com 

  183. *时间        :    20120305 

  184. *最后修改时间:    20120305 

  185. *说明        :  使能或失能VIC0,VIC1的一个软件中断 

  186. *************************************************************************************************************************/  

  187. void Set_SoftInt(vu8 INT_N,vu8 ENABLE)  

  188. {  

  189.     VICx_TypeDef *P = VIC0;  

  190.       

  191.     if(INT_N > 31)   //VIC1  

  192.     {  

  193.         INT_N -= 32;  

  194.         P = VIC1;  

  195.     }   

  196.     if(ENABLE) //使能中断  

  197.         P->SOFTINT = 1 <

  198.     else        //取消中断  

  199.         P->SOFTINTCLEAR = 1 <

  200. }  

  201.   

  202.   

  203.   

  204. /************************************************************************************************************************* 

  205. *函数        :    void Set_IsrAddr(u8 INT_N,vu32 IsrAdd) 

  206. *功能        :  设置中断矢量入口 

  207. *参数        :  INT_N:中断编号(见:中断源编号定义),IsrAdd:中断服务程序指针; 

  208. *返回        :  无 

  209. *依赖        :    底层宏定义 

  210. *作者        :  cp1300@139.com 

  211. *时间        :    20120305 

  212. *最后修改时间:    20120311 

  213. *说明        :  设置矢量地址寄存器 

  214. *************************************************************************************************************************/  

  215. void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd)  

  216. {  

  217.     VICx_TypeDef *P = VIC0;  

  218.       

  219.     if(INT_N > 31)   //VIC1  

  220.     {  

  221.         INT_N -= 32;  

  222.         P = VIC1;  

  223.     }  

  224.     P->VECTADDR[INT_N] = IsrAdd;//将中断服务程序入口地址写入矢量地址寄存器  

  225. }  

  226.   

  227.   

  228. /************************************************************************************************************************* 

  229. *函数        :    void Set_VectorPriority(u8 INT_N,u8 Priority) 

  230. *功能        :  设置矢量优先级 

  231. *参数        :  INT_N:中断编号(见:中断源编号定义),Priority:优先级0-15; 

  232. *返回        :  无 

  233. *依赖        :    底层宏定义 

  234. *作者        :  cp1300@139.com 

  235. *时间        :    20120305 

  236. *最后修改时间:    20120305 

  237. *说明        :  优先级为0-15,值越大优先级越高,15最高,0最低; 

  238. *************************************************************************************************************************/  

  239. void Set_VectorPriority(vu8 INT_N,vu8 Priority)  

  240. {  

  241.     VICx_TypeDef *P = VIC0;  

  242.       

  243.     if(INT_N > 31)   //VIC1  

  244.     {  

  245.         INT_N -= 32;  

  246.         P = VIC1;  

  247.     }  

  248.     P->VECTRPRIORITY[INT_N] = Priority;//将中断优先级写入寄存器  

  249. }  

  250.   

  251.   

  252.   

  253.   

  254.   

  255. /************************************************************************************************************************* 

  256. *函数        :    u32 Get_PLLCLK(int pllreg) 

  257. *功能        :  获取PLL时钟频率 

  258. *参数        :  pllreg : PLL选择 

  259.                     APLL    0   //ARM内核时钟PLL 

  260.                     MPLL    1   //主时钟PLL 

  261.                     EPLL    2   //外设时钟PLL 

  262. *返回        :  频率,HZ 

  263. *依赖        :    底层宏定义 

  264. *作者        :  cp1300@139.com 

  265. *时间        :    20120526 

  266. *最后修改时间:    20120526 

  267. *说明        :  无 

  268. *************************************************************************************************************************/  

  269. u32 Get_PLLCLK(u8 pllreg)  

  270. {  

  271.     u32 r = 0, m, p, s;  

  272.   

  273.     if (pllreg == APLL)  

  274.         r = rAPLL_CON;  

  275.     else if (pllreg == MPLL)  

  276.         r = rMPLL_CON;  

  277.     else if (pllreg == EPLL)  

  278.         r = rEPLL_CON0;  

  279.   

  280.     m = (r>>16) & 0x3ff;  

  281.     p = (r>>8) & 0x3f;  

  282.     s = r & 0x7;  

  283.   

  284.     return (m * (SYSTEM_MAIN_CLK_IN / (p * (1 <

  285. }  

  286.   

  287.   

  288. /************************************************************************************************************************* 

  289. *函数        :    u32 Get_FCLK(void) 

  290. *功能        :  获取FCLK时钟频率 

  291. *参数        :  无 

  292. *返回        :  频率,HZ 

  293. *依赖        :    底层宏定义 

  294. *作者        :  cp1300@139.com 

  295. *时间        :    20120526 

  296. *最后修改时间:    20120526 

  297. *说明        :  无 

  298. *************************************************************************************************************************/  

  299. u32 Get_FCLK(void)  

  300. {  

  301.     return (Get_PLLCLK(APLL));  

  302. }  

  303.   

  304.   

  305.   

  306. /************************************************************************************************************************* 

  307. *函数        :    u32 Get_PCLK(void) 

  308. *功能        :  获取PCLK时钟频率 

  309. *参数        :  无 

  310. *返回        :  频率,HZ 

  311. *依赖        :    底层宏定义 

  312. *作者        :  cp1300@139.com 

  313. *时间        :    20120526 

  314. *最后修改时间:    20120526 

  315. *说明        :  无 

  316. *************************************************************************************************************************/  

  317. u32 Get_PCLK(void)  

  318. {  

  319.     u32 fclk;  

  320.     u32 hclkx2_div = ((rCLK_DIV0 >> 9) & 0x7) + 1;  

  321.     u32 pre_div = ((rCLK_DIV0 >> 12) & 0xf) + 1;  

  322.   

  323.     if(rOTHERS & 0x80)  

  324.         fclk = Get_FCLK();      // SYNC Mode  

  325.     else  

  326.         fclk = Get_PLLCLK(MPLL);    // ASYNC Mode  

  327.   

  328.     return fclk/(hclkx2_div * pre_div);  

  329. }  

  330.   

  331.   

  332.   

  333.   

  334.   

  335.   

  336.   

  337.   

  338.   

  339.   

  340.   

  341.   

  342. //////////////////////////////////////////////////////////////////  

  343. //???????′???,???printf????,  

  344. //PRINTF_EN == 1,?????printf??????  

  345. #if (PRINTF_EN_ == 1)  

  346. #include "uart.h"   

  347.   

  348. int fputc(int ch,FILE *f)  

  349. {       

  350.     UART0_SendByte((u8)ch);       

  351.     return ch;  

  352. }  

  353. #endif  

  354.   

  355. //PRINTF_EN == 2,?????printf?????  

  356. #if (PRINTF_EN_== 2)  

  357. #include "tft_lcd.h"  

  358.   

  359. int fputc(int ch, FILE *f)  

  360. {      

  361.     static u16 X;  

  362.     static u16 X1;  

  363.     static u16 Y;  

  364.     static u8 flag;  

  365.       

  366.     if(flag == 0)  

  367.     {  

  368.         if(Y > LCD_YSIZE-1-16)  

  369.         {  

  370.               

  371.             Y = 0;  

  372.             X = X1 = LCD_XSIZE/2;  

  373.             flag = 1;  

  374.             LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);  //????????  

  375.         }  

  376.     }  

  377.     else  

  378.     {  

  379.         if(Y > LCD_YSIZE-1-16)  

  380.         {  

  381.             Y = 0;  

  382.             X = X1 = 0;  

  383.             flag = 0;  

  384.             LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????  

  385.         }  

  386.     }  

  387.       

  388.       

  389.     if((u8)ch == '\n')  

  390.     {  

  391.         X = X1;  

  392.         Y += 12;  

  393.     }  

  394.     else if((u8)ch > 0x80) //????  

  395.     {  

  396.         return ch;  

  397.     }  

  398.     else  

  399.     {  

  400.         LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);  

  401.           

  402.         if(flag == 0)  

  403.         {  

  404.             if(X > LCD_XSIZE/2-1-8)  

  405.             {  

  406.                 X = X1;  

  407.                 Y += 12;  

  408.             }  

  409.             else  

  410.                 X += 8;  

  411.         }  

  412.         else  

  413.         {  

  414.             if(X > LCD_XSIZE-1-8)  

  415.             {  

  416.                 X = X1;  

  417.                 Y += 12;  

  418.             }  

  419.             else  

  420.                 X += 8;  

  421.         }  

  422.     }       

  423.   

  424.     return ch;  

  425. }  

  426. #endif  

  427.   

  428.   

  429. //PRINTF_EN == 3,???????printf??????????  

  430. #if (PRINTF_EN_ == 3)  

  431. #include "tft_lcd.h"  

  432. #include "uart.h"  

  433. #include   

  434. u8 PrintfSet = 0;   //0:????printf??????;1:????printf?????  

  435.   

  436. int fputc(int ch, FILE *f)  

  437. {      

  438.     static u16 X;  

  439.     static u16 X1;  

  440.     static u16 Y;  

  441.     static u8 flag;  

  442.       

  443.     if(PrintfSet)  

  444.     {  

  445.         if(flag == 0)  

  446.         {  

  447.             if(Y > LCD_YSIZE-1-16)  

  448.             {  

  449.                   

  450.                 Y = 0;  

  451.                 X = X1 = LCD_XSIZE/2;  

  452.                 flag = 1;  

  453.                 LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);  //????????  

  454.             }  

  455.         }  

  456.         else  

  457.         {  

  458.             if(Y > LCD_YSIZE-1-16)  

  459.             {  

  460.                 Y = 0;  

  461.                 X = X1 = 0;  

  462.                 flag = 0;  

  463.                 LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff); //????????  

  464.             }  

  465.         }  

  466.           

  467.           

  468.         if((u8)ch == '\n')  

  469.         {  

  470.             X = X1;  

  471.             Y += 12;  

  472.         }  

  473.         else if((u8)ch > 0x80) //????  

  474.         {  

  475.             return ch;  

  476.         }  

  477.         else  

  478.         {  

  479.             LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);  

  480.               

  481.             if(flag == 0)  

  482.             {  

  483.                 if(X > LCD_XSIZE/2-1-8)  

  484.                 {  

  485.                     X = X1;  

  486.                     Y += 12;  

  487.                 }  

  488.                 else  

  489.                     X += 8;  

  490.             }  

  491.             else  

  492.             {  

  493.                 if(X > LCD_XSIZE-1-8)  

  494.                 {  

  495.                     X = X1;  

  496.                     Y += 12;  

  497.                 }  

  498.                 else  

  499.                     X += 8;  

  500.             }  

  501.         }  

  502.     }  

  503.     else  

  504.         UART0_SendByte((u8)ch);  

  505.   

  506.     return ch;  

  507. }  

  508. #endif  


//system.h


  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 <

  284. #define BIT1    (0x0001 <

  285. #define BIT2    (0x0001 <

  286. #define BIT3    (0x0001 <

  287. #define BIT4    (0x0001 <

  288. #define BIT5    (0x0001 <

  289. #define BIT6    (0x0001 <

  290. #define BIT7    (0x0001 <

  291. #define BIT8    (0x0001 <

  292. #define BIT9    (0x0001 <

  293. #define BIT10   (0x0001 <

  294. #define BIT11   (0x0001 <

  295. #define BIT12   (0x0001 <

  296. #define BIT13   (0x0001 <

  297. #define BIT14   (0x0001 <

  298. #define BIT15   (0x0001 <

  299. #define BIT16   (0x00000001 <

  300. #define BIT17   (0x00000001 <

  301. #define BIT18   (0x00000001 <

  302. #define BIT19   (0x00000001 <

  303. #define BIT20   (0x00000001 <

  304. #define BIT21   (0x00000001 <

  305. #define BIT22   (0x00000001 <

  306. #define BIT23   (0x00000001 <

  307. #define BIT24   (0x00000001 <

  308. #define BIT25   (0x00000001 <

  309. #define BIT26   (0x00000001 <

  310. #define BIT27   (0x00000001 <

  311. #define BIT28   (0x00000001 <

  312. #define BIT29   (0x00000001 <

  313. #define BIT30   (0x00000001 <

  314. #define BIT31   (0x00000001 <

  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. {  

  338.     VIC0->ADDRESS = 0xffffffff;  //写入任何值都可以清除当前中断  

  339.     VIC1->ADDRESS = 0xffffffff;  //写入任何值都可以清除当前中断  

  340. }  

  341.   

  342.   

  343. //通道选择  

  344. #define ch0     0  

  345. #define ch1     1  

  346. #define ch2     2  

  347.   

  348.   

  349.   

  350. //printf输出定义  

  351. #if (PRINTF_EN_ == 1)   //使能到串口  

  352. #define uart_printf(format,...) (printf(format, ##__VA_ARGS__)) //串口打印  

  353. #define DEBUG(format,...)       (printf(" "format, __LINE__, ##__VA_ARGS__)) //DEBUG输出  

  354. #endif  

  355.   

  356.   

  357. //printf输出定义  

  358. #if (PRINTF_EN_ == 2)   //使能到液晶  

  359. #define lcd_printf(format,...)  (printf(format, ##__VA_ARGS__)) //LCD打印  

  360. #define DEBUG(format,...)       (printf(" "format, __LINE__, ##__VA_ARGS__)) //DEBUG输出  

  361. #endif  

  362.   

  363.   

  364. //printf输出定义  

  365. #if (PRINTF_EN_ == 3)   //同时使能到液晶和串口  

  366. #define uart_printf(format,...) PrintfSet=0;printf(format, ##__VA_ARGS_

    『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机电子密码锁仿真 可修改密码