ZigBee学习Z-stack外部中断

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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个事件

相关文档
最新文档