打印
[应用相关]

STM32W108无线射频模块中断及按键测试应用实例解析

[复制链接]
1245|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fesxp|  楼主 | 2015-7-9 21:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32W108无线射频模块应用实例解析
编写中断服务程序,响应外部中断,实现通过按键触发中断,然后通过LED显示相应的状态。
1 开发环境与硬件说明
硬件:STM32W108 Zigbee开发板、5V 1A电源、J-LINK烧写器、PC机等。
软件:IAR Embedded Workbench For ARM开发软件。



2 软件设计与规划
测试程序的流程图如下所示,节点首先初始化硬件,然后注册中断,随后循环检测中断是否发生。在中断处理函数中点亮LED1,当外部检测到中断发生时,延迟1000ms,然后关闭LED1


中断处理程序设计
编写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
}
7.3.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
        }   
    }
}
7.3.5 测试结果及分析
将程序烧入STM32W108 zigbee开发板,按下开发板上的按键S2,此时LED1会闪烁一次,然后保持关闭状态。

中断被设置为上升沿和下降沿触发,检验方法:首先按下按键,不松开,此时LED1会闪烁一次,然后松开按键,此时LED1会再次闪烁一次,说明上升沿和下降沿都触发了中断。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

19

帖子

1

粉丝