11.Z-Stack协议栈使用

news2024/11/25 2:53:27

f8wConfig.cfg文件

选择信道、设置PAN ID

image-20231024164646941

选择信道

#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 )

在工程中进行测试

  1. TestAPP.c文件中,找到UINT16 TestAPP_ProcessEvent( byte task_id, UINT16 events )函数
  2. 在之前写的三种模式的测试代码下添加如下语句
osal_set_event(TestAPP_TaskID,TestAPP_SEND_MSG_EVT);

image-20231024173151722

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

image-20231024172856825

  1. P0DIR语句前 LS164_BYTE(11)语句前打断点,然后再路由器的工程下进行编译,然后烧录代码,下载后全速执行、单步调试
  2. 实验现象:跳到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);
  1. 注释掉刚才写的osal_set_event函数,将osal_start_timerEx函数写在下面

image-20231024173632873

  1. 编译下载,观察实验现象
  2. 延时2秒后亮

定义事件

格式为 #define 事件名 0x000? ?可以是十六进制的数,最多定义16个时间 0 ~ F

必须保证3个0,位置随意

实验验证

  1. TestAPP.h文件中,定义事件

格式为 #define 事件名 0x000? ?可以是十六进制的数,最多定义16个时间 0 ~ F

必须保证3个0,位置随意

//格式为 #define 事件名 0x000?  ?可以是十六进制的数,最多定义16个时间 0 ~ F
//必须保证3个0,位置随意
#define TestAPP_EVT                0x0002   
  1. 如下

image-20231024174750798

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

image-20231024175336520

  1. 添加本事件的响应事件函数

image-20231024180249010

  1. 编译,下载,灯亮

初始化要全面,因为使用的是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事件是哪一种类型的消息,然后根据消息的类型做相应的处理。
而消息的类型可以自己定义,这样一来消息的类可以很多,那么应用层任务处理的事物种类就很多了。

实验验证

  1. TestAPP.c文件中的void TestAPP_HandleKeys( byte shift, byte keys )函数下的所有内容清空,然后调用数码管显示函数

image-20231024185914125

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

image-20231024185449983

  1. 编译,下载,数码管显示按键数字,表示无误

按键实验(协议栈实现)

  1. 添加封装好的代码到工程中

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   Key5
     
     P1SEL &=~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|=0x20
     P0IEN|=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
  1. 引用头文件,初始化。【初始化函数一定要放到osal_start_system();之前】

image-20231024190443721

image-20231024190533982

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

image-20231024190935761

  1. 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);
  }
  1. 下载,实验现象:按下按键灯亮灭交替,数码管显示按键编号

使用协议栈生成hex文件注意

  1. 配置项目工程,可以生成hex,之前在生成工程里面说过如何设置

  2. f8w2530.xc文件中,将下面两行的注释去掉

image-20231024192040722

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

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

相关文章

【Linux网络】Linux网络抓包工具tcpdump

一、tcpdump介绍 tcpdump 是一个Linux的网络抓包工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 适用于大多数的类Unix系统操作系统(如linux,BSD等)。 二、安装&用法说明 1&#xff09;安装 $ yum -y install tcpdump2&#…

【知网检索征稿】第九届社会科学与经济发展国际学术会议 (ICSSED 2024)

第九届社会科学与经济发展国际学术会议 (ICSSED 2024) 2024 9th International Conference on Social Sciences and Economic Development 第九届社会科学与经济发展国际学术会议(ICSSED 2024)定于2024年3月22-24日在中国北京隆重举行。会议主要围绕社会科学与经济发展等研究…

Everything结合内网穿透搭建在线资料库,一秒实现随时随地访问

Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…

(免费领源码)Java#MYSQL在线学习平台09650-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 选题背景及意义 1.2国内外现状分析 1.3论文结构与章节安排 2 在线学习平台系统分析 2.1 可行性分析 2.2 系统业务流程分析 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 在线学习平台总体设计 …

nginx 常用优化配置项教程

本文目录 跨域配置 动静分离 反向代理-负载均衡 配置SLL证书 资源压缩 缓存机制 IP黑白名单 防盗链 大文件传输优化 跨域问题 产生原因 产生跨域问题的主要原因就在于 「同源策略」 &#xff0c;为了保证用户信息安全&#xff0c;防止恶意网站窃取数据&#xff0c;…

每日一题 2103. 环和杆 (简单)

简单题&#xff0c;直接统计就行 class Solution:def countPoints(self, rings: str) -> int:n len(rings) // 2cnt [[0, 0, 0] for _ in range(10)]for i in range(0, 2*n, 2):if rings[i] "R":cnt[int(rings[i 1])][0] 1if rings[i] "G":cnt[i…

阿里云多款ECS产品全面升级 性能最多提升40%

“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新&#xff0c;为客户创造业务价值。”10月31日&#xff0c;杭州云栖大会上&#xff0c;阿里云弹性计算计算产品线负责人张献涛表示&#xff0c;通过持续的产品和技术创新&#xff0c;阿里云发布了HPC优化实例等多…

conda命令克隆(复制)环境方法及问题解决

背景&#xff1a;与同事进行工作交接&#xff0c;在服务器上想直接拷贝他的环境过来&#xff0c;直接复制anaconda3/envs里的环境包过来后续安装包的时候由于路径是原来的路径会安装到对方环境里&#xff0c;因此使用conda命令来进行环境克隆。 &#xff08;Linux/服务器中&am…

【广州华锐互动】有机化合物结构3D虚拟展示帮助学生更好地理解和掌握复杂化学知识

随着科技的发展&#xff0c;我们的学习方式正在发生深刻的变化。其中&#xff0c;有机化合物结构3D虚拟展示作为一种新兴的教学方式&#xff0c;正在逐渐被广泛接受和应用。这种新型的展示方式对于提高学生的学习效率&#xff0c;增强学习体验&#xff0c;以及推动化学教育的发…

十六章反射与注解总结

16.1 反射 反射&#xff08;Reflection&#xff09;是指在运行时获取类的信息&#xff0c;并可以动态调用类的方法、访问或修改类的属性&#xff0c;以及构造对象的能力。 Java的反射提供了一套API&#xff0c;允许你在运行时检查类的结构、调用类的方法、获取和设置类的属性&…

curl(一)基础

一 基础入门 ① 本文讲解curl的版本 curl支持的协议 国密curl ② 升级curl 后续&#xff1a; 注意新版本的新特性备注&#xff1a; 升级的必要性 yum 升级 curl 源码编译安装curl ③ curl排错参数 1、-v 或 --verbose --> 重点 2、--trace 和 --trace-ascii --…

小红书薯多功能引流脚本,精准引流工具,内置私信点赞关注评论回复各项功能【引流软件+引流教程】

软件介绍&#xff1a; 多个高级功能精准引流 精准留痕引流&#xff0c;功能非常多 设备需求&#xff1a; 适用于安卓7.0版本&#xff0c;鸿蒙&#xff0c;模拟器均可使用 文章分享者&#xff1a;Linxiaoyu2022 文章的来源&#xff1a;vipwz.blog.csdn.net 有任何互联网问…

Java作业二

一、使用方法编写求圆面积和周长的程序&#xff0c;运行时提示输入圆半径&#xff0c;然后输出计算结果。运行效果如下图所示&#xff1a; import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input new Scanner(System.in);Syste…

安卓抓包之小黄鸟

下载安装 下载地址: https://download.csdn.net/download/yijianxiangde100/88496463 安装apk 即可。 证书配置:

SQL INNER JOIN 关键字(内部连接)

SQL INNER JOIN 关键字&#xff08;内部连接&#xff09; 内部链接INNER JOIN关键字选择两个表中具有匹配值的记录。 SQL INNER JOIN 语法 SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name table2.column_name; 注释&#xff1a;INNER JOIN 与 …

NEFU数字图像处理(4)图像几何变换

一、图像几何变换基础 1.1概述 定义&#xff1a; 使原始图像能够按照需要&#xff0c;产生大小、形状、位置等方面的几何变化 本质特征&#xff1a; 图像几何变换不是改变图像的像素值&#xff0c;而是改变像素所在的位置。 1.2相关概念 二维图像几何变换可通过矩阵线性变换来…

中心线提取的全卷积网络【IPMI 2019】

论文地址&#xff1a;Excellent-Paper-For-Daily-Reading/medicine at main 类别&#xff1a;医学 时间&#xff1a;2023/11/02 摘要 论文提出了一种将端到端可训练多任务全卷积网络(FCN)与最小路径提取器相结合的中心线提取框架。FCN同时计算中心线距离图和检测分支端点。…

深度学习之基于YoloV5的道路地面缺陷检测系统(UI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、道路地面缺陷检测系统四. 总结 一项目简介 基于YoloV5的道路地面缺陷检测系统利用深度学习中的目标检测算法&#xff0c;特别是YoloV5算法&am…

线性代数 第六章 二次型

一、矩阵表示 称为二次型的秩。只含有变量的平方项&#xff0c;所有混合项系数全是零&#xff0c;称为标准形&#xff1b;平方项的系数为1、-1或0&#xff0c;称为规范形。 二次型的标准形不唯一&#xff0c;可以用不用的坐标变换化二次型为标准形&#xff1b;二次型的规范形唯…

零代码编程:用ChatGPT批量删除掉对话音频文件的片头

一个文件夹里面有很多个mp3音频文件&#xff0c; 但是开头的片头太长了&#xff1a;40秒 怎么用ChatGPT批量去掉这些片头呢&#xff1f; 在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量删除掉对话音频文件开头的任务 &#xff0c;具体…