Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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 == " ") 
  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 == " ") 
  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.c * 功能:S3C6410相关系统函数 * 作者:cp1300@139.com * 创建时间:2012年3月4日11:25 * 最后修改时间:2012年3月4日 * 详细:2012年3月5日17:00 添加VIC相关函数*************************************************************************************************************/#include "system.h"/**************************************************************************************************************************函数:void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger)*功能:设置外部中断组0触发模式*参数:EINT0_N:中断源的编号(见:中断组0编号定义);Trigger:触发模式(EXT_LowLevel:低电平触发;EXT_HighLevel:高电平触发;EXT_NegEdge:下降沿触发;EXT_PosEdge:上升沿触发;EXT_Edge:边沿触发)*返回:无*依赖:底层宏定义*作者:cp1300@139.com*时间:20120304*最后修改时间:20120304*说明:编号 GPN0--->GPN15GPL8--->GPL14GPM0--->GPM4,中断设置必须两个两个一起*************************************************************************************************************************/void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger){if(EINT0_N & 0x80) //EINT0CON1{EINT0_N -= 0x80;//减去标记rEINT0CON1 &= ~(7 << EINT0_N);//清楚原来的设置rEINT0CON1 |= Trigger << EINT0_N;}else//EINT0CON0{rEINT0CON0 &= ~(7 << EINT0_N);//清楚原来的设置rEINT0CON0 |= Trigger << EINT0_N;}}/**************************************************************************************************************************函数:void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable)*功能:CLK时钟门控设置(HCLK,PCLK,SCLK)*参数:CLK_DIV:外设(见:CLK门控时钟定义);Enable = ENABLE,1使能;=DISABLE,0失能*返回:无*依赖:底层宏定义*作者:cp1300@139.com*时间:20120305*最后修改时间: 20121005*说明:PCLK_GATE添加标识0x40,SCLK_GATE添加标示0x80;*************************************************************************************************************************/void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable){vu32 *P = &rHCLK_GATE;if(CLK_DIV & 0x80)//SCLK{P = &rSCLK_GATE;CLK_DIV -= 0x80;//去掉标示}else if(CLK_DIV & 0x40)//PCLK{P = &rPCLK_GATE;CLK_DIV -= 0x40;//去掉标示}if(Enable == ENABLE)//使能*P |= 1 << CLK_DIV;else//失能*P &= ~(1 << CLK_DIV);}/**************************************************************************************************************************函数:void Set_INTtoIRQ(u8 INT_N)*功能:设置一个中断为IRQ*参数:INT_N:中断编号(见:中断源编号定义);*返回:无*依赖:底层宏定义*作者:cp1300@139.com*时间:20120305*最后修改时间: 20120305*说明:设置一个中断为普通中断模式*************************************************************************************************************************/void Set_INTtoIRQ(vu8 INT_N){if(INT_N > 31)//VIC1{INT_N -= 32;VIC1->INTSELECT &= ~(1 << INT_N);}else//VIC0VIC0->INTSELECT &= ~(1 << INT_N);}/**************************************************************************************************************************函数:void Set_INTtoFIQ(u8 INT_N)*功能:设置一个中断为FIQ*参数:INT_N:中断编号(见:中断源编号定义);*返回:无*依赖:底层宏定义*作者:cp1300@139.com*时间:20120305*最后修改时间: 20120305*说明:设置一个中断为快速中断模式*************************************************************************************************************************/void Set_INTtoFIQ(vu8 INT_N){if(INT_N > 31)//VIC1{INT_N -= 32;VIC1->INTSELECT |= (1 << INT_N);}else//VIC0VIC0->INTSELECT |= (1 << INT_N);}/**************************************************************************************************************************函数:void Set_IntEnable(u8 INT_N,FunctionalState EnInt)*功能:开启或关闭一个VIC中断*参数: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无影响}/**************************************************************************************************************************函数:u8 Get_IntEnable(vu8 INT_N)*功能:获取一个中断屏蔽状态*参数:中断编号*返回:1:该中断失能,0:该中断失能*依赖:底层宏定义*作者:cp1300@139.com*时间:20120524*最后修改时间: 20120524*说明:获取一个中断屏蔽状态*************************************************************************************************************************/u8 Get_IntEnable(vu8 INT_N){VICx_TypeDef *P = VIC0;if(INT_N > 31)//VIC1{INT_N -= 32;P = VIC1;} if(P->INTENABLE & (1 << INT_N)) //该中断使能return 1;else return 0;}/**************************************************************************************************************************函数:void Set_SoftInt(u8 INT_N,u8 ENABLE)*功能:开启或关闭一个软件中断*参数:INT_N:中断编号(见:中断源编号定义),ENABLE = Enable,1使能;=Disable,0失能;*返回:无*依赖:底层宏定义*作者: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无影响}/**************************************************************************************************************************函数:void Set_IsrAddr(u8 INT_N,vu32 IsrAdd)*功能:设置中断矢量入口*参数:INT_N:中断编号(见:中断源编号定义),IsrAdd:中断服务程序指针;*返回:无*依赖:底层宏定义*作者:cp1300@139.com*时间:20120305*最后修改时间: 20120311*说明:设置矢量地址寄存器*************************************************************************************************************************/void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd){VICx_TypeDef *P = VIC0;if(INT_N > 31)//VIC1{INT_N -= 32;P = VIC1;}P->VECTADDR[INT_N] = IsrAdd;//将中断服务程序入口地址写入矢量地址寄存器}/**************************************************************************************************************************函数:void Set_VectorPriority(u8 INT_N,u8 Priority)*功能:设置矢量优先级*参数:INT_N:中断编号(见:中断源编号定义),Priority:优先级0-15;*返回:无*依赖:底层宏定义*作者:cp1300@139.com*时间:20120305*最后修改时间: 20120305*说明:优先级为0-15,值越大优先级越高,15最高,0最低;*************************************************************************************************************************/void Set_VectorPriority(vu8 INT_N,vu8 Priority){VICx_TypeDef *P = VIC0;if(INT_N > 31)//VIC1{INT_N -= 32;P = VIC1;}P->VECTRPRIORITY[INT_N] = Priority;//将中断优先级写入寄存器}/**************************************************************************************************************************函数:u32 Get_PLLCLK(int pllreg)*功能:获取PLL时钟频率*参数:pllreg : PLL选择APLL 0//ARM内核时钟PLLMPLL 1//主时钟PLLEPLL 2//外设时钟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))));}/**************************************************************************************************************************函数:u32 Get_FCLK(void)*功能:获取FCLK时钟频率*参数:无*返回:频率,HZ*依赖:底层宏定义*作者:cp1300@139.com*时间:20120526*最后修改时间: 20120526*说明:无*************************************************************************************************************************/u32 Get_FCLK(void){return (Get_PLLCLK(APLL));}/**************************************************************************************************************************函数:u32 Get_PCLK(void)*功能:获取PCLK时钟频率*参数:无*返回:频率,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 Modeelsefclk = Get_PLLCLK(MPLL);// ASYNC Modereturn 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 == " "){ 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;}elseX += 8;}else{if(X > LCD_XSIZE-1-8){ X = X1;Y += 12;}elseX += 8;}} return ch;}#endif//PRINTF_EN == 3,???????printf??????????#if (PRINTF_EN_ == 3)#include "tft_lcd.h"#include "uart.h"#include <locale.h>u8 PrintfSet = 0;//0:????printf??????;1:????printf?????int fputc(int ch, FILE *f){static u16 X;static u16 X1;static u16 Y;static u8 flag; if(PrintfSet){if(flag == 0) { if(Y > LCD_YSIZE-1-16){Y = 0;X = X1 = LCD_XSIZE/2;flag = 1;LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);//????????} } else { if(Y > LCD_YSIZE-1-16){Y = 0;X = X1 = 0;flag = 0;LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff);//????????} }if((u8)ch == " "){ 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;}elseX += 8;}else{if(X > LCD_XSIZE-1-8){ X = X1;Y += 12;}elseX += 8;}}}elseUART0_SendByte((u8)ch);return ch;}#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:通过)。