您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > ZigBee学习Z-stack外部中断
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(Powersaving).Hal_ProcessPoll():被osal_start_system()调用,用于HAL_Timer和HAL_UART的事件轮询,关于系统编译连接,只要没有定义相关的宏定义,相应的驱动就不会编译进去,减少代码占用的空间。有以下的宏定义:具体操作是:Options-C/C++Options-Preprocessor-DefinedSymbols-enter:HAL_XXX=TRUE;whenXXXisADC,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,andhal_uart.c3、硬件驱动配置可以被修改在hal_board_cfg.h②增加用户自己的目标驱动1、增加新的头文件,在hal\include2、在hal\Target\hal_xxx.c添加自己运行函数,xxx为自己的目标3、如果GPIO有冲突或者没用到,应该保证驱动不被编译,否则后果严重。4、检查GPIO有没有正确设置或冲突,通过hal_board_cfg.h5、不想被编译,或者是老的文件,没用到的文件,可以通过选择options-Excludeformbuild外部中断程序中断处理函数的定义:可以查看hal\Target\hal_XXX.c\hal_mcu.hHAL_ISR_FUNCTION(f,v)HAL_ISR_FUNCTION(prototype,vector){/*Dosomethingwhenthisinterrupthappens!!!*/}prototype是中断名称,vector是中断向量①如何修改存在GPIO外部中断处理函数?Example:ModifyP1INT_VECTORinterruptserviceroutineinaCC2430project.P1INT_VECTORinterruptserviceroutineisdeclaredinhal_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){/*Initializepreviouskeyto0*/P1SEL&=~(12);//设置P1_2为一般IO口功能P1DIR&=~(12);//设置P1_2为输入功能P2INP&=~(12);//设置为上拉P1IEN|=(12);//P1_2中断使能PICTL&=~(11);//上升沿引起中断EA=1;//开启总中断IEN2|=(14);//端口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;returnevents^HAL_LIGHT_EVENT;}在外部中断处理函数中产生事件,可以使用osal_start_timerEx(Hal_TaskID,HAL_LIGHT_EVENT,10);也可以使用osal_set_event(Hal_TaskID,UART_RX_CB_EVT);等让相应的任务处理事件。
本文标题:ZigBee学习Z-stack外部中断
链接地址:https://www.777doc.com/doc-2829766 .html