TI中文支持网
TI专业的中文技术问题搜集分享网站

基于Z-STACK的键中断

搜了一圈好像没有这个问题,如果之前有人问的话请发个链接,谢谢。

想做一个基于外部中断的按键处理函数,我的硬件图

然后我就把键初始化和键中断服务函数加进去,

void InitKey(void)

{
P0IEN |= 0x20; // P0_5 设置为中断方式 1:中断使能
PICTL |= 0x10; //下降沿触发 IEN1 |= 0x20; //允许P0口中断; P0IFG = 0x00; //初始化中断标志位
EA = 1; //打开总中断
}

#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 

    DelayMS(10); //延时去抖
    led2 = ~led2; //改变LED1状态
    P0IFG = 0; //清中断标志 
    P0IF = 0; //清中断标志 
}

这两个函数放在我自己新建的工程当中,是可以正常工作的,但是,等我放到Z-STACK里面,

编译,出现错误

Erro[Pa045]:function "P0_ISR" has no prototype 

问题:1,Z-stack里面是否有相应的中断服务函数,可直接调用,省去上述麻烦?

         2,如何自行添加如上的中断服务函数?

再次感谢各位了!!

VV:

在z-stack中的中断函数方式是:

#define HAL_ISR_FUNCTION(f,v) 在Hal_mcu.h文件中定于了。

你直接调用就可以,但是注意z-stack中P0口的中断函数,已经有定义了

HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )

ling li:

回复 VV:

比方说我用定时器中断,先需要定义:

#define SEND_DATA_EVENT 0x01  //定时事件ID

然后,osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//设置事件

再然后只要判断 if( events & SEND_DATA_EVENT)就行,当定时中断发生时,括号里的表达式就为真。

上述为定时器中断大概的用法,我想问问,这个键中断是否有着跟定时器差不多的用法??

VV:

回复 ling li:

你好,

不太理解按键中断 是I/O口中断,跟定时器有什么关系?你说的是定时器中断?还是定时器定时查询?

中断响应速度会更快,而且不需要额外的资源消耗,如果是定时器的话需要定时器一直开在那边,按键时不一定马上能响应。

ling li:

回复 VV:

回复时间22:27???ti的猛士。

简而言之,怎么用外部中断?初始化函数需不需要?中断服务函数是哪个?

直接在这个函数  HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) 里面写中断服务程序吗?

VV:

回复 ling li:

初始化当然需要啊 你总得配置那个IO口,什么中断方式。

如果是PO口的话,可以用这个函数。

Susan Yang:

回复 ling li:

对P0口的寄存器进行配置之后,然后在 HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) 里面写中断服务程序就可以了

ling li:

回复 Susan Yang:

z-stack-2.3.0-1.4.0版本,基于GenericApp例程修改

按照两位所说,初始化IO口

void InitKey(void)

{P0IEN |= 0x20; // P0_5 设置为中断方式 1:中断使能PICTL |= 0x10; //下降沿触发 IEN1 |= 0x20; //允许P0口中断; P0IFG = 0x00; //初始化中断标志位EA = 1; //打开总中断}

然后添加 HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) { }

编译出现  Error[Pe020]: identifier "POINT_VECTOR" is undefined

在hal_mcu.h找到

#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void)#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void)#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)

不知道两位看明白没?谢谢

Susan Yang:

回复 ling li:

是不是书写错误?  POINT_VECTOR 应该是 P0INT_VECTOR吧?是0不是O

ling li:

回复 Susan Yang:

汗,IAR里面大写字母O和数字0,小写字母l和数字1,傻傻分不清楚。

但是麻烦又来了,出现

Error[e27]: Entry "halKeyPort0Isr" in module Enddevice

我明明已经在Enddevice的状态下了,看图。谢谢

Susan Yang:

回复 ling li:

错误显示halKeyPort0Isr被重复定义了。你是不是自己定义了halKeyPort0Isr?hal_key.c里面已经定义了halKeyPort0Isr、

HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) ,你在里面修改中断服务程序就好了。

或者你也可以屏蔽hal_key.c里面的HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ),然后自己重新编写HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )及服务程序。

赞(0)
未经允许不得转载:TI中文支持网 » 基于Z-STACK的键中断
分享到: 更多 (0)