toilet

xaxa9ztb - Lập trình điều khiển IO trên KIT NUC220

Thảo luận trong 'Bài viết dự thi'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. Đăng 2/6/14 #1

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    Lập trình điều khiển IO cho kit NUC220
    Chúng ta sẽ dựa vào thư viện có sẵn tải về trên trang chủ của nuvoton hoặc thư viện của CoIDE (hai thư viện này là một) để lập trình điều khiển IO cho NUC220
    Có 4 chế độ cơ bản nhất của IO là
    • Input
    • open drain
    • push-pull ouput
    • Quasi-bidirection .
    lệnh set mode cho IO
    Mã:
    /*@brief       Set GPIO Pin Mode
    *
    * @param[in]   PORT        GPIO port. có thể là PA, PB, PC, PD, PE và PF.
    * @param[in]   pin           số thứ tự của pin từ 0-15
    * @param[in]   mode        chế độ của pin GPIO_PMD_INPUT, GPIO_PMD_OUTPUT, GPIO_PMD_OPEN_DRAIN or GPIO_PMD_QUASI.
    */
    #define _GPIO_SET_PIN_MODE(PORT, pin, mode)   
    Mã:
    /* Định nghĩa mức cao hay mức thấp ở mỗi pin:
       Example 1:
    
           PA0 = 1;
    
       Set PA0 là mức cao;
    
       Example 2:
    
           if (PA0)
               PA0 = 0;
    
       nếu PA0 đang ở mức cao thì set PA0 xuống mức thấp.
    */
    
    câu lệnh đơn giản này nó thay cho cả ba câu lệnh SetBits, ClrBits và GetBits bên thư viện của các dòng như NUC100 hay Nano100
    chúng ta làm thử một bài đơn giản là blink led và hiệu ứng led chạy từ ngoài vào giữa
    Nối 6 led vào pin 8 tới pin 13 của portC của NUC220. Chúng ta cần xuất mức 0 để led sáng
    Screenshot - 7_17_2014 , 6_34_12 PM.
    Mã:
    #include <stdint.h>  //uint_t
    #include <NUC200Series.h>
    #include <GPIO.h>
    #include <SYS.h>
    #define PLLCON_SETTING      SYSCLK_PLLCON_50MHz_XTAL
    #define PLL_CLOCK           50000000
    #define LED_PORT PA
    
    /********************************/
    void Delay_ms( uint32_t T)
    {
      while(T--){SYS_SysTickDelay(1000);}
    }
    void Delay_us(uint32_t T)
    {
        SYS_SysTickDelay(T);
    }
    /****************************************/
    void SYS_Init(void)
    {
        /*---------------------------------------------------------------------------------------------------------*/
        /* Init System Clock                                                                                       */
        /*---------------------------------------------------------------------------------------------------------*/
           /* Unlock protected registers */
           SYS_UnlockReg();
    
           /* Enable External XTAL (4~24 MHz) */
           SYSCLK->PWRCON |= SYSCLK_PWRCON_XTL12M_EN_Msk;
    
           /* Waiting for 12MHz clock ready */
           SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_XTL12M_STB_Msk);
    
           /* Switch HCLK clock source to XTAL */
           SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_XTAL;
    
           /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
           SYSCLK->PLLCON |= SYSCLK_PLLCON_PD_Msk;
    
           /* Set PLL frequency */
           SYSCLK->PLLCON = PLLCON_SETTING;
    
           /* Waiting for clock ready */
           SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_PLL_STB_Msk);
    
           /* Switch HCLK clock source to PLL */
           SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_PLL;
    
           /* Update System Core Clock */
           /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
           //SystemCoreClockUpdate();
           PllClock        = PLL_CLOCK;            // PLL
           SystemCoreClock = PLL_CLOCK / 1;        // HCLK
           CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay() //systick us
           /* Lock protected registers */
           SYS_LockReg();
    }
    void blink()  //blinkled
    {
          int  i=0;
          for (i = 8; i < 14; ++i)
          {_GPIO_SET_PIN_MODE(PC,i,GPIO_PMD_OUTPUT);}
          Delay_ms(200);
          for (i = 8; i < 14; ++i)
          {_GPIO_SET_PIN_MODE(PC,i,GPIO_PMD_INPUT);}
          Delay_ms(200);
    }
    void lefttoright()  // led sang tu trai sang phai
    {
        int i = 0;
        for (i = 8; i < 14; i++)
        {_GPIO_SET_PIN_MODE(PC, i, GPIO_PMD_OUTPUT);
        Delay_ms(250);
        }
        for (i = 8; i < 14; ++i) {_GPIO_SET_PIN_MODE(PC, i, GPIO_PMD_INPUT);
            Delay_ms(250);
        }
    }
    void righttoleft()  // led sang tu phai sang trai
    {
        int i = 0;
        for (i = 13; i >7; i--) {
          _GPIO_SET_PIN_MODE(PC, i, GPIO_PMD_OUTPUT);
            Delay_ms(250);
        }
        for (i = 13; i >7; i--) {
            _GPIO_SET_PIN_MODE(PC, i, GPIO_PMD_INPUT);
            Delay_ms(250);
        }
    }
    int main(void)
    {
        SYS_Init();
        int i;
        int a =0;
        PC8 = 0; // PC0 out muc 0
        PC9 = 0;
        PC10=0;
        PC11=0;
        PC12=0;
        PC13=0;
        while(1)
           {
            for (i = 0;  i< 3; i++) { blink();} // nhay 3 lan
           lefttoright();
           righttoleft();
           }
    }
    
    
    p/s:
    Video:
    Xin Cảm ơn
    BuiBachTuanAnh, camxuc831daotruongpro thích bài này.
    #1

Chia sẻ trang này