10 在ZStack里的按键驱动

【原创】zstack - 协议栈程序精简日志-按键驱动移植 【原创】zstack - 协议栈程序精简日志-按键驱动移植闲来无事测试zstack协议栈的记录。目的:去掉协议栈中无用的部分,精简协议栈程序。 我的板子上有两个按键,S1 对应P0.4,S2对应P0.5,正常状态下按键端口为高电平,按键按下时端口为低电平。本程序的按键检测使用P0外部中断的方式进行。配置为下降沿触发,当P0口出现下降沿中断时,中断程序内检测按键端口,如果端口输入低电平说明改端口的按 阅读详情

到目前我们可以通过设置任务的事件信息,从而让任务的事件处理函数触发。但除了事件外如还需要传递额外的数据(消息)给另一任务时,就需要用下面的函数功能:

OSAL/OSAL.h


typedef struct
{
  uint8  event; //记录消息的种类,如按键消息则为KEY_CHANGE
  uint8  status;
} osal_event_hdr_t; //每种消息都包括此结构体作头部



extern uint8 * osal_msg_allocate(uint16 len ); //动态分配消息所需的空间

extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); //回收消息的空间

extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); //设置指定号的任务发生event_flag事件. 即tasksEvents[task_id] |= event_flag;

extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); //发出消息到指定号的任务.  调用此函数时会设置指定号的任务发生SYS_EVENT_MSG.即osal_set_event( destination_task, SYS_EVENT_MSG )

 extern uint8 *osal_msg_receive( uint8 task_id ); //接收指定号的任务的消息

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在ZStack里对按键功能的封装在工程的HAL/include/hal_key.h里:

//表示按键的宏,与硬件没有直接关系
#define HAL_KEY_SW_1 0x01  // Joystick up
#define HAL_KEY_SW_2 0x02  // Joystick right
#define HAL_KEY_SW_5 0x04  // Joystick center
#define HAL_KEY_SW_4 0x08  // Joystick left
#define HAL_KEY_SW_3 0x10  // Joystick down
...

typedef void (*halKeyCBack_t) (uint8 keys, uint8 state);
extern bool Hal_KeyIntEnable;

//下需的函数我们不用直接调用, 这些函数应由hal层的任务来调用。当检查有按键按下时,会设置指定任务的事件(KEY_CHANGE),并把包含按键信息的消息发送到指定的任务.
extern void HalKeyInit( void );
extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback);
extern uint8 HalKeyRead( void);
extern void HalKeyPoll ( void ); 
   ...

///////////////////////////////////////////////////////////////////////////////////////
按键的初始化过程:

int main( void )
{
    ...
    InitBoard( OB_COLD );
    ...
    InitBoard( OB_READY );
    ...
}
void InitBoard( uint8 level )
{
    ...
    HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback);
    ...
}

void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)
{

  Hal_KeyIntEnable = interruptEnable; //用全局变量 Hal_KeyIntEnable存放按键是否用中断功能

  pHalKeyProcessFunction = cback; //用全局函数指针变量pHalKeyProcessFunction存放当按键状态发生变化时需要调用的函数的地址
    ...
}
////////////////////////


//任务需要接收按键消息的初始化
RegisterForKeys(mytask_id); //指定mytask_id任务号的任务接收按键的消息

uint8 RegisterForKeys( uint8 task_id )
{
    registeredKeysTaskID = task_id; //用全局变量registeredKeysTaskID来存放要接收按键消息的任务号
     ...
}

///////////////////////////
//按键在hal任务里的检查:
uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) // hal任务的事件处理函数
{
    ...
  if (events & HAL_KEY_EVENT)
  {
    HalKeyPoll(); //检查按键状态,并发出按键消息

    if (!Hal_KeyIntEnable)
    {
      osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
      //定时100ms后,给hal任务设置HAL_KEY_EVENT事件。也就是用定时器每隔100ms来检查按键.
    }
    ...
}

void HalKeyPoll (void)
{
  uint8 keys = 0;

    ...
  if (!Hal_KeyIntEnable)
  {
    if (keys == halKeySavedKeys)
    {
      return;
    }
    halKeySavedKeys = keys;
  }
  else
  {

  }
    ...
  if (HAL_PUSH_BUTTON1()) //检查按键是否按下 
  {
    keys |= HAL_KEY_SW_6;
  }

  if (keys && (pHalKeyProcessFunction))
  {
    (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
    //当有键按下时,需调用OnBoard_KeyCallback函数
  }
}


void OnBoard_KeyCallback ( uint8 keys, uint8 state )
{
  uint8 shift;
  (void)state;
    ...
  if ( OnBoard_SendKeys( keys, shift ) != ZSuccess )
  {
  }
  ...
}
////////////

typedef struct
{
  osal_event_hdr_t hdr; //每种消息都包含此头部
  uint8 state; // shift
  uint8 keys;  // keys
} keyChange_t;  //按键的消息类型

uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
  keyChange_t *msgPtr;

  if ( registeredKeysTaskID != NO_TASK_ID )
  {
    msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
    if ( msgPtr )
    {
      msgPtr->hdr.event = KEY_CHANGE;
      msgPtr->state = state;
      msgPtr->keys = keys;

      osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); //往指定的任务发出按键消息, 同时也会设置任务事件:tasksEvents[registeredKeysTaskID] |= SYS_EVENT_MSG. 接收消息的任务通过调用osal_msg_receive函数就可以得到msgPtr数据了
    }
    return ( ZSuccess );
    ...
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
因现用的开发板与TI原厂的开发板不同,所以又得修改下里面的代码了.

这里写图片描述

修改:

#define PUSH1_POLARITY    ACTIVE_LOW
#define PUSH2_POLARITY    ACTIVE_LOW

void HalKeyPoll (void)
{
  uint8 keys = 0;

  if (HAL_PUSH_BUTTON1())
  {
    keys |= HAL_KEY_SW_1;
  }
  if (HAL_PUSH_BUTTON2())
  {
    keys |= HAL_KEY_SW_2;
  }  


  if (!Hal_KeyIntEnable)
  {
    if (keys == halKeySavedKeys)
      return;
    halKeySavedKeys = keys;
  }
  else
  {

  }

  if (keys && (pHalKeyProcessFunction))
  {
    (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
  }
}

///////////////////////////
用两个按键分别控制一个led灯的亮灭
MyApp.c

#include "OnBoard.h"
#include "MyApp.h"
#include "hal_led.h"
#include "hal_key.h"


#define TIME_OUT_EVENT 0x4
#define TIME_LEN       2000

uint8  mytask_id; //用于存放本身的任务号


void MyApp_Init(uint8 task_id )
{
   mytask_id = task_id; 

   HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF);
   RegisterForKeys(mytask_id); //设置当前任务接收按键消息
}



uint16 MyApp_ProcessEvent(uint8 task_id, uint16 events )
{
  keyChange_t *key_evt;

  if ( events & SYS_EVENT_MSG ) //当有按键消息时,任务的事件会是SYS_EVENT_MSG
  {
    key_evt = (keyChange_t *)osal_msg_receive(mytask_id);

    if (key_evt->hdr.event == KEY_CHANGE)
    {                
        if (key_evt->keys  &  HAL_KEY_SW_1)
            HalLedSet(HAL_LED_1, HAL_LED_MODE_TOGGLE);

        if (key_evt->keys  &  HAL_KEY_SW_2)
            HalLedSet(HAL_LED_2, HAL_LED_MODE_TOGGLE);  
    }

     osal_msg_deallocate( (uint8 *)key_evt ); //回收消息的空间
  }    

  if (events & TIME_OUT_EVENT) //定时器的事件
  {
     ;
  }

  return 0;
}
【无线通信篇 | Zstack协议栈】CC2530 Zigbee Zstack协议栈组网项目及详细讲解篇 演示视频:https://www.bilibili.com/video/BV1Ew411o7Fp 物联网无线通信技术,ZigBee无线传感网络 CC2530最大的特点就是一个拥有无线收发器(RF)的单片机,既能实现单片机功能,也能实现无线传输 Zstack协议栈是ZigBee协议栈里的翘楚,是ZigBee组网的首选协议栈 项目实现功能: l 总共有三个端点,一个协调器和两个终端节点 l 终端节点1连接DHT11温湿度传感器,定时上传给协调器 l 终端节点2连接LED,可以... 阅读详情

相关推荐

zigbee之Zstack协议栈使用

zigbee;zstack

hfh8130的博客 7796

Z-Stack协议栈学习笔记3---按键系统代码分析

      按键和串口一样,都是开发过程中不可或缺的调试工具,因为为了后面的开发工作顺利进行研究了解按键的识别过程非常重要。Z-Stack的按键系统非常简单,首先执行初始化,这个在hal初始化函数中。然后执行按键配置HalKeyConfig(),这个函数执行流程是main()--->InitBoard()--->HalKeyConfig(),这个函数关闭了按键中断和按键回调函数:   ...

stone8761的专栏 2787

ZStack Cloud4.2.10单节点部署实战指南

本文提供ZStack Cloud 4.2.10单节点部署的完整实战指南。从环境准备、系统安装、网络配置到控制台初始化,详细解析了每一步操作要点与常见问题,帮助用户快速搭建轻量级私有云平台,并成功创建第一台云主机。

weixin_29268637的博客 309

Z-stack实训按键单播控制LED

无线传感网络课程 - 实训报告 文章目录无线传感网络课程 - 实训报告功能需求实现过程终端节点(开关模块)协调器(灯模块)试验现象实训心得 功能需求 基于 Z-Stack 协议栈完成一个 Zigbee 单播通信实验。 例:按键无线控制 LED。 取两块 Zibgee 实验板,当按下终端节点(开关模块)上的 SW2 按键时,向协调器(灯模块)单播发送数据。协调器(灯模块)收到数据后,切换 LED1 状态。 实现过程 拷贝 SampleApp 工程,并改名为 “按键无线控制LED” 。 打通串口,程序调

MCU-51王的博客 2893

基于ZStack 2.5.1a的CC2530 ZigBee节点开发实战:从GenericApp工程看懂数据收发与任务处理

本文详细解析了基于ZStack 2.5.1a协议栈的CC2530 ZigBee节点开发实战,重点通过GenericApp工程剖析数据收发与任务处理机制。从开发环境搭建、OSAL任务调度系统到数据收发实现,全面讲解ZigBee节点开发的核心技术,并提供典型功能扩展和调试技巧,帮助开发者快速掌握ZStack协议栈的应用。

weixin_33737134的博客 421

Win10系统下AppScan 10.0.0安装破解全流程(附百度网盘资源)

本文详细介绍了在Windows 10系统上安装和配置AppScan 10.0.0进行Web漏洞扫描的完整流程。内容涵盖环境准备、分步安装、核心文件部署、许可证配置及首次扫描实践,旨在帮助开发人员和安全爱好者快速搭建专业的Web应用安全扫描环境,并提升扫描效率。

u8v9w0x1y的博客 364

stm32之电子按键

一端接GPIOx一端接地。GPIOx设置为上拉输入模式,当按键按下时GPIOx读取的为低电平,当按键弹起时GPIOx读取的为高电平。按键开关内部构造主要就是金属弹簧,当按下按键时弹簧片与电路短接,当按键弹起时弹簧片与电路为开路状态。

RONG_YAO的博客 2618

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子

Hi20240217的博客 1157

Zstcak 按键实验

1、参考前人的资料,站在巨人的肩膀上。 https://blog.youkuaiyun.com/m0_38064214/article/details/77422310 zstack按键实验 原理讲的很清楚 https://blog.youkuaiyun.com/u013162035/article/details/80964704 zstack按键 修改步骤很清楚 2、另外需要修改 ZMain On...

u013065573的专栏 499

安装部署 Guacamole 远程桌面网关

Guacamole 是Apache基金会提供的一组基于web的远程桌面访问工具,支持 VNC、RDP、SSH、 Telnet 等协议,支持远程透传音视频。

UsamaBinLaden6976498的专栏 1963

Windows下Delft3D安装全攻略:从申请许可到编译运行(避坑指南)

本文详细解析了Windows系统下Delft3D的完整安装流程,涵盖环境准备、许可获取、源码编译到性能调优的全过程。针对中国用户常见的网络问题和系统兼容性痛点,提供了经过验证的解决方案,特别强调Intel Fortran编译器匹配、环境变量配置等关键步骤,帮助水利工程师高效完成这一水动力学模拟工具的部署。

weixin_28736355的博客 546

ZigBee Z-Stack 3.13 按键驱动0-总

【 源码、文档、软件、硬件、技术交流、技术支持,入口见文末】

拿破仑940911 1161

【从零开始玩量化7】easyTrader: 自动化(程序化)交易利器

前面的文章,我们介绍了数据获取工具AKShare, 量化回测工具backtrader等,这一篇,介绍程序化交易工具easyTrader。作者网名食灯鬼,目前项目在Github上的star数已经有6.7k。这可能是目前,开源能找到的,最好用的程序化交易库了。本文介绍了easyTrader的简单用法,这个包还有很多功能,后续再继续写文章探究。

量化投资助手的博客 1万+

Zstack3.0添加或更改按键引脚问题汇总

按键驱动的更改坑还是挺多的,需要细心的追根溯源。

weixin_44624949的博客 445

从FrSky到TBS:深度解析航模2.4G遥控协议江湖史(附ELRS高频头改装指南)

本文深度解析了航模2.4G遥控协议的技术演进史,从FrSky ACCST的兴衰到TBS Crossfire的崛起,再到开源协议ExpressLRS的革命性突破。文章不仅对比了各协议在延迟、距离与抗干扰能力上的技术内核,还提供了为多协议遥控器加装TBS Crossfire高频头的实战改装指南,帮助玩家打通协议壁垒,提升飞行体验。

weixin_29193259的博客 736

工业预测性维护实战:振动分析+Transformer预警系统构建指南

摘要:本文聚焦工业设备预测性维护难题,提出基于振动分析与Transformer模型的全栈解决方案。通过低成本硬件选型(单传感器¥380)实现设备振动信号实时采集,利用边缘计算单元完成特征工程(RMS、峰度、峰值频率提取),并在云端部署Transformer时序模型进行异常预警。某风电龙头企业实践显示,系统将故障误报率从38%降至6%,维护成本降低58%,非计划停机时长减少87%。文中提供完整的边缘端特征提取代码、云端模型架构及实施流程,适配ISO 13373振动分析标准,为制造业设备健康管理提供可复用的工程

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 625

zstack 的osal操作系统中按键配置驱动详解

1、背景 最近接触CC2530芯片,zstack协议栈的OSAL操作系统初看之下,一阵晕。现在先对按键的操作逻辑进行分析。 2、按键初始化、配置、中断触发、消息发送、处理流程 2.1初始化 zmain.c:main() --> hal_drivers.c:HalDriverInit() --> hal_key.c:HalKeyInit(); 2.2 配置 main.c --> OnBoard.c:InitBoard( OB_READY ); //配置为按键中断类

zhejfl的博客 725

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集)

随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。

YOLO 1546

ZigBee TI ZStack CC2530 3.16 按键驱动03-移植及使用

【 源码、文档、软件、硬件、技术交流、技术支持,入口见文末】

拿破仑940911 3500

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[蓝点ZigBee] Zstack 之按键驱动以及控制LED灯 ZigBee/CC2530 视频资料

这一节主要演示如何在Zstack 下根据板子的不同修改按键驱动,实际演示的时候代码跳动比较多,建议大家除了看视频资料以外,还需要在网上找一下相关资料进一步学习。视频总览:http://bphero.com.cn/forum.php?m ... d=15&extra=page%3D1学习最好按照视频总览中的顺序有序学习与该节视频相关的问题讨论可以回帖,一贴一视频,一专题!目前讨论回帖只针对已...

weixin_30294021的博客 302

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

CC2530使用ZStack实现点对点通信操作指南

介绍如何在CC2530上利用zstack协议栈完成点对点通信配置与开发,涵盖关键步骤与常见问题处理,帮助开发者快速掌握zstack在实际项目中的应用。

weixin_33375360的博客 827

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

解决CC2530 Zigbee Zstack 3.0协议栈无法驱动KEY按键BUG

解决ZStack无法驱动按键KEY的BUG

Shuger_Money的博客 305

ZigBee TI ZStack CC2530 5.6 实例(三)多功能按键01-实现

【 源码、文档、软件、硬件、技术交流、技术支持,入口见文末】

拿破仑940911 2457

Zstack协议栈(二)

Components 文件夹: 存放协议栈库文件的,里面放了一些我们用到的 ZDO,driver,hal,zcl 等库的代码。Documents 文件夹: 存放 TI 的开发文档的,里面很多都是讲述协议栈的 API 的。Proiects 文件夹: 存放的是 TI协议栈的例子程序的,其中 ProiectslzstacklSamples 文件夹是我们常用的 ZStack 应用程序路径。Tools 文件夹:存放 TI 的例子程序配套的一些上位机程序和调试工具。

weixin_63926501的博客 2096

zigbee协议栈之按键点灯

Zstack中的事件,其实就是一个无符号16位的整数其中的一个bit位(事件其实就是用一个整数的不同的bits位来表示不同的事件)。自定义应用层事件,只需要在GenericApp.h(LINE14)文件中,新增一个与其他事件不冲突的宏即可。ZigBee是一种近距离、低复杂度的双向无线通信系统,主要用于距离短、功耗低、传输速率不高的电子设备之间进行数据传输,且具有低功耗、低成本、大容量、时延短、可靠性高以及网络拓扑结构灵活的特点。Zigbee本质就是无线设备之间的一种通信方式。

m0_61973119的博客 1740

Zigbee Zstack2.5.1a使用rfx2401+cc2530

纠结了好几个月的问题,今天终于搞定了,剩下的就是开发应用层了,所以把wo

不悔的青春 5152
上一篇: 09 在ZStack里的定时器应用
下一篇: 11 在ZStack里实现uart数据输出功能
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值