精华内容
下载资源
问答
  • zigbee协议栈 中断服务函数定义方法

    千次阅读 2017-07-20 20:25:26
    zigbee协议栈 中断服务函数定义方法 我们先看协议栈中 hal_uart.c 文件中的串口操作中断服务程序: HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR ) //uart0 接收 HAL_ISR_FUNCTION( halUart1R

    感谢原作者,但是我找不到原作者的帖子,我看到的也是转载帖但是没看到原作者。


    zigbee协议栈 中断服务函数定义方法

    我们先看协议栈中 hal_uart.c 文件中的串口操作中断服务程序:

    HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )      //uart0  接收

    HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR )      //uart1  接收

    HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )      //uart0  发送

    HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )      //uart1  发送

    这四个是 uart0 和uart1 的串口接收和发送中断服务程序,下面是协议栈定义中断服务程序的方法。我们看一下 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);

    从这两个#define 的定义可以了解到:

    HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )按照定义展开来就是:

    _PRAGMA(URX0_VECTOR) __near_func __interrupt void halUart0RxIsr(void);

    其中_PRAGMA 是编译器预定义的声明中断服务程序的一个方法,URX0_VECTOR 是中断编号(在

    ioCC2530.h文件中定义)。halUart1TxIsr就是f所指的函数,也就是我们的中断服务函数。


    常规中断服务函数定义:

    #pragma vector = T3_VECTOR      //定时器 T3

    __interrupt void T3_ISR(void) 

    协议栈中的定义:

    _PRAGMA(URX0_VECTOR) __near_func __interrupt void halUart0RxIsr(void); 

    注解:

    _PRAGMA(URX0_VECTOR)            //定义中断向量

    __near_func                                 //IAR的特殊字

    __interrupt                                   //中断函数标志

    void  halUart0RxIsr(void);            //halUart0RxIsr  函数名


    补充:


    #define HAL_ISR_FUNC_DECLARATION(f,v)   \

        _PRAGMA(vector=v) __near_func __interrupt void f(void)


    #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)


    还有这样的定义,第一个是函数声明,第二个是函数原型,第三个是函数定义,这三个不能少一个。

    展开全文
  • CC2530/Zigbee协议栈配置外部中断一、I/O端口二、配置寄存器三、中断处理函数 一、I/O端口 1、在CC2530芯片中,其I/O口用作通用 I/O 时,引脚可以组成 3 个 8 位端口,端口 0、端口 1 和端口 2,表示为 P0、P1 和 P2...

    CC2530/Zigbee协议栈配置外部中断

    一、I/O端口

    1、在CC2530芯片中,其I/O口用作通用 I/O 时,引脚可以组成 3 个 8 位端口,端口 0、端口 1 和端口 2,表示为 P0、P1 和 P2。其中,P0和 P1 是完全的 8 位端口,而 P2 仅有 5 位可用。所有的端口均可以通过 SFR 寄存器 P0、P1 和 P2 位寻址和字节寻址。每个端口引脚都可以单独设置为通用 I/O 或外部设备 I/O。
    2、用作输入时,通用 I/O 端口引脚可以设置为上拉、下拉或三态操作模式。作为缺省的情况,复位之后,所有的端口均设置为带上拉的输入
    3、通用 I/O 引脚设置为输入后,均可用于产生外部中断。中断可以设置在外部信号的上升或下降沿触发,P0、P1或 P2 端口都有中断使能位。

    二、配置寄存器

    👆上面提到,I/O口默认状态为上拉输入,而通用 I/O 引脚设置为输入后,均可用于产生外部中断。所以我们只需要配置中断相关的寄存器即可。
    👇下面将以P0_5为例讲解寄存器的配置
    ①配置上拉输入(默认状态)

      P0SEL &= ~0x20;//普通io模式
      P0DIR &= ~0x20;//输入模式
      P0INP &= ~0x20;//上下拉输入
      P2INP &= ~0x20;//bit5 p0端口全部上拉
    

    ②配置中断寄存器

      IEN1  |=  0x20;       //P0IE(Bit5) 允许P0口中断; 
      P0IEN |=  0x20;       //P0_5 设置为中断方式 1:中断使能 
      PICTL |=  0x01;       //P0_5下降沿触发  
      P0IFG  =  0;
      EA 	 =  1; //打开总中断 
    

    cc2530外部中断只需要配置IEN1、P0IEN、PICTL、P0IFG 这4个寄存器

    • P0IE(Bit5) 允许P0口中断
      在这里插入图片描述
    • P0_5 设置为中断方式 1:中断使能 在这里插入图片描述
    • P0_5下降沿触发
      在这里插入图片描述
    • 端口0的中断状态标志位,0:无中断,1:产生中断
      在这里插入图片描述
    • EA = 1; //打开总中断

    至此中断配置完成🆗

    三、中断处理函数

    在zigbee协议栈中,有规定了中断处理函数的规范,建议按照其规范来定义中断处理函数
    在hal_mcu.h文件中,有如下定义👇

    #define HAL_ISR_FUNC_DECLARATION(f,v)   _PRAGMA(vector=v) __near_func __interrupt void f(void)
    #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)
    

    我们写中断处理函数时,应该按照如下格式👇

    //P0_ISR:函数名,P0INT_VECTOR:中断向量
    HAL_ISR_FUNCTION( P0_ISR, P0INT_VECTOR )
    {
    ...
    ...
    ...
    }
    

    其实函数头HAL_ISR_FUNCTION是一个宏定义

    #define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)
    

    它展开后又是2个宏定义HAL_ISR_FUNC_PROTOTYPE和HAL_ISR_FUNC_DECLARATION(🈲禁止套娃hhhh~)

    这里的两部分代码“HAL_ISR_FUNC_PROTOTYPE”和“HAL_ISR_FUNC_DECLARATION”,第一部分代码为函数声明,第二部分代码为函数原型。这两部分的代码展开皆为

    _PRAGMA(vector=v) __near_func __interrupt void f(void)
    

    现在我们将HAL_ISR_FUNCTION( P0_ISR, P0INT_VECTOR )部分完全展开可得下列程序:

    //函数声明
    _PRAGMA(vector=P0INT_VECTOR ) __near_func __interrupt void P0_ISR(void)
    //函数原型
    _PRAGMA(vector=P0INT_VECTOR ) __near_func __interrupt void P0_ISR(void)
    {
      /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
      P0IFG &= ~0x20;
      P0IF  &= ~0x20;  
      ...
      ...
      ...
    }
    

    附上中断向量表👇

    /* ------------------------------------------------------------------------------------------------
     *                                        Interrupt Vectors
     * ------------------------------------------------------------------------------------------------
     */
    #define  RFERR_VECTOR   VECT(  0, 0x03 )   /*  RF TX FIFO Underflow and RX FIFO Overflow   */
    #define  ADC_VECTOR     VECT(  1, 0x0B )   /*  ADC End of Conversion                       */
    #define  URX0_VECTOR    VECT(  2, 0x13 )   /*  USART0 RX Complete                          */
    #define  URX1_VECTOR    VECT(  3, 0x1B )   /*  USART1 RX Complete                          */
    #define  ENC_VECTOR     VECT(  4, 0x23 )   /*  AES Encryption/Decryption Complete          */
    #define  ST_VECTOR      VECT(  5, 0x2B )   /*  Sleep Timer Compare                         */
    #define  P2INT_VECTOR   VECT(  6, 0x33 )   /*  Port 2 Inputs                               */
    #define  UTX0_VECTOR    VECT(  7, 0x3B )   /*  USART0 TX Complete                          */
    #define  DMA_VECTOR     VECT(  8, 0x43 )   /*  DMA Transfer Complete                       */
    #define  T1_VECTOR      VECT(  9, 0x4B )   /*  Timer 1 (16-bit) Capture/Compare/Overflow   */
    #define  T2_VECTOR      VECT( 10, 0x53 )   /*  Timer 2 (MAC Timer)                         */
    #define  T3_VECTOR      VECT( 11, 0x5B )   /*  Timer 3 (8-bit) Capture/Compare/Overflow    */
    #define  T4_VECTOR      VECT( 12, 0x63 )   /*  Timer 4 (8-bit) Capture/Compare/Overflow    */
    #define  P0INT_VECTOR   VECT( 13, 0x6B )   /*  Port 0 Inputs                               */
    #define  UTX1_VECTOR    VECT( 14, 0x73 )   /*  USART1 TX Complete                          */
    #define  P1INT_VECTOR   VECT( 15, 0x7B )   /*  Port 1 Inputs                               */
    #define  RF_VECTOR      VECT( 16, 0x83 )   /*  RF General Interrupts                       */
    #define  WDT_VECTOR     VECT( 17, 0x8B )   /*  Watchdog Overflow in Timer Mode             */
    

    注意
    按照上面说的步骤配置完后,可以进行测试。我在一开始测试时,发现无法进入中断处理函数,解决方法👇
    在这里插入图片描述
    P0_5也是同样原因,在我把HAL_KEY定义为FALSE后,就可以正常进入中断了~

    展开全文
  • Zigbee协议栈学习实例

    千次阅读 2016-12-22 20:58:14
    之前Zstack协议栈的工作原理已经讲过了,这次来一发应用举例的帮助大家理解,实验内容很简单,就是按键控制LED小灯闪烁,用的是CC2530的电路板,如果是裸机控制,过程相当简单,只要查询是否有按键按下,然后执行...

    之前Zstack协议栈的工作原理已经讲过了,这次来一发应用举例的帮助大家理解,实验内容很简单,就是按键控制LED小灯闪烁,用的是CC2530的电路板,如果是裸机控制,过程相当简单,只要查询是否有按键按下,然后执行小灯闪烁的操作就可以了,或者用中断也可以。但是如果放到了协议栈当中,过程会复杂些,也就是之前所说的工作原理。

    在添加自己的函数或者命令行之前,我们要做的最最重要的事情就是宏定义,比如按键的端口,小灯的端口,用的板子的型号等等。诸如此类的宏定义在嵌入式开发中是家常便饭思密达,因为本人使用的板子是宅基地购买的,所以宏定义大多都是HoneyGeek_V2之类的。在修改代码之前,先要有个大概的思路,那些文件里的代码是要做修改的,比如这次是用到按键和小灯,那么hal_key.c和hal_key.h,hal_board_cfg.h等一些和按键、小灯有关的.c和.h文件都要看一下。我们先看hal_board_cfg.h文件,在LED Configuration下面看到#define HAL_NUM_LEDS这句定义,很明显要改,我用的HoneyGeek_V2的板子只有一个LED所以在后面添加|| defined (HoneyGeek_V2)。

    if defined (FS2530)|| defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)

    #define HAL_NUM_LEDS 3

    elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590)|| defined (HoneyGeek_V2)

    #define HAL_NUM_LEDS 1

    else

    #error Unknown Board Indentifier

    endif

    再往下看,看到对LED1的定义,也就是LED1的PIN和PORT的一些设置,我们可以这样改:

    ifdef HoneyGeek_V2

    /* 1 - Green */
    #define LED1_BV BV(3)
    #define LED1_SBIT P0_3
    #define LED1_DDR P0DIR
    #define LED1_POLARITY ACTIVE_HIGH

    elif defined (HAL_BOARD_CC2530EB_REV17)

    #define LED1_BV BV(0)
    #define LED1_SBIT P1_0
    #define LED1_DDR P1DIR
    #define LED1_POLARITY ACTIVE_HIGH

    endif

    再往下,看到一块Push Button Configuration的部分,显然是按键配置:

    ifdef HoneyGeek_V2

    #define PUSH1_BV BV(2)
    #define PUSH1_SBIT P1_2

    else

    /* S1 */
    #define PUSH1_BV BV(1)
    #define PUSH1_SBIT P0_1

    endif

    再往下看,找到Board Initialization我们也要修改:

    elif defined (HoneyGeek_V2)

    define HAL_BOARD_INIT()

    {
    ……

    HAL_TURN_OFF_LED1();
    LED1_DDR |= LED1_BV;

    /* configure tristates */
    P1INP |= PUSH1_BV;
    }

    这部分代码就是内部时钟的初始化,后面两行是小灯和按键的设置,要改成相应的端口数值。接下来看hal_key.c文件,对按键再配置一下:

    ifdef HoneyGeek_V2

    /* SW_6 is at P1.2 */

    define HAL_KEY_SW_6_PORT P1

    define HAL_KEY_SW_6_BIT BV(2)

    define HAL_KEY_SW_6_SEL P1SEL

    define HAL_KEY_SW_6_DIR P1DIR

    本例子中其他部分无需修改宏定义了。那么,完成前期的宏定义之后,就可以修改后面的命令行,来实现自己要的功能了。在osal_system_start(0函数里是没有任何与按键相关的信息的,这说明在之前的函数里就已经有相关的命令了。首先,看到HAL_BOARD_INIT()函数,GOTO一下发现是Board Initialization,上面已经说过了。然后,InitBoard( OB_COLD )函数点进去看发现HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback)这个配置函数,明显这个函数是按键配置函数,输入参数一个是知否中断的宏定义值,还有一个是按键回调函数,那么这个回调函数又能实现什么功能呢?来看一下这个函数:

    void OnBoard_KeyCallback ( uint8 keys, uint8 state )
    {
    uint8 shift;
    (void)state;

    shift = (keys & HAL_KEY_SW_6) ? true : false;

    if ( OnBoard_SendKeys( keys, !shift ) != ZSuccess )
    {
    // Process SW1 here
    if ( keys & HAL_KEY_SW_1 ) // Switch 1
    {
    }
    // Process SW2 here
    if ( keys & HAL_KEY_SW_2 ) // Switch 2
    {
    }
    // Process SW3 here
    if ( keys & HAL_KEY_SW_3 ) // Switch 3
    {
    }
    // Process SW4 here
    if ( keys & HAL_KEY_SW_4 ) // Switch 4
    {
    }
    // Process SW5 here
    if ( keys & HAL_KEY_SW_5 ) // Switch 5
    {
    }
    // Process SW6 here
    if ( keys & HAL_KEY_SW_6 ) // Switch 6
    {
    }
    }
    }

    关键是看if ( OnBoard_SendKeys( keys, !shift ) != ZSuccess )这句话,因为他又嵌套了一个函数OnBoard_SendKeys( keys, !shift ),那让我们看看它又是做什么的吧!

    uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
    {
    keyChange_t *msgPtr;

    if ( registeredKeysTaskID != NO_TASK_ID )
    {
    // Send the address to the task
    msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
    if ( msgPtr )
    {
    msgPtr->hdr.event = KEY_CHANGE;
    msgPtr->state = state;
    msgPtr->keys = keys;

      osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
    }
    return ( ZSuccess );
    

    }
    else
    return ( ZFailure );
    }

    这个函数内部关键就是osal_msg_send( registeredKeysTaskID, (uint8 )msgPtr ),这个函数就不展开了,先看registeredKeysTaskID,这个是注册的按键任务ID号,是多少呢?在应用层已经定义好了,RegisterForKeys( PuppyApp_TaskID )就是这个函数啦!把应用层的任务ID号给了按键的任务ID号,osal_msg_send( registeredKeysTaskID, (uint8 )msgPtr )中有个osal_set_event( destination_task, SYS_EVENT_MSG ),就是设置应用层的任务事件,然后轮询的过程中就会通知应用层有事件要处理了,应用层就调用PuppyApp_ProcessEvent( uint8 task_id, UINT16 events )函数,然后因为是KEY_CHANGE事件,所以执行PuppyApp_HandleKeys()函数,在这个函数里会判断是哪个按键触发的,我的实验用的是按键6,所以:

    if ( keys & HAL_KEY_SW_6 )
    {
    PuppyApp_SendTheMessage();
    HalLedBlink(HAL_LED_1,10,50,800);
    }

    这个命令就是让小灯闪烁10次。说到这里,大家有没有疑问呢?我按键的时候系统怎么知道我按了?嘿嘿,在这个函数HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback)中有个osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE)函数,就是再过一段时间后触发HAL_KEY_EVENT事件,这次的事件是给硬件层的,所以我们找到硬件层处理函数Hal_ProcessEvent( uint8 task_id, uint16 events ):

    if (events & HAL_KEY_EVENT)
    {

    if (defined HAL_KEY) && (HAL_KEY == TRUE)

    /* Check for keys */
    HalKeyPoll();
    
    /* if interrupt disabled, do next polling */
    if (!Hal_KeyIntEnable)
    {
      osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
    }
    

    endif // HAL_KEY

    return events ^ HAL_KEY_EVENT;
    

    }

    这里执行了HalKeyPoll()然后又是一次osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100),也就是说每隔100毫秒系统都会接收到一个HAL_KEY_EVENT要处理,反复的来检查是否有按键被按下,如果有按键被按下,就会去执行回调函数,然后按照上面的顺序来点亮小灯。整个过程就是这样啦!可能说的不太清楚,不过大家推敲一下肯定OK的啦!

    展开全文
  • 今天自己定义了一个P0口P0.7的外部中断,在裸机上调试没问题,但放入协议栈的时候没有任何动作,在调试的时候,我把hal_board_cfg.h中的按键key的预编译改为FAULSE不通过,结果,自己定义的外中断就可以用了。...

    今天自己定义了一个P0口P0.7的外部中断,在裸机上调试没问题,但放入协议栈的时候没有任何动作,在调试的时候,我把hal_board_cfg.h中的按键key的预编译改为FAULSE不通过,结果,自己定义的外中断就可以用了。那么问题肯定出在这了,经发现hal_key.c文件中存在

    HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )

    {

    ...

    }

    而我在自己的app文件中也定义了P0的中断

    HAL_ISR_FUNCTION( P0_IRQ, P0INT_VECTOR )

    {

    ...}

    这就冲突了。

     

     

    以下附网上转载的部分:

    硬件中断的定义在协议栈中的hal_mcu.h文件中:




    #ifdef __IAR_SYSTEMS_ICC__     //条件定义
    #include              //包含CC2430输入输出头文件
    #define HAL_COMPILER_IAR
         //定义IAR编译器宏
    #define HAL_MCU_LITTLE_ENDIAN()   __LITTLE_ENDIAN__    //定义MCU小端模式
    #define _PRAGMA(x) _Pragma(#x)     //定义预处理指令宏
    #define HAL_ISR_FUNC_DECLARATION(f,v)   _PRAGMA(vector=v) __near_func __interrupt void f(void)      //IAR中断函数声明
    定义格式宏
    #define HAL_ISR_FUNC_PROTOTYPE(f,v)     _PRAGMA(vector=v) __near_func __interrupt void f(void)
          //IAR中断函数原型定义格式
    #define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)      //IAR中断函数定义格式宏


    #elif defined __KEIL__
    #include
    #define HAL_COMPILER_KEIL
    #define HAL_MCU_LITTLE_ENDIAN()   0
    #define HAL_ISR_FUNC_DECLARATION(f,v)   void f(void) interrupt v
    #define HAL_ISR_FUNC_PROTOTYPE(f,v)     void f(void)
    #define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)



    #else
    #error "ERROR: Unknown compiler."
    #endif


    这里定义了在不同编译环境下的终端函数,我们可以看出ZigBee2006协议栈仅支持IAR和Keil两种编译环境,其他的编译器会当做未识别的编译器并报错("ERROR: Unknown compiler.")。我使用的是IAR编译环境,并对上面的代码进行注释。
    红色字体标出的部分就是我们定义中断函数的格式要求,这三个宏的意思表明了对中断函数定义的规则:首先,要在文件代码顶端进行函数声明(格式:_PRAGMA(vector=v) __near_func __interrupt void f(void););然后,在相应的C文件里定义中断函数原型(格式:_PRAGMA(vector=v) __near_func __interrupt void f(void){...})。其实和C语言中定义函数一模一样,但是格式要按照协议栈规定的来写。
    例如:
    #include "ioCC2430.h"
    _PRAGMA(vector=URX0_VECTOR) __near_func __interrupt void UART0_ISR(void);
    ...
    _PRAGMA(vector=URX0_VECTOR) __near_func __interrupt void UART0_ISR(void)
    {
    ....  //函数体
    }


    例子中浅蓝色的部分是可以自己来设定的,其他格式都是确定的,以上就是在协议栈中添加中断函数的方法,希望能对你有所帮助。

    展开全文
  • Zigbee协议栈OSAL层API函数

    千次阅读 2012-10-16 13:53:29
    Zigbee协议栈OSAL层API函数 (2010-11-19 21:18) 分类: ZigBee 技术学习  OSAL层提供了很多的API来对整个的协议栈进行管理。主要有下面的几类:信息管理、任务同步、时间管理、中断管理、任务管理...
  • Zigbee协议栈 OSAL机制

    2018-05-13 19:42:06
    内容为帮助自己的理解,注明转载。OSAL,主要是一种机制,一种任务分配资源的机制。从而形成了一个简单多任务的操作系统(今天有个人说这...资源初始化主要包括内存,中断,NV等各种设备模块资源。接着,OSAL通过osal...
  • 一.串口问题 关于串口的一些常识欢迎点击进入串口中断 二.协议栈串口发送问题
  • zigbee通过外部中断唤醒发送数据(未运行协议栈)
  • zigbee 协议栈睡眠用法

    千次阅读 2014-02-19 23:14:52
    pm3模式最省电但是只能被外部中断唤醒。开启睡眠功能很简单: 首先确认/Texas Instruments/ZStack-1.4.3-1.2.1/Projects/zstack/Tools/CC2430DB目录下的f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE; ...
  • 原来对操作系统觉得不是很了解,源码不是完全开放,这个解析挺不错,知道了解API的大概用法,看的时候就不会太蒙圈~OSAL层提供了很多的API来对整个的协议栈进行管理。主要有下面的几类:信息管理、任务同步、时间...
  • 接下来,我将通过一系列的改动,将OK、CANCEL和RIGHT三个键改成中断方式来查询其状态。 首先,要使能中断方式查询按键状态。在OnBoard.c文件,修改InitBoard()函数,如下面红色部分所示: void InitBoard( ...
  • 协议栈中断的使用 OSAL的原理 通信原理 单播通信原理 广播通信原理 组播通信原理 网络特性   协议栈的使用 增加应用层任务事件 #define TESTAPP_SEND_MSG_EVT 0x0001 /*  *定义...
  • 第一Z-Stack 软件架构  Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始 化,另外一件是开始执行轮转查询式操作系统,  FS_Zstack\ZMain.c  ... // 关闭所有中断     HAL_BOARD
  • https://blog.csdn.net/GOGOmusic/article/details/53027039协议栈从底层添加一个自己的按键 一、在hal_key.c文件中配置按键所在端口在HAL->Target->CC2530EB->Drivers->hal_key.c中...
  • OSAL层提供了很多的API来对整个的协议栈进行管理。主要有下面的几类:信息管理、任务同步、时间管理、中断管理、任务管理、内存管理、电源管理以及非易失存储管理。看到这些管理是不是感觉越来越像一个操作系统了。 ...
  • 仅用一张图片来表示,这张图片和我上篇博客有异曲同工之处,毕竟这几天都在入门。。。  这仅仅是查询方式,按键流程还有中断方式。。。。。。。。。。
  • 最近一直在研究ZigBee2006协议栈,需要用到硬件。有关硬件的头文件和C文件基本上都在HAL文件夹里,这里面有各个硬件,如键盘、LCD、串口等外设的头文件,在hal/target/2430BB、2430DB、2340EB文件夹里有相应的C文件...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

zigbee协议栈中断