搜了一圈好像没有这个问题,如果之前有人问的话请发个链接,谢谢。
想做一个基于外部中断的按键处理函数,我的硬件图
然后我就把键初始化和键中断服务函数加进去,
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 )及服务程序。