11.Z-Stack协议栈使用
f8wConfig.cfg文件
选择信道、设置PAN ID

选择信道
#define DEFAULT_CHANLIST 0x00000800
DEFAULT_CHANLIST 表明Zigbee模块要工作的网络,当有多个信道参数值进行或操作之后,把结果作为 DEFAULT_CHANLIST值
对于路由器、终端、协调器的意义:
- 路由器和终端:
- 可以在参与或操作的这些信道上选择一个相对于我来说最佳的网络,加入进去
- 协调器
- 可以在参与或操作的这些信道上选择一个最佳的信道并在这个信道上创建自己的Zigbee网络
选择PAN ID
-
非0xFFFF
- 路由器和终端:必须要加入到PANID为参数值这样一个Zigbee无线局域网
- 协调器:要创建一个网络,并且把这个参数值作为这个网络的PANED
-
为0xFFFF
- 路由器和终端:在加入网络的时候没有PANID的限制
- 协调器:可以随机生成一个值,把这个随机值作为这个网络的PANED
当2个模块下载相同的协调器代码,并且指定的PANID参数值为非0xffff时,
先上电的模块可以创建0xFFF8这样一个Zigbee网络,后上电的模块创建一个在0xFFF8基础上加1的网络。
响应任务事件
硬件层 :硬件操作相关
网络层 :网络相关的代码
应用层:自己写应用程序部分
- 几乎每一个层都是一个任务,系统为每一个任务分配一个,一个字节的唯一数值编号,每一个任务都能处理一些他们能够处理的事物
- 任务ID:这个数值编号叫做
- 事件:它他们能够处理的事物
/*
*task_id:任务ID
*event_flag:任务事件
*/
uint8 osal_set_event( uint8 task_id, uint16 event_flag )
在工程中进行测试
- 在
TestAPP.c文件中,找到UINT16 TestAPP_ProcessEvent( byte task_id, UINT16 events )函数 - 在之前写的三种模式的测试代码下添加如下语句
osal_set_event(TestAPP_TaskID,TestAPP_SEND_MSG_EVT);

- 在该函数中进行向下找,看到对
TestAPP_SEND_MSG_EVT事件的响应代码,进行如下处理:
P0DIR |= 0X02;P0_1 = 0;

- 在
P0DIR语句前和LS164_BYTE(11)语句前打断点,然后再路由器的工程下进行编译,然后烧录代码,下载后全速执行、单步调试 - 实验现象:跳到
TestAPP_SEND_MSG_EVT事件的响应代码,LED2亮
软件定时器响应事件
/*
*taskID:任务ID
*event_id:任务事件
*timeout_value:超时时间(毫秒),多长时间处理一次
*/
uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
实验验证
osal_start_timerEx(TestAPP_TaskID,TestAPP_SEND_MSG_EVT,2000);
- 注释掉刚才写的
osal_set_event函数,将osal_start_timerEx函数写在下面

- 编译下载,观察实验现象
- 延时2秒后亮
定义事件
格式为
#define 事件名 0x000??可以是十六进制的数,最多定义16个时间 0 ~ F必须保证3个0,位置随意
实验验证
- 在
TestAPP.h文件中,定义事件
格式为 #define 事件名 0x000? ?可以是十六进制的数,最多定义16个时间 0 ~ F
必须保证3个0,位置随意
//格式为 #define 事件名 0x000? ?可以是十六进制的数,最多定义16个时间 0 ~ F
//必须保证3个0,位置随意
#define TestAPP_EVT 0x0002
- 如下

- 在
TestAPP.c文件中,找到刚才的UINT16 TestAPP_ProcessEvent( byte task_id, UINT16 events )函数,在最后一个事件响应代码下,添加新的事件响应代码
if ( events & TestAPP_EVT ){//初始化要全面,因为使用的是TI官方代码移植的,他官方例程中可能也配置了这个IO口,我们在这里重新配置的时候必须要全面配置,否则这个IO口可能默认不是通用IOP0SEL &=0XEF;//1110 1111 P0DIR |= 0X10;P0_4 = 0;return (events ^ TestAPP_EVT);}

- 添加本事件的响应事件函数

- 编译,下载,灯亮
初始化要全面,因为使用的是TI官方代码移植的,他官方例程中可能也配置了这个IO口,我们在这里重新配置的时候必须要全面配置,否则这个IO口可能默认不是通用IO
消息
在ZSTACK里,任务事件定义的特点决定了,每一个任务最多只能处理16种不同的事件,而系统在运行时候有许多事务需要处理,如果每一个实物处理都定义成1个事件,那么16种事件肯定是不够用,所有引入消息。
消息的处理事务的原理:
定义了一个事件#define SYS_EVENT_MSG 0x8000 // A message is waiting event
当需要应用层任务来处理某个事务的时候,首先给应用层任务发送一个消息
掉osal_set_event(SDApp_TaskID,SYS_EVENT_MSG);
那么这样一来,应用层就会进入SYS_EVENT_MSG处理,在这个事件处理里判断到底刚刚引发我们产生SYS_EVENT_MSG事件是哪一种类型的消息,然后根据消息的类型做相应的处理。
而消息的类型可以自己定义,这样一来消息的类可以很多,那么应用层任务处理的事物种类就很多了。
实验验证
- 将
TestAPP.c文件中的void TestAPP_HandleKeys( byte shift, byte keys )函数下的所有内容清空,然后调用数码管显示函数

- 在
TestAPP_ProcessEvent函数注释掉之前调用的osal_start_timerEx,将下面的函数添加到下面
// 定义一个名为keyChange_t的结构体指针msgPtr
keyChange_t *msgPtr;//定义按键响应消息
msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );if ( msgPtr ){// 将消息头部的事件设置为KEY_CHANGEmsgPtr->hdr.event = KEY_CHANGE;// 将键值设置为3msgPtr->keys=3;//将发送给TestAPP_TaskID任务的消息压入消息队列,并响应系统事件osal_set_event(TestAPP_TaskID,SYS_EVENT_MSG);osal_msg_send( TestAPP_TaskID, (uint8 *)msgPtr );
}

- 编译,下载,数码管显示按键数字,表示无误
按键实验(协议栈实现)
- 添加封装好的代码到工程中
Key.c
根据自己的实际情况,更改里面的文件名和事件名
#include<iocc2530.h>
#include "TestApp.h"
#include "OSAL_Timers.h"
extern unsigned char TestAPP_TaskID;
void delay()
{int i,j;for(i=0;i<1000;i++)for(j=0;j<30;j++);
}
void KeysIntCfg()
{//Key3 Key4 Key5P1SEL &=~0X02;P1DIR &=~0X02;IEN2|=0x10;//开P1IE组中断P1IEN|=0x02;//开Key3组内中断PICTL|=0x02;//设置P1_1为下降沿P2SEL &=~0X01;P2DIR &=~0X01;IEN2|=0x02;P2IEN|=0x01;PICTL|=0x08;//设置P2_0为下降沿P0SEL &=~0X20;P0DIR &=~0X20;P0IE=1;//或者写成 IEN1|=0x20P0IEN|=0x20;PICTL|=0x01;//设置P0_5为下降沿EA=1; //开总中断
}#pragma vector=P1INT_VECTOR
__interrupt void Key3_ISR() //P1_1
{if(P1IFG & 0X02){osal_start_timerEx(TestAPP_TaskID,TestAPP_EVT,25);}P1IFG =0;P1IF=0;
}
#pragma vector=P2INT_VECTOR
__interrupt void Key4_ISR()//P2_0
{if(P2IFG & 0X01){ osal_start_timerEx(TestAPP_TaskID,TestAPP_EVT,25);}P2IFG =0;P2IF=0;
}
#pragma vector=P0INT_VECTOR
__interrupt void Key5_ISR()//P0_5
{if(P0IFG & 0X20){osal_start_timerEx(TestAPP_TaskID,TestAPP_EVT,25);}P0IFG =0;P0IF=0;
}
Key.h
#ifndef KEY_H
#define KEY_H
void KeysIntCfg();#endif
- 引用头文件,初始化。【初始化函数一定要放到
osal_start_system();之前】


- 屏蔽官方例程中的中断函数。【hal-target-CC2530EB-drivers】里面的
HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR )和HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )

- 将
TestAPP.c文件中的之前定义的TestAPP_EVT事件响应进行修改,如下所示
if ( events & TestAPP_EVT ){P0SEL &=0XEF;//1110 1111 P0DIR |= 0X10;P0_4 ^= 1;if(0==P1_1){/*按钮3按下*/LS164_BYTE(3);}if(0==P2_0){/*按钮4按下*/LS164_BYTE(4);}if(0==P0_5){/*按钮5按下*/LS164_BYTE(5);}return (events ^ TestAPP_EVT);}
- 下载,实验现象:按下按键灯亮灭交替,数码管显示按键编号
使用协议栈生成hex文件注意
-
配置项目工程,可以生成hex,之前在生成工程里面说过如何设置
-
在
f8w2530.xc文件中,将下面两行的注释去掉

相关文章:
11.Z-Stack协议栈使用
f8wConfig.cfg文件 选择信道、设置PAN ID 选择信道 #define DEFAULT_CHANLIST 0x00000800 DEFAULT_CHANLIST 表明Zigbee模块要工作的网络,当有多个信道参数值进行或操作之后,把结果作为 DEFAULT_CHANLIST值 对于路由器、终端、协调器的意义࿱…...
设计模式—结构型模式之适配器模式
设计模式—结构型模式之适配器模式 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者&a…...
【LeetCode】187. 重复的DNA序列
187. 重复的DNA序列 难度:中等 题目 DNA序列 由一系列核苷酸组成,缩写为 A, C, G 和 T.。 例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 …...
C++17中std::any的使用
类sdk:any提供类型安全的容器来存储任何类型的单个值。通俗地说,std::any是一个容器,可以在其中存储任何值(或用户数据),而无需担心类型安全。void*的功能有限,仅存储指针类型,被视为不安全模式。std::any可以被视为vo…...
携手ChainGPT 人工智能基础设施 波场TRON革新 Web3 版图
近日,波场TRON与 Web3 人工智能基础设施服务商 ChainGPT 正式达成合作。通过本次合作,双方将进一步推动人工智能和区块链技术的融合,在实现优势互补的同时,真正惠及日常生活。 作为一站式的加密AI中心,ChainGPT 的人工智能工具需要进行大量计算,能耗高,而波场TRON采用的创新型…...
pdfH5实现pdf预览功能
1.引入 npm install pdfh5 2.使用 <view id"pdfBox" class""></view> showPdf(url) {this.pdfh5 new Pdfh5("", {URIenable: false,zoomEnanle: true,maxZoom: 2,pdfurl: url})this.pdfh5.on("complete", function(st…...
Redis的持久化机制
多级缓存使用到了一个装饰设计模式:相当于我不影响我之前缓存本身的代码,但是我可以对我的缓存去做增强,因此多级缓存就是采用装饰模式去实现的~! 多级缓存可以采用装饰模式去重构~! Redis当中的持久化机制ÿ…...
mac装不了python3.7.6
今天发现一个很奇怪的问题 但是我一换成 conda create -n DCA python3.8.12就是成功的 这个就很奇怪...
仿写知乎日报第三周
新学到的 本周新学习了FMDB数据库,并对Masonry的使用有了更近一步的了解,还了解了cell的自适应高度 FMDB数据库的介绍和使用:iOS——FMDB的介绍与使用 cell自适应高度和Mansonry自动布局 本周写了评论区,在写评论区的时候&…...
Godot Best practices
Get Forward Vector transform.x # 等价手算 var rad node.rotation var forward Vector2(cos(rad), sin(rad))Await and Unity Style Coroutine func coroutine(on_update: Callable, duration: float 1):var elapse_time 0while elapse_time < 1:elapse_time get_p…...
win10 + cmake3.17 编译 giflib5.2.1
所有源文件已经打包上传csdn,大家可自行下载。 1. 下载giflib5.2.1,解压。 下载地址:GIFLIB - Browse Files at SourceForge.net 2. 下载CMakeLists.txt 及其他依赖的文件 从github上的osg-3rdparty-cmake项目: https://github.…...
【rust/esp32】初识slint ui框架并在st7789 lcd上显示
文章目录 说在前面关于slint关于no-std关于dma准备工作相关依赖代码结果参考 说在前面 esp32版本:s3运行环境:no-std开发环境:wsl2LCD模块:ST7789V2 240*280 LCDSlint版本:master分支github地址:这里 关于s…...
精通Nginx(05)-http工作机制、指令和内置变量
http服务是Nginx最原始的服务,搞清楚其工作机制非常有利于弄懂nginx是如何工作的。 Nginx核心模块为ngx_http_core_module。 目录 http工作机制 配置结构 工作机制 http常用指令 http server listen server_name location 优先级 "/"的特殊用法 root/a…...
用于 GaN-HEMT 功率器件仿真的 TCAD 方法论
目录 标题:TCAD Methodology for Simulation of GaN-HEMT Power Devices来源:Proceedings of the 26th International Symposium on Power Semiconductor Devices & ICs(14年 ISPSD)GaN-HEMT仿真面临的挑战文章研究了什么文章的创新点文章的研究方法…...
Web3公链之Cosmos生态的项目Celestia
文章目录 Web3公链之Cosmos生态的项目:模块化区块链Celestia什么是CelestiaCelestia网络架构数据可用性问题有哪些可用的解决方案? 发展历史运行节点参考 Web3公链之Cosmos生态的项目:模块化区块链Celestia 什么是Celestia 官网:…...
vue+prismjs 网页代码高亮插件
最近在使用wangEditor的过程中发现编辑器中代码块展示没有问题,但是预览编辑器中的内容样式丢失,看过wangEditor的文档后发现用到了Prism.js,现将使用的经验分享。 使用步骤 1、安装prismjs插件 // 1. 安装prismjs 插件 npm install prismj…...
【软件测试】其实远远不止需求文档这么简单
我们都知道,软件测试是一门依赖性很强的综合技术,软件测试工程师在施行自己的工作时,总是要依赖其他团队的产出。 比如,我们要依赖着需求团队给出的需求分析说明书来确定测试的方向,又要依赖开发团队产出的实际代码产品…...
SAP-PP-常用TCODE
PP主数据管理MM01/MM02物料主数据维护/修改 MM17物料主数据部分字段批量修改 /sapapo/mat1PPDS查看物料主数据 /sapapo/Res01PPDS查看资源主数据 BOM管理CS01/CS02维护/修改/删除BOM 超级BOM涉及到物料分类类型001 ,CT04 创建特性,CL01 创建类 工作中…...
第六章认识Node.js服务器开发
目录 Node.js同步和异步编程 基本概念 执行方式 获取异步API的返回值 网页基础扩展 项目 Node.js同步和异步编程 基本概念 同步API(应用程序编程接口)是指只有当前API执行完毕后才能继续执行下一个API。形象的说同步模式就是一个服务员在某一个时间段内只服务一个客人…...
Ubuntu 增加服务 比如openfire
在Ubuntu上,可以使用systemd来管理和配置服务。下面是将命令添加为服务的一般步骤: 创建一个.service文件,该文件描述了您要添加的服务。打开终端,并使用以下命令创建一个新的服务文件: sudo nano /etc/systemd/syst…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
