首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

ZigBee学习Z-stack外部中断

2023-08-09 来源:华拓网
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个事件

事件的处理要看相应的任务,一般在Hal_ProcessEvent()函数中编写处理如: if(events & HAL_LIGHT_EVENT) {

LED2_SBIT=~LED2_SBIT;

return events ^ HAL_LIGHT_EVENT; }

在外部中断处理函数中产生事件,可以使用osal_start_timerEx (Hal_TaskID, HAL_LIGHT_EVENT, 10);也可以使用osal_set_event(Hal_TaskID,UART_RX_CB_EVT);等让相应的任务处理事件。

因篇幅问题不能全部显示,请点此查看更多更全内容