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->PC0,LED1->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串口
//配置PA4和PA5爲複用輸出功能,用於數據包的跟蹤 halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT); halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);
GPIO_IRQDSEL = PORTB_PIN(2); //將IRQD與PB2/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嵌入式無線傳感器網絡》邱鐵,夏鋒,周玉編著.清華大學出版社,2014年5月