Thông báo

Collapse
No announcement yet.

ARM Cortex M3 trên chip LPC1768

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • ARM Cortex M3 trên chip LPC1768

    Chào các bác, mấy tuần nay mình đang vật vã với con LPC1768 của NXP và có 1 số vấn đề cần thảo luận với các bác như sau:

    LPC1768 là 1 loại vi điều khiển sử dụng lõi ARM Cortex – M3 có tốc độ hoạt động cao 120MHz. Với đặc điểm của ARM Cortex – M3 sử dụng cấu trúc Harvard phân tầng 3-stage. Ngoại vi của LPC17xx gồm bộ nhớ flash 512kB, bộ nhớ dữ liệu 64kB, hỗ trợ Ethernet MAC, Host, Device, OTG USB, 8 kênh điều khiển GPDMA, 4 UART, 2 CAN, 2 SSP, SPI, 3 giao diện I2C, 2 I2S, 8 kênh ADC 12bit, bộ điều khiển NVIC 32bit, DAC 10bit, QEI, 4 timer, 6 PWM, RTC, 70 pin GPIO.
    Ngoài ra LPC1768 còn hỗ trợ bộ điều khiển motor MCPWM, bộ điều khiển này cho phép người dùng điều khiển xung ra như mong muốn nhờ có thanh ghi Match, giúp hỗ trợ tốt trong việc điều khiển các loại động cơ 3 pha AC, DC và những ứng dụng cần chính xác về timing, counting, capture and comparation.
    MCPWM có 3 kênh, mỗi kênh có thanh ghi Timer/Counter, Limit, Match 32bit, dead-time 10 bit, capture 32 bit, 2 ngõ ra modulated (MCOA và MCOB).




    Sơ đồ khối MCPWM.
    Last edited by nguyenvanvui; 14-12-2010, 21:26.
    các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
    trên các dòng chip: stm32, lpc of nxp
    please cell phone: 01649895559

  • #2
    Sau đây mình xin post tiếp code quét LED đơn giản được viết trên Keil4.1 và được test trên kit LPC1768 mà mình đang mượn của anh Bảo (hbaocr),hehe thanks anh Bảo đã cho em mượn kit nha (^:^) chắc em mượn lun vài tháng nữa quá,vì còn 1 vài ứng dụng mà em chưa "phá" được,..hihi

    // the programming for LPC1768 kit to control blinky LEDs
    // designed by kitthinghiem.com


    #include <lpc17xx.h>
    #include "led.h"

    void LED_Init(void)
    {
    //call the control register
    PINCON->PINSEL0 = 0x00000000;
    PINCON->PINSEL1 = 0x00000000;
    PINCON->PINSEL2 = 0x00000000;
    PINCON->PINSEL3 = 0x00000000;

    //reset values to 0 of port P0.[0..7]
    GPIO0->FIODIR = 0x00000000;
    GPIO0->FIOSET = 0x00000000;
    GPIO0->FIOCLR = 0x00000000;

    GPIO0->FIODIR = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|( 1<<7);
    }
    void LED_On (unsigned long num)
    {
    GPIO0->FIOSET = (1 << num); //num tu 0->7
    }

    void LED_Off (unsigned int num)
    {
    GPIO0->FIOCLR = (1 << num); //num tu 0->7
    }
    void LED(void)
    {
    int i,j;
    for(i=0;i<=7;i++)
    {
    LED_On(i);
    delay(3900);
    }
    for(j=7;j>=0;j--)
    {
    LED_Off(j);
    delay(3900);
    }
    }
    static void delay(int cnt)
    {

    cnt <<= DELAY_2N;

    while (cnt--);
    }
    int main()
    {
    LED_Init();
    while(1)
    {
    LED();
    }
    }
    các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
    trên các dòng chip: stm32, lpc of nxp
    please cell phone: 01649895559

    Comment


    • #3
      Chào các bác, lâu quá mình bận quá nên ko thể post típ bài nào đc,hôm nay mình mạo mụi post bài 7 segment LED tren chú LPC1768 và đc đk qua chuẩn giao tiếp SPI, các bác xem và góp ý dùm mình nhé.

      Code:
      #include <LPC17xx.H> 
      
      /* SPI Interface: SPI3
         
         PINS: 
         - CS     = P0.6 (GPIO pin)
         - RS     = GND
         - WR/SCK = P0.7 (SCK1)
         - RD     = GND
         - SDO    = P0.8 (MISO1)
         - SDI    = P0.9 (MOSI1)                                                    */
      
      /*
       Configure communicate between LPC1700 and LED Digit via 74HC595 by SPI interface
       schematic: LPC1700 (SPI) -> 74HC595 -> LED Digit
      Designed by kitthinghiem.com
      */
      typedef unsigned int uint32;
      typedef unsigned char uint8;
      
      #define   HC595_CS    (1<<0)
      #define PIN_CS      (1 << 6)
      /*----------------------------------------------------------------------------
        Define clocks
       *----------------------------------------------------------------------------*/
      #define XTAL        (12000000UL)        /* Oscillator frequency               */
      #define OSC_CLK     (      XTAL)        /* Main oscillator frequency          */
      #define RTC_CLK     (   32000UL)        /* RTC oscillator frequency           */
      #define IRC_OSC     ( 4000000UL)        /* Internal RC oscillator frequency   */
      
      
      /* SPI_SR - bit definitions                                                   */
      
      /* Pin CS setting to 0 or 1                                                   */
      #define CS(x)   ((x) ? (LPC_GPIO0->FIOSET = PIN_CS) : (LPC_GPIO0->FIOCLR = PIN_CS));
      #define TFE         0x01
      #define RNE         0x04
      #define BSY         0x10
      #define SPI_START   (0x70)              /* Start byte for SPI transfer        */
      #define SPI_RD      (0x01)              /* WR bit 1 within start              */
      #define SPI_WR      (0x00)              /* WR bit 0 within start              */
      #define SPI_DATA    (0x02)              /* RS bit 1 within start byte         */
      #define SPI_INDEX   (0x00)              /* RS bit 0 within start byte         */
      
      
      
      #define   DELAY_2N    14
      
      uint32_t SystemFrequency = IRC_OSC; /*!< System Clock Frequency (Core Clock)  */
      
      uint8 const DISP_TAB[10]={0x03,0x9F,0x24,0x0C,0x98,0x48,0x40,0x1E,0x00,0x08};
      static void delay (int cnt) ;
      
      void spiInit (void)
      {
      #if (CLOCK_SETUP)                       /* Clock Setup                        */
        LPC_SC->SCS       = SCS_Val;
        if (SCS_Val & (1 << 5)) {             /* If Main Oscillator is enabled      */
          while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready    */
        }
      
        LPC_SC->CCLKCFG   = CCLKCFG_Val;      /* Setup Clock Divider                */
      
      #if (PLL0_SETUP)
        LPC_SC->CLKSRCSEL = CLKSRCSEL_Val;    /* Select Clock Source for PLL0       */
        LPC_SC->PLL0CFG   = PLL0CFG_Val;
        LPC_SC->PLL0CON   = 0x01;             /* PLL0 Enable                        */
        LPC_SC->PLL0FEED  = 0xAA;
        LPC_SC->PLL0FEED  = 0x55;
        while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0                    */
      
        LPC_SC->PLL0CON   = 0x03;             /* PLL0 Enable & Connect              */
        LPC_SC->PLL0FEED  = 0xAA;
        LPC_SC->PLL0FEED  = 0x55;
      #endif
      
      #if (PLL1_SETUP)
        LPC_SC->PLL1CFG   = PLL1CFG_Val;
        LPC_SC->PLL1CON   = 0x01;             /* PLL1 Enable                        */
        LPC_SC->PLL1FEED  = 0xAA;
        LPC_SC->PLL1FEED  = 0x55;
        while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1                    */
      
        LPC_SC->PLL1CON   = 0x03;             /* PLL1 Enable & Connect              */
        LPC_SC->PLL1FEED  = 0xAA;
        LPC_SC->PLL1FEED  = 0x55;
      #else
        LPC_SC->USBCLKCFG = USBCLKCFG_Val;    /* Setup USB Clock Divider            */
      #endif
      
        LPC_SC->PCLKSEL0  = PCLKSEL0_Val;     /* Peripheral Clock Selection         */
        LPC_SC->PCLKSEL1  = PCLKSEL1_Val;
      
        LPC_SC->PCONP     = PCONP_Val;        /* Power Control for Peripherals      */
      
        LPC_SC->CLKOUTCFG = CLKOUTCFG_Val;    /* Clock Output Configuration         */
      #endif
      
        /* Determine clock frequency according to clock register values             */
        if (((LPC_SC->PLL0STAT >> 24)&3)==3) {/* If PLL0 enabled and connected      */
          switch (LPC_SC->CLKSRCSEL & 0x03) {
            case 0:                           /* Internal RC oscillator => PLL0     */
            case 3:                           /* Reserved, default to Internal RC   */
              SystemFrequency = (IRC_OSC * 
                                ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1)))  /
                                (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)    /
                                ((LPC_SC->CCLKCFG & 0xFF)+ 1));
              break;
            case 1:                           /* Main oscillator => PLL0            */
              SystemFrequency = (OSC_CLK * 
                                ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1)))  /
                                (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)    /
                                ((LPC_SC->CCLKCFG & 0xFF)+ 1));
              break;
            case 2:                           /* RTC oscillator => PLL0             */
              SystemFrequency = (RTC_CLK * 
                                ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1)))  /
                                (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)    /
                                ((LPC_SC->CCLKCFG & 0xFF)+ 1));
              break;
          }
        } else {
          switch (LPC_SC->CLKSRCSEL & 0x03) {
            case 0:                           /* Internal RC oscillator => PLL0     */
            case 3:                           /* Reserved, default to Internal RC   */
              SystemFrequency = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1);
              break;
            case 1:                           /* Main oscillator => PLL0            */
              SystemFrequency = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);
              break;
            case 2:                           /* RTC oscillator => PLL0             */
              SystemFrequency = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);
              break;
          }
        }
      
      #if (FLASH_SETUP == 1)                  /* Flash Accelerator Setup            */
        LPC_SC->FLASHCFG  = FLASHCFG_Val;
      #endif
      }
      
      static __inline unsigned char spi_send (unsigned char byte) 
      {
      
        LPC_SSP1->DR = byte;
        while (!(LPC_SSP1->SR & RNE));        /* Wait for send to finish            */
        return (LPC_SSP1->DR);
      }
      
      static __inline void wr_dat_start (void) 
      {
      
        CS(0)
        spi_send(SPI_START | SPI_WR | SPI_DATA);    /* Write : RS = 1, RW = 0       */
      }
      static __inline void wr_dat_stop (void) 
      { 
        CS(1)
      }
      
      static __inline unsigned char sendSPI1 (unsigned char byte) 
      {
        LPC_GPIO0->FIOCLR |=   HC595_CS|PIN_CS;                           	// Falling Edge Latch(Start Chips Select)	  
        LPC_SSP1->DR = byte;					 // Send SPI to 74HC595 Output(Toggle Logic Drive)
        while (!(LPC_SSP1->SR & RNE));        /* Wait for send to finish            */
        LPC_GPIO0->FIOSET |=   HC595_CS|PIN_CS;                           	// Rising Edge Latch(Stop Chips Select)				      
        delay(2);
        return (LPC_SSP1->DR);
      } 
      
      int main(void)
      {		
      	uint8 i=0;							
      	spiInit();
      	LPC_GPIO0->FIODIR0 =   HC595_CS|PIN_CS;
      	LPC_GPIO0->FIOCLR =   HC595_CS|PIN_CS;
       	   
        while(1)												
        { 	
      		wr_dat_start();
      		sendSPI1(DISP_TAB[i]);
      		delay(10);
      		i++;
      		if(i==10) i=0;
      		wr_dat_stop();
        }   
      }	  
      
      static void delay (int cnt) 
      { 
        cnt <<= DELAY_2N;
        while (cnt--);
      }
      Vì vội quá nên code hoi lộn xộn mong các bác thông cảm
      các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
      trên các dòng chip: stm32, lpc of nxp
      please cell phone: 01649895559

      Comment


      • #4
        Nguyên văn bởi nguyenvanvui Xem bài viết
        Sau đây mình xin post tiếp code quét LED đơn giản được viết trên Keil4.1 và được test trên kit LPC1768 mà mình đang mượn của anh Bảo (hbaocr),hehe thanks anh Bảo đã cho em mượn kit nha (^:^) chắc em mượn lun vài tháng nữa quá,vì còn 1 vài ứng dụng mà em chưa "phá" được,..hihi

        // the programming for LPC1768 kit to control blinky LEDs
        // designed by kitthinghiem.com


        #include <lpc17xx.h>
        #include "led.h"

        void LED_Init(void)
        {
        //call the control register
        PINCON->PINSEL0 = 0x00000000;
        PINCON->PINSEL1 = 0x00000000;
        PINCON->PINSEL2 = 0x00000000;
        PINCON->PINSEL3 = 0x00000000;

        //reset values to 0 of port P0.[0..7]
        GPIO0->FIODIR = 0x00000000;
        GPIO0->FIOSET = 0x00000000;
        GPIO0->FIOCLR = 0x00000000;

        GPIO0->FIODIR = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|( 1<<7);
        }
        void LED_On (unsigned long num)
        {
        GPIO0->FIOSET = (1 << num); //num tu 0->7
        }

        void LED_Off (unsigned int num)
        {
        GPIO0->FIOCLR = (1 << num); //num tu 0->7
        }
        void LED(void)
        {
        int i,j;
        for(i=0;i<=7;i++)
        {
        LED_On(i);
        delay(3900);
        }
        for(j=7;j>=0;j--)
        {
        LED_Off(j);
        delay(3900);
        }
        }
        static void delay(int cnt)
        {

        cnt <<= DELAY_2N;

        while (cnt--);
        }
        int main()
        {
        LED_Init();
        while(1)
        {
        LED();
        }
        }
        Chào bạn !
        bạn cho mình hỏi #include "led.h" khai báo như thế nào vậy.
        và câu lệnh GPIO0->FIODIR = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|( 1<<7); ý nghĩa của nó là gì. Vì mình mới bắt đầu tìm hiểu mong bạn chỉ giáo dùm.

        Thâ chào và cảm ơn bạn nhiều

        Comment


        • #5
          Toán tử dịch bit đấy. Chịu khó tham khảo cách lập trình C để có thể làm việc được nha bồ tèo.
          http://profesores.fi-b.unam.mx/cintia/ctutor.pdf

          Comment


          • #6
            Chào bạn !!!

            Bạn cho mình hỏi "led.h" được khai báo ở đâu và khai báo như thế nào vậy.

            Thân chào và cảm ơn bạn nhiều !

            Comment


            • #7
              Mong mọi người sớm giải đáp giùm mình câu hỏi trên
              cảm ơn mọi người nhiều

              Comment


              • #8
                "led.h" là của thư viện nào đó mà người viết tự chế ra, em không thể sử dụng đoạn code trên theo kiểu mì ăn liền được, nó chỉ mang tính tham khảo chứ không thể chạy ngay được vì thiếu quá nhiều thứ.
                Từ chối trách nhiệm:
                Mọi thông tin từ ITX cung cấp với hi vọng nó có ích và không đi kèm với bất kì sự bảo đảm nào.
                Blog: http://mritx.blogspot.com

                Comment


                • #9
                  Nguyên văn bởi pkluit Xem bài viết
                  Chào bạn !
                  bạn cho mình hỏi #include "led.h" khai báo như thế nào vậy.
                  và câu lệnh GPIO0->FIODIR = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|( 1<<7); ý nghĩa của nó là gì. Vì mình mới bắt đầu tìm hiểu mong bạn chỉ giáo dùm.

                  Thâ chào và cảm ơn bạn nhiều
                  Sorry vì lâu quá ko ghé diễn đàn,
                  led.h là thư viện điều khiển led do mình tự tạo ra sau đó gọi vào.
                  bạn cũng có thể tạo được bằng cách tạo 1 file *.c nào đó sau đó bạn gôm các tên hàm lại trong file *.h
                  file *.h sẽ giúp bạn gọi các hàm đó trong hàm main tại bất kỳ 1 file khác trong cùng 1 project.
                  Còn đoạn GPIO0->FIODIR = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|( 1<<7) với -> là con trỏ và << là toán tử dịch bit

                  Chúc bạn may mắn,
                  các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
                  trên các dòng chip: stm32, lpc of nxp
                  please cell phone: 01649895559

                  Comment


                  • #10
                    Code mẫu về con này thì nhiều lắm. Chỉ tội k có kit để test thôi.
                    Bạn đến trang này nha: http://knowledgebase.nxp.com/showthread.php?t=727 post 4.
                    Chúc thành công!

                    Comment


                    • #11
                      Có bác nào biết đây là board gì không ?

                      Comment

                      Về tác giả

                      Collapse

                      nguyenvanvui Tìm hiểu thêm về nguyenvanvui

                      Bài viết mới nhất

                      Collapse

                      Đang tải...
                      X