歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> S3C6410裸機程序相關系統函數

S3C6410裸機程序相關系統函數

日期:2017/3/1 10:08:18   编辑:Linux編程

S3C6410裸機程序中可能用到的文件以及函數

//system.c

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


/*************************************************************************************************************************
*函數        :	void SetEINT_TriggerMode(u8 EINT0_N,u8 Trigger)
*功能        :	設置外部中斷組0觸發模式
*參數        :	EINT0_N:中斷源的編號(見:中斷組0編號定義);Trigger:觸發模式(EXT_LowLevel:低電平觸發;EXT_HighLevel:高電平觸發;
					EXT_NegEdge:下降沿觸發;EXT_PosEdge:上升沿觸發;EXT_Edge:邊沿觸發)
*返回        :	無
*依賴        :	底層宏定義
*作者        :	[email protected]
*時間        :	20120304
*最後修改時間:	20120304
*說明        :	編號 GPN0--->GPN15  GPL8--->GPL14  GPM0--->GPM4,中斷設置必須兩個兩個一起
*************************************************************************************************************************/
void SetEINT0_TriggerMode(vu8 EINT0_N,vu8 Trigger)
{	
	if(EINT0_N & 0x80) //EINT0CON1
	{
		EINT0_N -= 0x80;//減去標記
		rEINT0CON1 &= ~(7 << EINT0_N);//清楚原來的設置
		rEINT0CON1 |= Trigger << EINT0_N;
	}
	else	//EINT0CON0
	{
		rEINT0CON0 &= ~(7 << EINT0_N);//清楚原來的設置
		rEINT0CON0 |= Trigger << EINT0_N;
	}
}



/*************************************************************************************************************************
*函數        :	void Set_GateClk(u8 HCLK_DIV,FunctionalState Enable)
*功能        :  CLK時鐘門控設置(HCLK,PCLK,SCLK)
*參數        :  CLK_DIV:外設(見:CLK門控時鐘定義);Enable = ENABLE,1使能;=DISABLE,0失能
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20121005
*說明        :  PCLK_GATE添加標識0x40,SCLK_GATE添加標示0x80;
*************************************************************************************************************************/

void Set_GateClk(vu8 CLK_DIV,FunctionalState Enable)
{
	vu32 *P = &rHCLK_GATE;
	
	if(CLK_DIV & 0x80)		//SCLK
	{
		P = &rSCLK_GATE;
		CLK_DIV -= 0x80;	//去掉標示
	}
	else if(CLK_DIV & 0x40)	//PCLK
	{
		P = &rPCLK_GATE;
		CLK_DIV -= 0x40;	//去掉標示
	}
	if(Enable == ENABLE)	//使能
		*P |= 1 << CLK_DIV;
	else		//失能
		*P &= ~(1 << CLK_DIV);
}



/*************************************************************************************************************************
*函數        :	void Set_INTtoIRQ(u8 INT_N)
*功能        :  設置一個中斷為IRQ
*參數        :  INT_N:中斷編號(見:中斷源編號定義);
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  設置一個中斷為普通中斷模式
*************************************************************************************************************************/
void Set_INTtoIRQ(vu8 INT_N)
{
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		VIC1->INTSELECT &= ~(1 << INT_N);
	}
	else			//VIC0
		VIC0->INTSELECT &= ~(1 << INT_N);
}


/*************************************************************************************************************************
*函數        :	void Set_INTtoFIQ(u8 INT_N)
*功能        :  設置一個中斷為FIQ
*參數        :  INT_N:中斷編號(見:中斷源編號定義);
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  設置一個中斷為快速中斷模式
*************************************************************************************************************************/
void Set_INTtoFIQ(vu8 INT_N)
{
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		VIC1->INTSELECT |= (1 << INT_N);
	}
	else			//VIC0
		VIC0->INTSELECT |= (1 << INT_N);
}


/*************************************************************************************************************************
*函數        :	void Set_IntEnable(u8 INT_N,FunctionalState EnInt)
*功能        :  開啟或關閉一個VIC中斷
*參數        :  INT_N:中斷編號(見:中斷源編號定義),
* 			EnInt = ENABLE,1使能;=DISABLE,0失能;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  使能或失能VIC0,VIC1的一個中斷
*************************************************************************************************************************/
void Set_IntEnable(vu8 INT_N,FunctionalState EnInt)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	} 
	if(EnInt == ENABLE) //使能中斷
		P->INTENABLE = 1 << INT_N;	//寫1使能中斷,寫0無影響
	else		//取消中斷
		P->INTENCLEAR = 1 << INT_N;	//寫1清除中斷使能,寫0無影響
}


/*************************************************************************************************************************
*函數        :	u8 Get_IntEnable(vu8 INT_N)
*功能        :  獲取一個中斷屏蔽狀態
*參數        :  中斷編號
*返回        :  1:該中斷失能,0:該中斷失能
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120524
*最後修改時間: 	20120524
*說明        :  獲取一個中斷屏蔽狀態
*************************************************************************************************************************/
u8 Get_IntEnable(vu8 INT_N)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	} 
	if(P->INTENABLE & (1 << INT_N)) //該中斷使能
		return 1;
	else 
		return 0;
}


/*************************************************************************************************************************
*函數        :	void Set_SoftInt(u8 INT_N,u8 ENABLE)
*功能        :  開啟或關閉一個軟件中斷
*參數        :  INT_N:中斷編號(見:中斷源編號定義),ENABLE = Enable,1使能;=Disable,0失能;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  使能或失能VIC0,VIC1的一個軟件中斷
*************************************************************************************************************************/
void Set_SoftInt(vu8 INT_N,vu8 ENABLE)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	} 
	if(ENABLE) //使能中斷
		P->SOFTINT = 1 << INT_N;	//寫1使能軟件中斷,寫0無影響
	else		//取消中斷
		P->SOFTINTCLEAR = 1 << INT_N;	//寫1清除軟件中斷使能,寫0無影響
}



/*************************************************************************************************************************
*函數        :	void Set_IsrAddr(u8 INT_N,vu32 IsrAdd)
*功能        :  設置中斷矢量入口
*參數        :  INT_N:中斷編號(見:中斷源編號定義),IsrAdd:中斷服務程序指針;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20120311
*說明        :  設置矢量地址寄存器
*************************************************************************************************************************/
void Set_IsrAddr(vu8 INT_N,vu32 IsrAdd)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	}
	P->VECTADDR[INT_N] = IsrAdd;//將中斷服務程序入口地址寫入矢量地址寄存器
}


/*************************************************************************************************************************
*函數        :	void Set_VectorPriority(u8 INT_N,u8 Priority)
*功能        :  設置矢量優先級
*參數        :  INT_N:中斷編號(見:中斷源編號定義),Priority:優先級0-15;
*返回        :  無
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120305
*最後修改時間: 	20120305
*說明        :  優先級為0-15,值越大優先級越高,15最高,0最低;
*************************************************************************************************************************/
void Set_VectorPriority(vu8 INT_N,vu8 Priority)
{
	VICx_TypeDef *P = VIC0;
	
	if(INT_N > 31)	//VIC1
	{
		INT_N -= 32;
		P = VIC1;
	}
	P->VECTRPRIORITY[INT_N] = Priority;//將中斷優先級寫入寄存器
}





/*************************************************************************************************************************
*函數        :	u32 Get_PLLCLK(int pllreg)
*功能        :  獲取PLL時鐘頻率
*參數        :  pllreg : PLL選擇
					APLL 	0	//ARM內核時鐘PLL
					MPLL 	1	//主時鐘PLL
					EPLL 	2	//外設時鐘PLL
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120526
*最後修改時間: 	20120526
*說明        :  無
*************************************************************************************************************************/
u32 Get_PLLCLK(u8 pllreg)
{
	u32 r = 0, m, p, s;

	if (pllreg == APLL)
		r = rAPLL_CON;
	else if (pllreg == MPLL)
		r = rMPLL_CON;
	else if (pllreg == EPLL)
		r = rEPLL_CON0;

	m = (r>>16) & 0x3ff;
	p = (r>>8) & 0x3f;
	s = r & 0x7;

	return (m * (SYSTEM_MAIN_CLK_IN / (p * (1 << s))));
}


/*************************************************************************************************************************
*函數        :	u32 Get_FCLK(void)
*功能        :  獲取FCLK時鐘頻率
*參數        :  無
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120526
*最後修改時間: 	20120526
*說明        :  無
*************************************************************************************************************************/
u32 Get_FCLK(void)
{
	return (Get_PLLCLK(APLL));
}



/*************************************************************************************************************************
*函數        :	u32 Get_PCLK(void)
*功能        :  獲取PCLK時鐘頻率
*參數        :  無
*返回        :  頻率,HZ
*依賴        :	底層宏定義
*作者        :  [email protected]
*時間        :	20120526
*最後修改時間: 	20120526
*說明        :  無
*************************************************************************************************************************/
u32 Get_PCLK(void)
{
	u32 fclk;
	u32 hclkx2_div = ((rCLK_DIV0 >> 9) & 0x7) + 1;
	u32 pre_div = ((rCLK_DIV0 >> 12) & 0xf) + 1;

	if(rOTHERS & 0x80)
		fclk = Get_FCLK();		// SYNC Mode
	else
		fclk = Get_PLLCLK(MPLL);	// ASYNC Mode

	return fclk/(hclkx2_div * pre_div);
}












//////////////////////////////////////////////////////////////////
//???????′???,???printf????,
//PRINTF_EN == 1,?????printf??????
#if (PRINTF_EN_ == 1)
#include "uart.h" 

int fputc(int ch,FILE *f)
{     
	UART0_SendByte((u8)ch);     
	return ch;
}
#endif

//PRINTF_EN == 2,?????printf?????
#if (PRINTF_EN_== 2)
#include "tft_lcd.h"

int fputc(int ch, FILE *f)
{    
	static u16 X;
	static u16 X1;
	static u16 Y;
	static u8 flag;
 	
 	if(flag == 0)
 	{
	 	if(Y > LCD_YSIZE-1-16)
		{
			
			Y = 0;
			X = X1 = LCD_XSIZE/2;
			flag = 1;
			LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);	//????????
		}
 	}
 	else
 	{
	 	if(Y > LCD_YSIZE-1-16)
		{
			Y = 0;
			X = X1 = 0;
			flag = 0;
			LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff);	//????????
		}
 	}
	
	
	if((u8)ch == '\n')
	{
	 	X = X1;
		Y += 12;
	}
	else if((u8)ch > 0x80) //????
	{
		return ch;
	}
	else
	{
		LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);
		
		if(flag == 0)
		{
			if(X > LCD_XSIZE/2-1-8)
			{
			 	X = X1;
				Y += 12;
			}
			else
				X += 8;
		}
		else
		{
			if(X > LCD_XSIZE-1-8)
			{
			 	X = X1;
				Y += 12;
			}
			else
				X += 8;
		}
	}     

	return ch;
}
#endif


//PRINTF_EN == 3,???????printf??????????
#if (PRINTF_EN_ == 3)
#include "tft_lcd.h"
#include "uart.h"
#include <locale.h>
u8 PrintfSet = 0;	//0:????printf??????;1:????printf?????

int fputc(int ch, FILE *f)
{    
	static u16 X;
	static u16 X1;
	static u16 Y;
	static u8 flag;
 	
	if(PrintfSet)
	{
		if(flag == 0)
	 	{
		 	if(Y > LCD_YSIZE-1-16)
			{
				
				Y = 0;
				X = X1 = LCD_XSIZE/2;
				flag = 1;
				LCD_Fill(X1,LCD_XSIZE-1,0,LCD_YSIZE-1,0xffff);	//????????
			}
	 	}
	 	else
	 	{
		 	if(Y > LCD_YSIZE-1-16)
			{
				Y = 0;
				X = X1 = 0;
				flag = 0;
				LCD_Fill(0,LCD_XSIZE/2-1,0,LCD_YSIZE-1,0xffff);	//????????
			}
	 	}
		
		
		if((u8)ch == '\n')
		{
		 	X = X1;
			Y += 12;
		}
		else if((u8)ch > 0x80) //????
		{
			return ch;
		}
		else
		{
			LCD_Char(X,Y,(u8 *)&ch,0x0000,0xffff,0x80);
			
			if(flag == 0)
			{
				if(X > LCD_XSIZE/2-1-8)
				{
				 	X = X1;
					Y += 12;
				}
				else
					X += 8;
			}
			else
			{
				if(X > LCD_XSIZE-1-8)
				{
				 	X = X1;
					Y += 12;
				}
				else
					X += 8;
			}
		}
	}
	else
		UART0_SendByte((u8)ch);

	return ch;
}
#endif






//system.h

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