ZigBee学习Z-stack外部中断
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ZigBee学习Z-stack外部中断
硬件抽象层:就是对硬件层做好了各种初始化,用户不用考虑硬件的初始配置,直接使用即可。
hal_driver.c文件:
HalDriverInit():用户可在此函数中添加硬件的初始化操作,如定时器、ADC、DMA、FLASH、AES、LCD、LED、UART、KEY、SPI、HID等(还有用于配置外部中断,类似按键的中断方式查询键值)
Hal_ProcessEvent():
处理HAL发生的事件、如:KEY、LED、电源管理等,用户可以在此添加处理自己的HAL事件,此事件ID必须是唯一的,定义在hal_driver.h中。如:HAL_KEY_EVENT(按键轮询与抖动)、HAL_LED_BLINK_EVENT(LED闪烁)、HAL_SLEEP_TIMER_EVENT(Power saving).
Hal_ProcessPoll():
被osal_start_system()调用,用于HAL_Timer和HAL_UART的事件轮询,关于系统编译连接,只要没有定义相关的宏定义,相应的驱动就不会编译进去,减少代码占用的空间。有以下的宏定义:
具体操作是:
Options->C/C++
Options->Preprocessor->Defined Symbols->enter:HAL_XXX=TRUE;
when XXX is ADC,UART,LED,LCD,KEY
不编译进代码,只要将其定义成FALSE
如何定做适合自己的HAL处理的程序
①修改原文件的方式:
1、HAL\include下的头文件应该保留一样。
2、在HAL\Target\hal_xxx.c修改相应的驱动函数,hal_adc.c, hal_key.c, hal_lcd.c, hal_led.c, hal_timer.c, and hal_uart.c
3、硬件驱动配置可以被修改在hal_board_cfg.h
②增加用户自己的目标驱动
1、增加新的头文件,在hal\include
2、在hal\Target\hal_xxx.c添加自己运行函数,xxx为自己的目标
3、如果GPIO有冲突或者没用到,应该保证驱动不被编译,否则后果严重。
4、检查GPIO有没有正确设置或冲突,通过hal_board_cfg.h
5、不想被编译,或者是老的文件,没用到的文件,可以通过选择options->"Exclude form build"
外部中断程序中断处理函数的定义:可以查看
hal\Target\hal_XXX.c\hal_mcu.h
HAL_ISR_FUNCTION(f,v)
HAL_ISR_FUNCTION (prototype, vector)
{
/* Do something when this interrupt happens!!! */
}
prototype是中断名称,vector是中断向量
①如何修改存在GPIO外部中断处理函数?
Example: Modify P1INT_VECTOR interrupt service routine in a CC2430 project. P1INT_VECTOR interrupt service routine is declared in hal_key.c.
HAL_ISR_FUNCTION (halKeyPort1Isr, P1INT_VECTOR)
{
halProcessKeyInterrupt ();//中断处理函数
}
增加新的中断处理函数
首先新建头文件,定义中断向量和定义要用到的GPIO地址,
(包函ioCC2530.h 即可)
ex:创建定时器1中断处理程序(T1_VECTOR)(中断向量定义在ioCC2530.h 中)主要就是,知道中断向量表的宏定义,然后使用HAL_ISR_FUNCTION(prototype, vector)建立处理函数。
现在就外部中断例子做以下笔记
新建一个hal_xxx.c文件和hal_xxx.h文件,此hal_xxx.h文件要在hal_driver.c 中包含,主要是使用hal_xxx.c定义外部中断初始化函数,而使用此初始化函数是在HalDriverInit中,在结尾中调用即可,就可以启动外部中断了,如以下
voidLightAdjInit( void )
{
/* Initialize previous key to 0 */
P1SEL&=~(1<<2);//设置P1_2为一般IO口功能
P1DIR&=~(1<<2);//设置P1_2为输入功能
P2INP&=~(1<<2);//设置为上拉
P1IEN|=(1<<2);//P1_2中断使能
PICTL&=~(1<<1);//上升沿引起中断
EA=1;//开启总中断
IEN2|=(1<<4);//端口1中断使能
P1IFG=0;//初始化中断标志位
}设置P1_2外部中断,此函数在hal_xxx.c文件中编写,
在hal_xxx.c中包含相应头文件,编写处理中断的函数和中断函数LightInterrupt(),HAL_ISR_FUNCTION( light_adj, P1INT_VECTOR )
light_adj是中断相应函数名,随便起,P1INT_VECTOR是中断向量,参考ioCC2530.h 在LightInterrupt中想产生相应事件,应该要定义相应的宏,在hal_drivers.h中定义,注意事件的定义规则,只能以0x0001/0x0002/0x0004/0x0008这样不同的位置定义,因此对于每个任务只能定义16个事件