cc2530应用笔记

news2024/11/28 19:40:14

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习笔记--继承方法的重写介绍,重写方法的注意事项,方法重写的使用场景,super和this

目录 一&#xff0c;方法的重写 二&#xff0c;重写方法的注意事项 三&#xff0c;方法重写的使用场景 四&#xff0c;super和this 1.继承中构造方法的特点 2.super和this的具体使用 super的具体使用 this的具体使用 一&#xff0c;方法的重写 1.概述:子类中有一个和父类…

深入浅出摸透AIGC文生图产品SD(Stable Diffusion)

hihi,朋友们,时隔半年(24年11月),终于能腾出时间唠一唠SD了🤣,真怕再不唠一唠,就轮不到SD了,技术更新换代是在是太快! 朋友们,最近(24年2月)是真的没时间整理笔记,每天都在疯狂的学习Stable Diffusion和WebUI & ComfyUI,工作实在有点忙,实践期间在飞书上…

OSI七层模型和TCP/IP五层模型详细介绍

这里写目录标题 一.OSI含义二.OSI七层模型1.应用层2.表示层3.会话层4.传输层5.网络层6.数据链路层7.物理层 TCP/IP五层协议1.应用层2.运输层运行在TCP上的协议运行在UDP上的协议 3.网络层IP协议配套使用的协议 4.数据链路层 四.网络协议分层的好处 一.OSI含义 OSI即是开放式通…

360推出全新的生成式 AI 搜索产品:纳米搜索,要重塑搜索产品

【大力财经】直击互联网最前线&#xff1a;360 集团在 2024 年 11 月 27 日开发布会&#xff0c;重磅推出了一款全新的生成式 AI 搜索产品——纳米搜索&#xff0c;并且已经上架到苹果 App Store 以及应用宝等安卓应用商店&#xff0c;直接与百度、阿里夸克、秘塔 AI、Perplexi…

【超全】目标检测模型分类对比与综述:单阶段、双阶段、有无锚点、DETR、旋转框

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

c#:winform引入bartender

1、vs新建项目 ①选择Windows窗体应用&#xff08;.NET Framework&#xff09; 2、将bartender引入vs中 ①找到bartender的安装目录&#xff0c;复制Seagull.BarTender.Print.dll文件 ②粘贴到项目->bin->Debug文件&#xff0c;并可创建Model文件夹&#xff1a;为了存放…

vue 实现关键字高亮效果

vue 实现关键字高亮效果 这是啥子意思呢&#xff0c;就是类似于百度搜索&#xff0c;根据关键词搜索结果&#xff0c;搜索结果中&#xff0c;与关键词相同的字显示红色&#xff0c;仅此而已&#xff0c;没有什么大的功能。简单写一下demo。 环境 我使用的是 vue3 ts 的语法来…

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…

[DL]深度学习_扩散模型正弦时间编码

1 扩散模型时间步嵌入 1.1 时间步正弦编码 在扩散模型按时间步 t 进行加噪去噪过程时&#xff0c;需要包括反映噪声水平的时间步长 t 作为噪声预测器的额外输入。但是最初与图像配套的时间步 t 是数字&#xff0c;需要将代表时间步 t 的数字编码为向量嵌入。嵌入时间向量的宽…

【Linux】网络基本配置命令

一、使用网络配置命令 1.常用网络配置文件 1.1. /etc/hosts “/etc/hosts”文件保存着IP地址和主机名或域名的静态映射关系。当用户使用一个主机名或域名时&#xff0c;系统会在该文件中查找与它对应的IP地址。 [rootlocalhost ~]# cat /etc/hosts 127.0.0.1 localhost l…

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

学习threejs,使用设置lightMap光照贴图创建阴影效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshLambertMaterial…

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…

springboot 整合 rabbitMQ (延迟队列)

前言&#xff1a; 延迟队列是一个内部有序的数据结构&#xff0c;其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间&#xff0c;意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之&#xff0c;延时队列被设计用于存放那…

Java代码操作Zookeeper(使用 Apache Curator 库)

1. Zookeeper原生客户端库存在的缺点 复杂性高&#xff1a;原生客户端库提供了底层的 API&#xff0c;需要开发者手动处理很多细节&#xff0c;如连接管理、会话管理、异常处理等。这增加了开发的复杂性&#xff0c;容易出错。连接管理繁琐&#xff1a;使用原生客户端库时&…

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑&#xff0c;并设计用户界面。下面是一步一步的简要说明&#xff1a; 目录&#xff1a; QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…

从〇开始深度学习(0)——背景知识与环境配置

从〇开始深度学习(0)——背景知识与环境配置 文章目录 从〇开始深度学习(0)——背景知识与环境配置写在前面1.背景知识1.1.Pytorch1.2.Anaconda1.3.Pycharm1.4.CPU与GPU1.5.整体关系 2.环境配置2.1.准备工作2.1.1.判断有无英伟达显卡2.1.2.清理电脑里的旧环境 2.1.安装Anaconda…

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…

圆域函数的傅里叶变换和傅里叶逆变换

空域圆域函数的傅里叶变换 空域圆域函数&#xff08;也称为空间中的圆形区域函数&#xff09;通常指的是在二维空间中&#xff0c;以原点为中心、半径为 a a a的圆内取值为1&#xff0c;圆外取值为0的函数。这种函数可以表示为&#xff1a; f ( x , y ) { 1 if x 2 y 2 ≤ …