STM32W108無線射頻模塊外部中斷接口應用實例

STM32W108無線射頻模塊外部中斷接口應用實例

 

編寫中斷服務程序,響應外部中斷,實現通過按鍵觸發中斷,然後通過LED顯示相應的狀態。

1 STM32W108開發環境與硬件說明

硬件:STM32W108 Zigbee開發板、5V 1A電源、J-LINK燒寫器、PC機等。

軟件:IAR Embedded Workbench開發軟件。

爲開發板中的按鍵連接原理圖,按鍵與STM32W108無線模塊連接的原理圖。

按鍵連接圖

2 軟件設計與規劃

測試程序的流程圖如下所示,節點首先初始化硬件,然後註冊中斷,隨後循環檢測中斷是否發生。在中斷處理函數中點亮LED1,當外部檢測到中斷髮生時,延遲1000ms,然後關閉LED1,流程如圖7.11所示

 

3 中斷處理程序設計

編寫solar-system.c 中驅動程序如下:

/**************************************************************************

功能描述:中斷處理程序,將標誌位置位

輸入參數:無

輸出參數:無

*************************************************************************/

void  halIrqCIsr()

{   

    INT_MISS = INT_MISSIRQC; //清除中斷miss

    INT_GPIOFLAG=INT_IRQCFLAG;//重置INT_GPIOFLAG寄存器的INT_IRQCFLAG  

    preesed1 = TRUE; //將按鍵按下標誌位設置爲true

    halSetLed(LED_D1); //點亮LED_D1

}

4 測試程序編寫

編寫測試程序源文件solar-system.c

/*****************************************************************

文件名:solar-system.c

硬件描述:S2->PC0LED1->PA3

主要函數描述:main()函數實現LED1燈的關閉,當S2按鍵被按下及鬆開時,都會觸發中斷,在中斷處理函數中點亮LED1燈,當main()函數中檢測到中斷髮生時,關閉被點亮的LED1

*****************************************************************/

#include  PLATFORM_HEADER

#include  BOARD_HEADER

#include  <stdio.h>

#include  <stdlib.h>

#include  <string.h>

#include  "error.h"

#include  "hal/hal.h"

#include  "include/phy-library.h"

#include  "hal/micro/cortexm3/iap_bootloader.h"

#include  "hal/micro/led.h"

#include  "hal/micro/button.h"

 

boolean  preesed1 = FALSE; //全局變量,標示是否有按鍵被按下

 

/**************************************************************************

功能描述:完成通過中斷控制LED燈的閃爍

輸入參數:無

輸出參數:無

*************************************************************************/

int  main(void)

{

    halInit(); //初始化硬件電路

    uartInit(115200, 8, PARITY_NONE, 1); //配置UART串口

 

    //配置PA4PA5爲複用輸出功能,用於數據包的跟蹤

     halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT);

halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);

 

GPIO_IRQDSEL = PORTB_PIN(2); //IRQDPB2/SC1RXD連接

 

    //允許IRQD中斷

    GPIO_INTCFGD =  (3<<GPIO_INTMOD_BIT);

    INT_GPIOFLAG = INT_IRQDFLAG;

    INT_PENDCLR = INT_IRQD;

    INTERRUPTS_ON();

    halInitLed(); //初始化LED

    halGpioConfig(BUTTON_S2,GPIOCFG_IN_PUD);//配置BUTTON_S2

   

    GPIO_INTCFGC = 0;  //清零GPIO_INTCFGC寄存器

    INT_CFGCLR = INT_IRQC; // 清除IRQC中斷

    INT_GPIOFLAG = INT_IRQCFLAG; //清除IRQC的中斷標誌

    INT_MISS = INT_MISSIRQC;   //清除IRQC的中斷錯過標誌

    GPIO_IRQCSEL = BUTTON_S2; //IRQC引腳對應於BUTTON_S2引腳

    GPIO_INTCFGC  = (0 << GPIO_INTFILT_BIT); //不使用數字濾波

    GPIO_INTCFGC |= (3 <<  GPIO_INTMOD_BIT); //上升沿及下降沿觸發

    INT_CFGSET = INT_IRQC; //使能IRQC中斷

   

    while(TRUE)

    {       

         halCommonDelayMilliseconds(10); //延時10ms

        if (preesed1 == TRUE) //判斷按鍵是否有被按下,即判斷是否有中斷髮生

        {

            preesed1=FALSE;  //將標誌位設置爲false

            halCommonDelayMilliseconds(1000);  //延時1000ms

            halClearLed(LED_D1); //關閉LED1

        }    

    }

}

5 測試結果及分析

將程序燒入STM32W108 zigbee開發板,按下開發板上的按鍵S2,此時LED1會閃爍一次,然後保持關閉狀態。

 

中斷被設置爲上升沿和下降沿觸發,檢驗方法:首先按下按鍵,不鬆開,此時LED1會閃爍一次,然後鬆開按鍵,此時LED1會再次閃爍一次,說明上升沿和下降沿都觸發了中斷。

 

 

本文出自《STM32W108嵌入式無線傳感器網絡》邱鐵,夏鋒,周玉編著.清華大學出版社,20145

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章