7天快速入门Zigbee:如何在协议栈中添加中断处理程序

                       7天快速入门Zigbee:如何在协议栈中添加中断处理程序

目录
1.    概述    
2.    如何在协议栈中添加中断处理程序
3.    实例:写一个P1_2的外部中断处理函数 
4.    中断向量    

 

1. 概述

       这篇文章主要是想让大家了解如何在协议栈中添加中断处理函数。

2. 如何在协议栈中添加中断处理程序

       我们先看一下Z-Stack Mesh协议栈“_hal_uart_isr.c”文件中关于串口0的接收中断处理程序:

/***************************************************************************************************
* @fn      halUartRxIsr
* @brief   UART Receive Interrupt
* @param   None
* @return  None
 ***************************************************************************************************/
HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )
{
  uint8 tmp = UxDBUF;
  isrCfg.rxBuf[isrCfg.rxTail] = tmp;

  // Re-sync the shadow on any 1st byte received.
  if (isrCfg.rxHead == isrCfg.rxTail)
  {
    isrCfg.rxShdw = ST0;
  }

  if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX)
  {
    isrCfg.rxTail = 0;
  }

  isrCfg.rxTick = HAL_UART_ISR_IDLE;
}

       其中函数头“HAL_ISR_FUNCTION”部分是个宏定义,其直接展开为:

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

       这里面有两部分代码“HAL_ISR_FUNC_PROTOTYPE”和“HAL_ISR_FUNC_DECLARATION”,第一部分代码为“函数声明”,第二部分代码为函数原型。这两部分的代码展开皆为“_PRAGMA(vector=v) __near_func __interrupt void f(void)”,现在我们将“HAL_ISR_FUNCTION”部分完全展开可得下列程序:

// 函数声明
_PRAGMA(vector= URX0_VECTOR) __near_func __interrupt void halUart0RxIsr (void);
// 函数原型
_PRAGMA(vector= URX0_VECTOR) __near_func __interrupt void halUart0RxIsr (void)
{
  uint8 tmp = UxDBUF;
  isrCfg.rxBuf[isrCfg.rxTail] = tmp;

  // Re-sync the shadow on any 1st byte received.
  if (isrCfg.rxHead == isrCfg.rxTail)
  {
    isrCfg.rxShdw = ST0;
  }

  if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX)
  {
    isrCfg.rxTail = 0;
  }

  isrCfg.rxTick = HAL_UART_ISR_IDLE;
}

       其中“_PRAGMA”是编译器预定义声明中断服务程序的一个方法,“URX0_VECTOR”是中断编号,其在“ioCC2530.h”文件中定义。“halUart0RxIsr”是“HAL_ISR_FUNCTION(f,v)”中“f”所指的函数,也就是我们的中断服务函数。

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

__near_func                                  // IAR的特殊字

__interrupt                                     // 中断函数标志

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

3. 实例:写一个P1_2的外部中断处理函数

       根据协议栈定义串口0接收中断处理函数的方法,我们可以模仿写一个P1_2的外部中断处理函数。

HAL_ISR_FUNCTION( P1_ISR, P1INT_VECTOR )
{
  // 进入中断程序,保存 EA 寄存器状态,开启 EA
  HAL_ENTER_ISR();
  
  // 清除端口1中断标志
  IRCON2 &= ~(1<<3); 
  
  // 如果是 P1_2 的中断
  if(P1IFG&0x04)
  {
    // 清除 P1_2 口中断标志
    P1IFG &= ~(1<<2);
    // 处理 P1_2 中断事件
    
  }
  
  // 退出中断程序,恢复 EA 寄存器状态
  HAL_EXIT_ISR();
}

4. 中断向量

ioCC2530.h

/* ------------------------------------------------------------------------------------------------
 *                                        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             */

大家的支持就是我分享技术的动力,希望大家需转载时能附上原作者的博客:https://blog.csdn.net/u012993936,谢谢。

 

你可能还想看:

> Zigbee进阶:功能模块
免费的Zigbee抓包神器!比Ubiqua还好用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_嘉伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值