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…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...