hi 各位:
我使用cc2540从机demo,在demo用P2.0 (HAL_KEY_JOY_MOVE_PORT)做为按键key,使用中断方式触发。
现在我想讲P2.0换成P1.0,请问中断函数怎么写? 我大概试了一下如下几种都无法进入函数(中断函数卸载hal_key.c)?请问中断函数如何写?
1、HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
2、HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR)
请问有什么文档描述中断函数如何写的么?
qing chen1:
我认为,无法进入中断不是中断函数写的不对,是中断许可设置的不对,
Yan:
hi T_MAC,
这里随便举个例子, 具体你可以用这个当模板自己再去调试一下:
初始化的时候: /* 首先清中断, 相应的位, 如果你是P1.0 */ P1IFG &= ~BV(0); P1IF = 0; // 中断标志位置 0 P1SEL &= ~0x01; // 把P1.0 的功能设置为 GPIO P1DIR &= ~0x01; // 把P1.0 设为输入 P1IEN |= 0x01; // 把P1.0 的中断功能打开 PICTL |= 0x02; // 下降沿触发 IEN2 |= 0x10; // 使能Port 1 的中断.
这样就当作初始化完成了.
至于中断处理函数, 也随便举个例子. 比如在hal_key.c 中, 如果你不想用原来的处理函数, 请注销.然后定义新的:
halKeyPort1Isr 这只是个函数名字, 无关紧要, 随便起.
HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR ){ // 随便写写, 具体请自己多加调试
HAL_ENTER_ISR();
P1IF = 0; // 先把标志位复位 // 判断是否是你需要的中断, 是否来自 P1.0 if ( P1IFG & BV(0) ) { // 如果是, 第一步做的就是先清掉 这个引脚的中断标志. P1IFG &= ~BV(0);
// 如果是, 做点什么……
// bla // bla // bla // … // … // …
// have fun here }
CLEAR_SLEEP_MODE(); HAL_EXIT_ISR();
}
最后,注意:
如果你用到timer 1 或者 timer 4, 注意不要和P1.0 冲突. timer1 channel 2 或者 timer 4 channel 0 会有可能在P1.0 上.
T_MAC:
回复 Yan:
hi every baby:
忘记设置IEN2 so无法触发中断
aligado各位
YAPENG YANG:
回复 Yan:
你好 Yan,我想知道IO口能不能设置成电平触发中断?如何设置?
YAPENG YANG:
回复 Yan:
你好 Yan,我想知道IO口能不能设置成电平触发中断?如何设置?
Genway Xu:
回复 Yan:
Hi Yan,
我在设计中遇到一个问题,感觉和你说的冲突有关,能帮忙解释一下吗?Thanks a lot!
现象:
我单用Timer4做PWM p1.1输出,功能正常; 我单用P1.5作为按键中断入口,功能也正常, 可当我把两个功能结合在一起,希望能通过按键中断改变PWM的占空比时,却发现P1.1口没有我期望的输出,而且按键中断也不响应了。
Fuchong Wang:
回复 Yan:
请问Yan一个小疑惑
关于按键抖动,在BLE协议栈中的一些例程中,虽然在中断服务程序中使用了HAL_ENTER_ISR();关中断,但是没有关闭相应的IO口中断使能,那么在中断服务程序结束HAL_ENTER_ISR();开中断后,在debounce时间到来之前(例程中中断服务程序中发出了一个25ms的定时事件再检测按键),如果按键抖动又触发了中断那是一种什么情况?
中断服务程序执行时间超过了10ms(好像一般认为的按键抖动时间区间是这个值吧?)?
还是OSAL系统机制已经暗含有避免的机制?
Fuchong Wang:
回复 Fuchong Wang:
写错了
那么在中断服务程序结束HAL_EXIT_ISR();开中断后,在debounce时间到来之前
Fuchong Wang:
回复 Fuchong Wang:
官方的代码好像没有问题
即使多次中断,也只是重新更新一下debounce时间
昨天想着SensorTag的传感器使用使能通知功能开打传感器收到通知关闭传感器之后会收到两个特征值复位值(零),绝知还是忍不住烦,查找更改这个问题时想到了这个帖子,来更正一下,以免误导。