TI CC2541的狗日的Key
被突如其来的一个bug困扰了好几天, 起因是, 按键接的红外接收器, 结果发现, 一旦按下之后, IEN1, P0IE的标识位bit5, 被不知道特么的谁归0了, 也就是说, 按键只能被按下一次, 再按就不进中断了.
后来研究了甜总的自定义按键.
http://blog.csdn.net/feilusia/article/details/50535963
发现按键根本不进中断.
接着, 又参考另一个文章:
http://www.cnblogs.com/chenzhao207/articles/4483189.html
不用协议栈, 直接做成一个文件, debug成功.
然后我才想起, 带协议编译的时候IAR有一句警告, 我没有注意, 就是说我后来定义的key中断跟hal_key文件里面定义的中断处理重复了.
于是, 我把编译的参数HAL_KEY=FALSE, 还把board_init时候的key_config给干掉, 终于成功的在协议栈里面进了中断.
今天早上看了代码我才明白, 原来key的响应在OnBoard.c文件里面, 直接就是这个:
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
而在hal_key.c里面:
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
HAL_ENTER_ISR();
if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
{
halProcessKeyInterrupt();
}
/*
Clear the CPU interrupt flag for Port_0
PxIFG has to be cleared before PxIF
*/
HAL_KEY_SW_6_PXIFG = 0;
HAL_KEY_CPU_PORT_0_IF = 0;
CLEAR_SLEEP_MODE();
HAL_EXIT_ISR();
return;
}
上面这一段就是中断声明, 怎么知道的呢, 天杀的IAR没法进行全局的搜索, 还是用SI找到的:
(原来IAR的全局搜索要Ctrl+Alt+F的).
Hal_mcu.h 里面
#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)
原来HAL_ISR_FUNCTION(f,v) 就是 HAL_ISR_FUNC_PROTOTYPE(f,v);跟HAL_ISR_FUNC_DECLARATION(f,v)
而 HAL_ISR_FUNC_PROTOTYPE(f,v) 又是 _PRAGMA(vector=v) __near_func __interrupt void f(void)
所以 HAL_ISR_FUNCTION 就是中断处理的函数啊...
会跟
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void){
}
起冲突的.
接下来要做的步骤:
1. 把系统的Key都干掉, 研究一下OnBoard.c里面的HalKeyConfig都有啥.
2. 如果没啥了, 就使用自己写的key的中断.
3. 检查中断响应的函数, EA=0肯定是不对的, 停掉P0IEN对应的bit位比较合理.
4. 测试红外的效果.
TI CC2541的狗日的Key的更多相关文章
- 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...
- IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.
IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. Segm ...
- TI CC2541 BLE协议栈蓝牙MAC 地址
在Flash中有一块只读区域,从地址0x780E开始,蓝牙的MAC以小端方式存放在里面. 在TI的Peripheral例程里面,添加一个特征值,只读属性,6字节长度(蓝牙MAC长度为48-bit,6字 ...
- TI CC2541的红外控制
整整一个礼拜, 整了...大约40个小时吧, 最少.. 下面是结果, 只能做一个delay延时.: unsigned char Time;unsigned char IrValue[6];#pragm ...
- TI CC2541的中断优先级设置.
实际看到的中断优先级设置是这样的:
- TI CC2541的引脚中断.
- TI CC2541的整体目标
1. App端会发送一定数量的byte过来蓝牙, 每2个byte是一个汉字的编码. 2. 拿到汉字编码之后, 统计字符数量, 然后通过SPI, 搜索编码 3. 收到的编码, 每个汉字字符有32个byt ...
- TI CC2541的GPIO引脚设置.
P1SEL寄存器, 0xF4, 功能选择用的, 0表示GPIO口, 1表示外设.
- TI CC2541的LED控制
现在终于进入到蓝牙SPI的环节了, 下面还要研究I2C, 所以第一步, 先点灯, 就是GPIO控制吧. 参考一下LEd的初始化: void HalLedInit (void){#if (HAL_LED ...
随机推荐
- iOS Block浅析
Block 的使用有两种:1.独立Block .2.内联Block . <一>独立Block 使用方式 一.定义一个Block Object,并调用. 1.定义 // 定义 ...
- Android设计模式源码解析之Builder模式
https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...
- iOS UITableView点击按钮滚到顶部
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...
- docker summary
http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html 总结的很好 ----------------------------- ...
- linux: centos设置ip以及连接外网
注明:我使用的的使centos 7,所有文件名是ifcfg-enp0s3, 一. 设置虚拟机中linux的ip,使本地能连通虚拟机的linux系统 1>.进入本地windows的cmd,输入ip ...
- IntelliJ IDEA 下的版本控制介绍
不管是个人开发或是团队开发,版本控制都是可以很好地被使用的,目前我找不到任何开发者不使用版本控制的理由.而且对于 IDE 来讲,集成版本控制的本身就是它最大的亮点之一,很多开发者也是为此而使用它. 在 ...
- Tomcat 部署:工程下 META-INF 目录下的 Context.xml
tomcat 在META-INF 文件夹中添加context.xml,使项目自动应用更新文件 Meta-inf文件夹下新建context.xml. <Context path="/FU ...
- C++Primer 第四章
//1.当我们对运算符进行重载的时候,其包括运算对象的类型和返回值的类型都是由该运算符定义的,但是运算对象的个数和优先级,结合律都是不能改变的 //2.当一个对象被用作右值的时候,用的是对象的值(内容 ...
- PostgreSQL rule view materialized view examples
warehouse_db=# create table tab_view(emp_id int not null,emp_name varchar(10),emp_city varchar(10)); ...
- JS和JQUERY的区别
①.根据ID取元素 { JS:取到的是一个DOM对象. 例:var div = document.getElementByID("one"); JQUERY:取到的是一个JQUER ...