新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > SAM4E單片機之旅——6、LED閃爍之按鈕控制

        SAM4E單片機之旅——6、LED閃爍之按鈕控制

        作者: 時間:2017-02-03 來源:網絡 收藏

          現在試試用按鈕控制LED燈……讓LED在一個按鈕按下時亮起;彈起時滅掉。

        本文引用地址:http://www.104case.com/article/201702/343463.htm

          主要目的是學習GPIO的輸入及中斷。

          一、 電路

            

        clip_image002

         

          圖中的J39-n是幾個跳線插座,位置在開發板LCD附近,往下進行前要先確保跳線是接通的。

          可以看到,當按鈕按下時,引腳接地。即若引腳接個上拉電阻,則在按鈕彈起狀態下,引腳處于高電平狀態;而在按鈕按下時,則處于低電平狀態。

          這次使用的按鈕是BP3,即PA20引腳;LED為藍色LED,即PA0。

          二、 最簡單的辦法

          在開發版重置時,所有的引腳就默認接了上拉電阻。

          所以,直接使用一根杜邦線將PA20和PA0短接,就可以用BP3控制藍色LED了。

          三、 稍微有技術含量的思路

          假設,身邊不存在杜邦線……

          那么很直接的思路就是根據按鈕引腳的電平,來控制LED燈引腳的電平。可以選擇通過不斷查詢來獲取按鈕引腳的電平狀態,但我們現在使用更高級的武器:中斷。

          我們讓按鈕引腳在電平變換時產生一個中斷,然后在中斷服務函數中控制LED引腳電平。

          四、 LED引腳的配置

          這個配置已經做過多次了……

          五、 輸入引腳的配置

          1. 啟用PIO控制器的時鐘。啟用中斷、獲取引腳電平需要開啟相應PIO控制器的時鐘。

          1PMC->PMC_PCER0 = (1 << ID_PIOA);

          2. 引腳配置為僅做輸入用途

          #define BUTTON_PIO PIO_PA20

          /* 使用PIO控制器控制引腳 */

          PIOA->PIO_PER = BUTTON_PIO;

          /* 禁用引腳輸出,即按鈕引腳僅做為輸入引腳 */

          PIOA->PIO_ODR = BUTTON_PIO;

          3. 啟用上拉電阻。默認情況下無需做此設置。但配置時需要注意,在啟用上拉電阻前需要禁用下拉電阻。

          /* 啟用上拉電阻(不過重置時就是默認啟用的) */

          PIOA->PIO_PPDDR = BUTTON_PIO;

          PIOA->PIO_PUER = BUTTON_PIO;

          4. 啟用中斷。

          /* 啟用中斷 */

          PIOA->PIO_IER = BUTTON_PIO;

          /* 不使用額外中斷控制模式 */

          PIOA->PIO_AIMDR = BUTTON_PIO;

          /* NVIC中啟用中斷 */

          NVIC_ClearPendingIRQ(PIOA_IRQn);

          NVIC_SetPriority(PIOA_IRQn, 0);

          NVIC_EnableIRQ(PIOA_IRQn);

          這樣,該引腳就會在輸入電平的上升沿及下降沿,即按鈕彈起及按下時,產生中斷了。

          六、 錯誤的的中斷配置

          GPIO可以選擇一些額外的中斷控制模式:上升沿觸發,下降沿觸發,低電平觸發,高電平觸發。為使引腳在檢測到上升沿或下降沿時均觸發中斷,做了以下配置:

          /* 注:這是錯誤的做法 */

          /* 啟用額外中斷控制模式 */

          PIOA->PIO_AIMER = BUTTON_PIO;

          /* 選擇邊沿觸發 */

          PIOA->PIO_ESR = BUTTON_PIO;

          /* 上升和下降沿 */

          PIOA->PIO_REHLSR = BUTTON_PIO;

          PIOA->PIO_FELLSR = BUTTON_PIO;

          這樣做的后果是,只會在下降沿觸發中斷。原因是,上面提到的幾種中斷模式中,只能使用一種——即最后的語句配置的“下降沿/低電平”觸發中斷。

            

        clip_image004

         

          而在不啟用額外中斷控制時,則會在兩種邊沿都會觸發中斷。

          七、 中斷服務函數

          有這樣幾個寄存器:

          PIO_ELSR——用來表示觸發中斷的是電平還是邊沿

          PIO_FRLHSR——用來表示觸發中斷的是下降沿或低電平,還是上升沿或高電平

          很遺憾,在不使用額外中斷控制模式下,這些寄存器都是無效果的。

          但可以通過讀取PIO_PDSR寄存器來直接確定引腳的電平。需要注意,使用這個寄存器時,需要先開啟PIO控制器的時鐘。

          代碼邏輯比較簡單:

          #define LED_PIO PIO_PA0

          void PIOA_Handler()

          {

          /* 獲取中斷的狀態,同時拉低中斷 */

          uint32_t status = PIOA->PIO_ISR;

          /* 先確定是否是由按鈕引腳觸發的中斷 */

          if ((status & BUTTON_PIO) != 0)

          {

          if (PIOA->PIO_PDSR & BUTTON_PIO)

          {

          /* 高電平,按鈕彈起 */

          PIOA->PIO_SODR = LED_PIO;

          }

          else

          {

          /* 低電平,按鈕按下 */

          PIOA->PIO_CODR = LED_PIO;

          }

          }

          }



        關鍵詞: SAM4E

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 陆河县| 沧州市| 民权县| 安溪县| 永仁县| 聂荣县| 汝南县| 赤城县| 庆云县| 大新县| 平塘县| 佛坪县| 沙湾县| 泰顺县| 庆云县| 峨眉山市| 隆子县| 夹江县| 蒲城县| 临洮县| 麻江县| 阜康市| 禹州市| 乌审旗| 武定县| 上饶县| 蚌埠市| 陵川县| 绵阳市| 辽宁省| 綦江县| 伊金霍洛旗| 鄂伦春自治旗| 六盘水市| 武强县| 固阳县| 分宜县| 申扎县| 葵青区| 留坝县| 天全县|