main.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* The classic embedded version of "Hello World": A blinking LED */
  2. #include <arm/NXP/LPC17xx/LPC17xx.h>
  3. #define BV(x) (1<<(x))
  4. #define BITBAND(addr,bit) (*((volatile unsigned long *)(((unsigned long)&(addr)-0x20000000)*32 + bit*4 + 0x22000000)))
  5. #define PLL_MULT(x) ((x)&0x7fff)
  6. #define PLL_PREDIV(x) (((x)<<16)&0xff0000)
  7. #define CLKSRC_MAINOSC (1)
  8. #define PLLE0 (1<<0)
  9. #define PLLC0 (1<<1)
  10. #define PLOCK0 (1<<26)
  11. #define OSCEN (1<<5)
  12. #define OSCSTAT (1<<6)
  13. #define EMC0TOGGLE (3<<4)
  14. #define MR0R (1<<1)
  15. #define FLASH5C (0x403A)
  16. #define PCTIM3 (1<<23)
  17. #define PCLK_CCLK(x) (1<<(x))
  18. #define PCLK_CCLK4(x) (0)
  19. #define PCLK_CCLK8(x) (3<<(x))
  20. #define PCLK_CCLK2(x) (2<<(x))
  21. #define PCLK_TIMER3 (14)
  22. int i;
  23. int main(void) {
  24. LPC_GPIO2->FIODIR = BV(0) | BV(1) | BV(2);
  25. LPC_GPIO1->FIODIR = 0;
  26. uint32_t p1;
  27. /* setup PLL0 */
  28. LPC_SC->FLASHCFG=FLASH5C;
  29. LPC_SC->PLL0CON &= ~PLLC0;
  30. LPC_SC->PLL0FEED=0xaa;
  31. LPC_SC->PLL0FEED=0x55;
  32. LPC_SC->PLL0CON &= ~PLLE0;
  33. LPC_SC->PLL0FEED=0xaa;
  34. LPC_SC->PLL0FEED=0x55;
  35. /* PLL is disabled and disconnected. setup PCLK NOW as it cannot be changed
  36. reliably with PLL0 connected.
  37. see:
  38. http://ics.nxp.com/support/documents/microcontrollers/pdf/errata.lpc1754.pdf
  39. */
  40. LPC_SC->PCLKSEL1=PCLK_CCLK(PCLK_TIMER3);
  41. /* continue with PLL0 setup */
  42. LPC_SC->SCS=OSCEN;
  43. while(!(LPC_SC->SCS&OSCSTAT));
  44. LPC_SC->CLKSRCSEL=CLKSRC_MAINOSC;
  45. LPC_SC->PLL0CFG=PLL_MULT(428)|PLL_PREDIV(18);
  46. LPC_SC->PLL0FEED=0xaa;
  47. LPC_SC->PLL0FEED=0x55;
  48. LPC_SC->PLL0CON |= PLLE0;
  49. LPC_SC->PLL0FEED=0xaa;
  50. LPC_SC->PLL0FEED=0x55;
  51. LPC_SC->CCLKCFG=5;
  52. while(!(LPC_SC->PLL0STAT&PLOCK0));
  53. LPC_SC->PLL0CON |= PLLC0;
  54. LPC_SC->PLL0FEED=0xaa;
  55. LPC_SC->PLL0FEED=0x55;
  56. /* setup timer (fpga clk) */
  57. LPC_SC->PCONP |= PCTIM3; /* enable power */
  58. LPC_TIM3->CTCR=0;
  59. LPC_TIM3->EMR=EMC0TOGGLE;
  60. LPC_PINCON->PINSEL0=(0x3<<20);
  61. LPC_TIM3->MCR=MR0R;
  62. LPC_TIM3->MR0=1;
  63. LPC_TIM3->TCR=1;
  64. while (1) {
  65. p1 = LPC_GPIO1->FIOPIN;
  66. BITBAND(LPC_GPIO2->FIOPIN, 0) = (p1 & BV(29))>>29;
  67. BITBAND(LPC_GPIO2->FIOSET, 2) = 1;
  68. for (i=0;i<100000;i++)
  69. __NOP();
  70. BITBAND(LPC_GPIO2->FIOCLR, 2) = 1;
  71. for (i=0;i<100000;i++)
  72. __NOP();
  73. }
  74. }