LPC_SysControl.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. /*************************************************************************
  2. *
  3. * Used with ICCARM and AARM.
  4. *
  5. * (c) Copyright IAR Systems 2003
  6. *
  7. * File name : LPC_SysControl.c
  8. * Description : Define API for system init
  9. *
  10. * History :
  11. * 1. Data: August 17, 2004
  12. * Author: Shawn Zhang
  13. * Description: Create the basic function
  14. *
  15. * 2. Data : Oct 7, 2004
  16. * Author : Stanimir Bonev
  17. * Description : Modify some function and interface
  18. *
  19. * $Revision: 1.2 $
  20. **************************************************************************/
  21. #include "LPC_SysControl.h"
  22. LPC_Syscontrol_Config_t SysConfig;
  23. /*************************************************************************
  24. * Function Name: SYS_Init
  25. * Parameters: unsigned long Fosc
  26. * unsigned long Fcclk
  27. * LPC_SysControl_VPBDiv_t VPBDivider
  28. * LPC_SysControl_RemapMode_t RemapMode
  29. * bool MAMEnable
  30. * LPC_SysControl_MAMConfig_t *pMAMConfig
  31. * unsigned long PortDir0
  32. * unsigned long Port0
  33. * unsigned long PortDir1
  34. * unsigned long Port1
  35. *
  36. * Return: int
  37. * 0: success
  38. * non-zero: error number
  39. *
  40. * Description: Initialize the whole system, setting MEMMAP, VPB, whether enable PLL,
  41. * whether enable MAM
  42. *
  43. *************************************************************************/
  44. int SYS_Init (unsigned long Fosc, unsigned long Fcclk,
  45. LPC_SysControl_VPBDiv_t VPBDivider,
  46. LPC_SysControl_RemapMode_t RemapMode,
  47. unsigned long PortDir0, unsigned long Port0,
  48. unsigned long PortDir1, unsigned long Port1)
  49. {
  50. unsigned long M, P_min, P_max, P, i;
  51. int Pflag = 0, PLLflag = 0;
  52. // Check vaild
  53. if ( Fosc<Fosc_MIN || Fosc>Fosc_MAX)
  54. return 1;
  55. if ( Fcclk<Fcclk_MIN || Fcclk>Fcclk_MAX)
  56. return 1;
  57. if (Fcclk < Fosc)
  58. return 1;
  59. else if (Fcclk > Fosc)
  60. {
  61. // Calculate PLL's value M & P if need
  62. M = Fcclk / Fosc;
  63. P_min = Fcco_MIN / (2*Fcclk) + 1;
  64. P_max = Fcco_MAX / (2*Fcclk);
  65. for (i=P_min; i<=P_max; i++)
  66. {
  67. if ((i ==1) || (i==2) ||(i==4) || (i==8))
  68. {
  69. P=i;
  70. Pflag = 1;
  71. break;
  72. }
  73. }
  74. if (!Pflag) return 1;
  75. PLLflag = 1;
  76. }
  77. // Set globe variable
  78. SysConfig.Fosc = Fosc;
  79. SysConfig.Fcclk = Fcclk;
  80. switch(VPBDivider)
  81. {
  82. case VPBDIV4:
  83. SysConfig.Fpclk= Fcclk / 4;
  84. break;
  85. case VPBDIV1:
  86. SysConfig.Fpclk= Fcclk;
  87. break;
  88. case VPBDIV2:
  89. SysConfig.Fpclk= Fcclk / 2;
  90. break;
  91. default:
  92. return 1;
  93. }
  94. SysConfig.VPBDivider = VPBDivider;
  95. SysConfig.RemapMode = RemapMode;
  96. // Do PLL
  97. if (PLLflag)
  98. {
  99. PLLCFG_bit.MSEL = M-1; // Set M & P
  100. switch(P)
  101. {
  102. case 1:
  103. break;
  104. case 2:
  105. PLLCFG_bit.PSEL = 0x1;
  106. break;
  107. case 4:
  108. PLLCFG_bit.PSEL = 0x2;
  109. break;
  110. case 8:
  111. PLLCFG_bit.PSEL = 0x3;
  112. break;
  113. default:
  114. return 1;
  115. }
  116. PLLCON_bit.PLLE = true; // Enable PLL
  117. // Interrups must be disble
  118. PLLFEED = PLLFEED_DATA1;
  119. PLLFEED = PLLFEED_DATA2;
  120. while (!PLLSTAT_bit.PLOCK); // Wait PLL lock
  121. PLLCON_bit.PLLC = true; // Connect PLL
  122. PLLFEED = PLLFEED_DATA1;
  123. PLLFEED = PLLFEED_DATA2;
  124. }
  125. else
  126. {
  127. PLLCON_bit.PLLC = true;
  128. PLLCON_bit.PLLE = false;
  129. PLLFEED = PLLFEED_DATA1;
  130. PLLFEED = PLLFEED_DATA2;
  131. }
  132. // Do VPB
  133. VPBDIV_bit.VPBDIV = VPBDivider;
  134. // Do MEMAMP
  135. MEMMAP_bit.MAP = SysConfig.RemapMode;
  136. // Set GIO
  137. PINSEL0 = PINSEL1 = 0;
  138. IO0SET = Port0;
  139. IO0CLR = ~Port0;
  140. IO0DIR = PortDir0;
  141. IO1SET = Port1;
  142. IO1CLR = ~Port1;
  143. IO1DIR = PortDir1;
  144. return 0;
  145. }
  146. /*************************************************************************
  147. * Function Name: SYS_GetFpclk
  148. * Parameters: void
  149. * Return: int
  150. * 0: success
  151. * non-zero: error number
  152. * Description: Get Fpclk
  153. *
  154. *************************************************************************/
  155. unsigned int SYS_GetFpclk (void)
  156. {
  157. return SysConfig.Fpclk;
  158. }
  159. /*************************************************************************
  160. * Function Name: PM_SetMode
  161. * Parameters: LPC_SysControl_PMMode_t Mode -- PM_STANDARD ,PM_IDLE or PM_POWERDOWN
  162. * Return: int
  163. * 0: success
  164. * non-zero: error number
  165. * Description: Set power manage mode
  166. *
  167. *************************************************************************/
  168. int PM_SetMode (LPC_SysControl_PMMode_t Mode)
  169. {
  170. PCON = Mode & 0x3;
  171. return 0;
  172. }
  173. /*************************************************************************
  174. * Function Name: PM_OpenPeripheral
  175. * Parameters: lpc_uint32 DevType
  176. * Return: int
  177. * 0: success
  178. * non-zero: error number
  179. * Description: Open specifical peripheral
  180. *
  181. *************************************************************************/
  182. int PM_OpenPeripheral (unsigned int DevType)
  183. {
  184. PCONP |= DevType;
  185. return 0;
  186. }
  187. /*************************************************************************
  188. * Function Name: PM_ClosePeripheral
  189. * Parameters: lpc_uint32 DevType
  190. * Return: int
  191. * 0: success
  192. * non-zero: error number
  193. * Description: Close specifical peripheral
  194. *
  195. *************************************************************************/
  196. int PM_ClosePeripheral (unsigned int DevType)
  197. {
  198. PCONP &= (~DevType);
  199. return 0;
  200. }
  201. /*************************************************************************
  202. * Function Name: EXTINT_Init
  203. * Parameters: LPC_SysControl_ExtInt_Chanel_t ExtIntNum
  204. * bool WakeupEnable
  205. *
  206. * Return: int
  207. * 0 : success
  208. * non-zero : error number
  209. * Description: Set External Interrupt
  210. *
  211. *************************************************************************/
  212. int EXTINT_Init (LPC_SysControl_ExtInt_Chanel_t ExtIntNum,
  213. bool WakeupEnable)
  214. {
  215. switch(ExtIntNum)
  216. {
  217. case EXTINT0:
  218. // Assign pin to Ext Interrup logic
  219. PINSEL1_bit.P0_16 = 1;
  220. // Clear interrupt flag
  221. EXTINT_bit.EINT0 = 1;
  222. // Set Wakeup
  223. if (WakeupEnable)
  224. EXTWAKE_bit.EXTWAKE0 = 1;
  225. else
  226. EXTWAKE_bit.EXTWAKE0 = 0;
  227. break;
  228. case EXTINT1:
  229. // Assign pin to Ext Interrup logic
  230. PINSEL0_bit.P0_14 = 1;
  231. // Clear interrupt flag
  232. EXTINT_bit.EINT1 = 1;
  233. // Set Wakeup
  234. if (WakeupEnable)
  235. EXTWAKE_bit.EXTWAKE1 = 1;
  236. else
  237. EXTWAKE_bit.EXTWAKE1 = 0;
  238. break;
  239. case EXTINT2:
  240. // Assign pin to Ext Interrup logic
  241. PINSEL0_bit.P0_15 = 1;
  242. // Clear interrupt flag
  243. EXTINT_bit.EINT2 = 1;
  244. // Set Wakeup
  245. if (WakeupEnable)
  246. EXTWAKE_bit.EXTWAKE2 = 1;
  247. else
  248. EXTWAKE_bit.EXTWAKE2 = 0;
  249. break;
  250. default:
  251. return 1;
  252. }
  253. return 0;
  254. }