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…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
