cc2530应用笔记
文章目录
- cc2530应用笔记
- 说明
- 一、死机
- 内存溢出
- 串口回调函数重复调用
- 定时器配置错误
- 二、中断
- 1. IO中断
- 2. 定时器中断
- 休眠
- 参考文档
说明
CC2530相关应用笔记
提示:以下是本篇文章正文内容,下面案例可供参考
一、死机
来自与百度 - cc2530 死机:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=cc2530%20%E6%AD%BB%E6%9C%BA&oq=cc25%2526lt%253B0%2520%25E8%25B0%2583%25E8%25AF%2595%25E5%25B7%25A5%25E5%2585%25B7&rsv_pq=8e647187000d6fb5&rsv_t=2d71CUa4%2Fj9yKxvq3jYrlCQIrXR7ITd%2FCuFXMWlUcHWpe9w173vNRfRUldo&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=5198&rsv_sug3=60&rsv_sug1=50&rsv_sug7=100&bs=cc2530%20%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7
CC2530死机的主要原因包括内存溢出、串口回调函数重复调用、定时器配置错误等。
内存溢出
在使用CC2530进行大数据通信时,可能会出现内存溢出导致程序卡死的情况。例如,终端设备以1000字节/秒的速度发送数据给协调器设备,通信几个小时后协调器设备出现程序卡死现象,且无法通过看门狗功能重启设备1。
串口回调函数重复调用
在使用CC2530的串口时,协议栈会生成一个串口发送事件,执行该事件时会触发相应的串口回调函数,导致回调函数被重复调用,从而引发程序卡死。解决这个问题的方法是在_hal_uart_dma.c文件中找到HalUARTPollDMA函数,将if (dmaCfg.txMT)判断语句注释掉2。
定时器配置错误
在使用CC2530的定时器时,配置错误也可能导致程序死机。例如,在设置PWM输出时,如果配置了错误的寄存器(如CLKCONCMD),可能会导致程序异常停止3。
调试和排查方法
查看内存使用情况:检查程序的内存使用情况,确保没有内存溢出。
注释掉重复调用的代码:在_hal_uart_dma.c文件中注释掉可能导致重复调用的代码段。
检查定时器配置:仔细检查定时器的配置,确保没有错误的设置导致程序异常。
使用调试工具:利用调试工具如IAR Embedded Workbench进行代码调试,查看具体是哪部分代码导致程序卡死。
通过以上方法,可以有效排查和解决CC2530死机的问题。
内存溢出
串口回调函数重复调用
定时器配置错误
二、中断
1. IO中断
参考代码:
#include <stdio.h>
#include <string.h>
#include <ioCC2530.h>
#include "hal_mcu.h"
#include "hal_defs.h"
#include "hal_types.h"
#include "hal_board.h"
#include "hal_drivers.h"
#include "hal_mir3da_int.h"
#include "hal_mir3da_evt.h"
#include "hal_mir3da.h"
/**/
#define HAL_GSENSOR_INT_RISING_EDGE 0
#define HAL_GSENSOR_INT_FALLING_EDGE 1
/* CPU port interrupt */
#define HAL_GSENSOR_CPU_PORT_1_IF P1IF
#define HAL_GSENSER_INT1_PORT P1
#define HAL_GSENSOR_INT1_BIT BV(4)
#define HAL_GSENSOR_INT1_SEL P1SEL
#define HAL_GSENSOR_INT1_DIR P1DIR
#define HAL_GSENSER_INT2_PORT P1
#define HAL_GSENSOR_INT2_BIT BV(3)
#define HAL_GSENSOR_INT2_SEL P1SEL
#define HAL_GSENSOR_INT2_DIR P1DIR
/* dege interrupt */
#define HAL_GSENSOR_INT1_EDGEBIT BV(2) // P1ICONH P1.7-P1.4
#define HAL_GSENSOR_INT2_EDGEBIT BV(1) // P1ICONL P1.3-P1.0
/* int1 interrupts */
#define HAL_GSENSOR_INT1_IEN IEN2
#define HAL_GSENSOR_INT1_IENBIT BV(4)
#define HAL_GSENSOR_INT1_ICTL P1IEN
#define HAL_GSENSOR_INT1_ICTLBIT BV(4) // P1IEN - P1.4
#define HAL_GSENSOR_INT1_PXIFG P1IFG
#define HAL_GSENSOR_INT2_IEN IEN2
#define HAL_GSENSOR_INT2_IENBIT BV(4)
#define HAL_GSENSOR_INT2_ICTL P1IEN
#define HAL_GSENSOR_INT2_ICTLBIT BV(3) // P1IEN - P1.3
#define HAL_GSENSOR_INT2_PXIFG P1IFG
/* */
/**************************************************************************************************
* FUNCTIONS - Local
**************************************************************************************************/
static void halProcessGSensorInterrupt(void);
/**************************************************************************************************
* @fn HalGSensorIntInit
*
* @brief Initilize GSensor Interrupt Service 初始化中断服务
*
* @param none
*
* @return None
**************************************************************************************************/
void HalGSensorIntInit( void )
{
// 中断1配置
HAL_GSENSOR_INT1_SEL &= ~(HAL_GSENSOR_INT1_BIT); /* Set pin function to GPIO */
HAL_GSENSOR_INT1_DIR &= ~(HAL_GSENSOR_INT1_BIT); /* Set pin direction to Input */
// INT1-P1.4 (P1.7-P1.4)
PICTL &= ~(HAL_GSENSOR_INT1_EDGEBIT); // 上升沿
// PICTL |= HAL_GSENSOR_INT1_EDGEBIT; // 下将沿
HAL_GSENSOR_INT1_ICTL |= HAL_GSENSOR_INT1_ICTLBIT; // P1 port interrupt Mask(使能P1.4中断)
//HAL_GSENSOR_INT1_IEN |= HAL_GSENSOR_INT1_IENBIT; // Interrupt Enable 2 / port 1 interrupt enable
HAL_GSENSOR_INT1_PXIFG = ~(HAL_GSENSOR_INT1_BIT); // 清除中断标志
// 中断2配置(已经可以工作)
HAL_GSENSOR_INT2_SEL &= ~(HAL_GSENSOR_INT2_BIT); /* Set pin function to GPIO */
HAL_GSENSOR_INT2_DIR &= ~(HAL_GSENSOR_INT2_BIT); /* Set pin direction to Input */
// INT2-P1.3 (P1.3-P1.0)
PICTL &= ~(HAL_GSENSOR_INT2_EDGEBIT); // 上升沿
// PICTL |= HAL_GSENSOR_INT2_EDGEBIT; // 下将沿
HAL_GSENSOR_INT2_ICTL |= HAL_GSENSOR_INT2_ICTLBIT; // P1 port interrupt Mask(使能P1.3中断)
HAL_GSENSOR_INT2_IEN |= HAL_GSENSOR_INT2_IENBIT; // Interrupt Enable 2 /port 1 interrupt enable
HAL_GSENSOR_INT2_PXIFG = ~(HAL_GSENSOR_INT2_BIT); // 清除中断标志
}
/**************************************************************************************************
* @fn halKeyPort1Isr
*
* @brief Port1 ISR
*
* @param
*
* @return
**************************************************************************************************/
HAL_ISR_FUNCTION( halGSensorPortIsr, P1INT_VECTOR )
{
HAL_ENTER_ISR();
if (HAL_GSENSOR_INT2_PXIFG & HAL_GSENSOR_INT2_BIT) /* Interrupt Flag has been set */
{
HAL_GSENSOR_INT2_PXIFG = ~(HAL_GSENSOR_INT2_PXIFG); /* Clear Interrupt Flag */
printf("int2\r\n");
}else
if (HAL_GSENSOR_INT1_PXIFG & HAL_GSENSOR_INT1_BIT) /* Interrupt Flag has been set */
{
HAL_GSENSOR_INT1_PXIFG = ~(HAL_GSENSOR_INT1_PXIFG); /* Clear Interrupt Flag */
printf("int1\r\n");
}
CLEAR_SLEEP_MODE();
HAL_EXIT_ISR();
}
2. 定时器中断
定时器中断基本思路,希望该中断在底层进行工作。不需要发送到应用层。主要参考hal_key.c/h相关代码。
影响文件:
- hal_driver.c/h
- hal_gsensor.c/h
休眠
hal_sleep.c/h
参考文档
*(zigbee学习总结二)Z-stack按键机制 - https://blog.csdn.net/weixin_30520015/article/details/96086754