zigbee—CC2430—常规报错修改

合集下载

zigbeeCC243031模块使用说明书

zigbeeCC243031模块使用说明书

nd注意事项:1,使用时请轻拿轻放,切勿扔摔。

2,轻拨轻推电源开关。

3,电池电压最好不要低于2.7V,因为cc2430芯片分辨哪个按键被按下时,是通过模拟量来分辨的,如果电压低于2.7V时,容易造成按键分辨不准确。

虽说CC2430芯片手册上说可以在2.0V工作,但那是最低电压,最好不要在芯片的最低电压点来工作。

最好使用碱性干电池,如南孚牌的等等。

4,做按键闪灯实验时,请不要太快速连续按键,按键动作尽量到位可靠,连续按键的间隔时间最好不少于5秒。

5,当使用电池供电的时候(也就是模块上的那个蓝色的开关按下的时候),请不要用仿真器给模块供电。

6、最好也好多看看光盘内的资料,在改动跳线帽等相关硬件连接的时候,请先多看看原理图。

最好在你熟悉了模块之后再改动跳线帽。

7、一定要顺着本模块使用说明书pdf文档仔细往下看,请不要急于求成,一定要仔细的照着本文档仔细操作,切不可急躁!!!安装软件篇:一、安装开发环境:在光盘cc2430模块资料\软件工具\IAR730目录下有730b注册机,具体用法看其里面的说明文本文件。

下面就安装过程做一简要介绍:在光盘cc2430模块资料\软件工具\IAR730目录下,双击EW8051-EV-730B.exe进入画面:点击next点击Accept:此时需要输入License,那么先解压730b注册机文件(在软件工具目录下),双击其里面的iarid.exe,可得到本机的ID,将此ID号保留好,等下有用。

然后在右击key.cmd文件,在弹出的下拉菜单中选择编辑,然后选择文本编辑器。

将上面得到的本机ID号替换掉key.cmd文件中的相应部分,也就是介于@IARKG.exe 和>key.txt之间的部分。

保存文件退出。

再双击key.cmd。

然后再打开key.txt文本。

其中的第二个Installserial就是需要的License。

将其填入即可Next将key.txt文本第二个key:之后的一段复制粘贴到License Key内然后一路Next即可完成安装。

基于zigbeecc2430的土壤含水率监测系统设计

基于zigbeecc2430的土壤含水率监测系统设计

基于Z i gB ee C C2430的土壤含水率监测系统设计张粤h,倪桑晨2,倪伟协(1.淮阴工学院a.计算机工程学院;b.电子与电气工程学院,江苏淮安223003;2.东南大学信息科学与工程学院,南京211189)摘要:针对农田土壤环境参数大滞后及大惯性的特点,基于低功耗Z i gB ee C C2430无线通信技术,设计了土壤含水率监测系统。

通过运用无线传感器智能信息处理技术及数据通信技术,使得监测系统的自动化与监测水平得到提升。

该系统采用星型拓扑结构组网,通过在监测区域部署网络节点,将监测数据汇集到监测中心,实现统一的数据管理和Z i gbee网络的路由监测功能。

给出了系统硬件和软件实现方法,包括无线传感器节点设计、数据采集、传输及通信等模块的实现原理。

遵循模块化设计思想,传感器和功能模块可组合配置,通用性强。

对于农田土壤含水率的监测实验结果表明,该系统性能稳定,能够实现数据采集、传输及显示,可广泛应用于各领域的环境参数自动监测。

关键词:无线传感器网络;C C2430;土壤含水率;监测’中图分类号:S152.7;S126文献标识码:A文章编号:1003—188X(2012)02—0189-040引言随着精准农业的发展和人们对农产品安全的重视,农田土壤信息(如含水率)的实时获取变得越来越重要。

土壤含水率是地表和大气之间通过蒸发的方式进行能量和水分交换的主要控制因子,很大程度上影响农作物的健康状况¨之J。

现有的监测系统大多采用有线数据采集及传输,其缺点是安装和布线繁琐且工作量大,组网复杂,设备移动性差以及成本偏高,无法实施精确有效的监测,甚至在有些场合难以实现∞’4J。

无线传感网络是一种集信息采集、处理和无线传输于一体的先进监测技术,在诸多领域(如国防军事、环境监测、工程安全、农业温室、畜禽养殖场和食品加工等领域"一刊得到了一定的应用。

已经有国内外科研人员将其应用于不同农业环境监测领域哺叫…,但从国外进口的同类设备及控制系统价格昂贵,运行成本高,不利于在国内推广。

zigbee入门指导

zigbee入门指导

Zigbee入门指导(二)——运行Zigbee例程在Zigbee入门指导(一)中讲解了基于CC2430的Zigbee 开发环境的搭建,安装完Ti的协议栈后,里面有多个例程,帮助用户入门及作为自己工程的基本框架。

在Zigbee入门指导(二)中,我们将通过演示执行相关的例程,了解Zigbee应用的启动流程(不是Zigbee网络的启动流程),了解运行一个自定义Zigbee工程所要作的软件方面的改动和工程选项的配置。

所用的开发套件为无线龙的套件。

一、修改HALHAL及所谓的Hardware Abstration Layer,通俗的了解即为开发板的硬件驱动,由于所用的是无线龙的开发板,与Ti的原装开发板有差异,需要对协议栈自带的HAL进行修改。

HAL文件存放在目录<Components/hal>中,里面有<common>、<include>、<target>三个目录,<common>中定义的与外设无关的硬件操作,<include>存放的是头文件,而<target>存放的是目标文件,里面根据目标板的不同分为<CC2430BB>、<CC2430DB>、<CC2430EB>。

所用的无线龙的开发板和CC2430EB最为相似,故修改<CC2430EB>中的内容。

按键操作几乎在每个例程中都会用到,故此处以按键驱动的修改为例,演示HAL的修改。

先了解下Ti和无线龙扩展板的不同之处。

Ti的CC2430EB 原理图在Ti文档SWRU133.pdf(位于SWRU133.zip中)。

Page29是按键电路的原理图,如图1图1(左上角是元件图)CC2430EB的按键其实是摇杆,上下左右四个方向和电阻网络相连,通过放大电路送到CC2430的P0.6脚,经AD采样后判断摇杆摆向哪个方向,按键编号为SW1~SW4摇杆也可像普通按键一样按下,产生一个直流电平变化,接到P0.5脚,按键编号为SW5。

代码错误调试:解决代码错误和异常的常见技巧和方法

代码错误调试:解决代码错误和异常的常见技巧和方法

代码错误调试:解决代码错误和异常的常见技巧和方法代码错误调试是编程过程中非常常见的一项工作。

当程序运行出现异常或者出现错误时,我们需要采取一些技巧和方法来找到问题并进行修复。

下面是一些常见的解决代码错误和异常的技巧和方法。

1.查看错误信息:当程序出现错误时,通常会有错误信息提示。

这些错误信息可以帮助我们更快地定位问题,了解错误的原因。

因此,首先需要认真查看错误信息,明确问题所在。

2.使用调试器:调试器是一种强大的工具,可以帮助我们逐步执行程序并查看程序在每一步的状态。

通过设置断点、单步调试等功能,我们可以更直观地观察程序运行的过程,找到问题所在。

3.打印调试信息:在程序中适当地插入一些打印语句,输出程序执行过程中的变量值、状态等信息。

通过查看这些信息,可以更清晰地了解程序的执行流程,找到可能出现问题的地方。

4.缩小范围:当程序出现问题时,可以尝试将问题缩小范围,减少程序的复杂度。

例如,可以将程序拆分成几个部分进行分别测试,找出具体出现错误的部分。

5.查看日志:程序通常会有日志输出,记录程序运行的信息和状态。

通过查看日志文件,可以找到程序在哪个地方出现了问题,从而更快定位和解决错误。

6.搜索引擎和社区:在遇到问题时,可以通过搜索引擎和技术社区寻求帮助。

很多时候,别人可能也遇到过相似的问题,通过搜索可以找到解决方法或者相关的讨论。

7.检查语法错误:有些错误是由于语法错误导致的,例如拼写错误、符号错误等。

在遇到问题时,可以先仔细检查程序的语法,确保没有简单的语法错误。

8.更新软件和库:有些错误是由于软件或者库版本不兼容或者存在bug导致的。

在出现问题时,可以尝试更新相关软件和库,查看是否有已知的解决方法。

9.参考文档和教程:在解决问题时,可以参考官方文档和教程,查看相关的使用方法和示例代码。

通过学习文档和教程,我们可以更深入地了解程序的原理和使用方法,更好地解决问题。

10.请教他人:在遇到棘手问题时,可以向他人寻求帮助。

CC2430开发环境IAR使用说明V2

CC2430开发环境IAR使用说明V2

CC2430开发环境IAR使用说明1.软件安装首先要安装CC2430的开发环境IAR7.2H,在安装开发环境的时候要注意:为了正常安装软件,必须使用keygen.exe程序这时主要用到License+Key,在Hardware ID的时候注意要把小写字母改成大写,比如0x28c9e改成0x28C9E,如果是数字就不用改了,然后Generate一下,就可以用了。

这样就可以安装EW8051-EV-720H.EXE程序了,把License用上就可以完成安装。

开发环境就安装好了。

然后根据Chipcon IAR IDE usermanual_1_22.pdf说明对CC2430编程操作!2.Zigbee精简协议打开ZigBee精简协议(msstatePAN.zip)里面的程序\msstatePAN\obj\compiletest\iar51_cc2430\ compiletest.eww,应用实例compiletest.eww打开后有三种器件的选择:一种是协调器(COORD)、一种是路由器(ROUTER)、另外一种是(RFD),分别用IAR 7.2H直接对它们编译和程序下载。

对于ZigBee精简协议的研究必须仔细阅读协议说明msstate_lrwpan_doc_release.pdf,该文挡详细介绍了ZigBee精简协议。

3.软件设置及程序下载打开IAR Embedded Workbench for MCS-51 ,按Alt+F7打开项目工程的选项(也可以通过右击工程名选择打开,或者选择Project中的Options来打开);选择Options中的Linker选项,在Format栏选中Debug information for C-SPY。

选择Debugger选项中的Setup项;在Driver选项中的下拉框中选择Chipcon,而非Simulator;从而完成编译环境的设置,你现在就可以使用编程器进行在线下载程序或者在线仿真调试了。

基于CC2430的ZigBee无线数传模块的设计和实现_尹应鹏

基于CC2430的ZigBee无线数传模块的设计和实现_尹应鹏

ElectronicComponent&DeviceApplicationsApr.20082008年4月0引言现在,无线通信技术已经成为人们日益关注的问题之一。

ZigBee采用IEEE802.15.4标准,利用全球共用的2.4GHz公共频率进行无线测量和系统监控,而且具有明显的低成本、低功耗、网络节点多、传输距离远等优势。

目前,ZigBee技术已被视为替代有线监视和控制网络领域最有前景的技术之一。

为此,本文论述了一种基于CC2430芯片的无线数据传输模块的设计方法。

1ZigBee简介ZigBee是一种基于IEEE802.15.4标准的短距离、低速率无线网络技术.该无线连接技术主要解决低成本、低功耗、低复杂度、低传输速率、近距离的设备联网应用,主要用于无线传感器网络和测量控制方面。

国际上,IEEE802.15.4工作组及ZigBee联盟共同致力于该无线连接技术的推广工作,其中,IEEE802.15.4工作组主要负责制定ZigBee物理层及MAC层协议,其余协议主要参照和采用现有标准,以便于今后不同厂商设备的互联互通;ZigBee联盟则负责高层应用及市场推广工作。

于2002年成立的ZigBee联盟如今已经吸引了上百家芯片公司、无线设备公司加入。

此外,Freescale、TI等国际巨头也都已推出了比较成熟的ZigBee开发平台。

ZigBee标准是基于802.15.4协议栈而建立的,它具备了强大的设备联网功能,并支持三种主要的自组织无线网络类型,即星型结构、网状结构(Mesh)和簇状结构(Clustertree),其中网状结构具有很强的网络健壮性和系统可靠性。

ZigBee协议比蓝牙、GSM、Wi-Fi更加简单实用,表1列出了ZigBee同其它无线网络的比较。

2总体设计为了进行模块化的设计,本文采用了基于通用异步收发模式(UART)接口的设计,以便方便的通过此接口将STIM(智能传感器接口模块)和该无线模块连接在一起,从而发送用户的数据。

基于CC2430的ZigBee无线传感器网络管理系统的设计与开发

基于CC2430的ZigBee无线传感器网络管理系统的设计与开发
B s . , 计 了 一 套 基 于 C 2 3 的 Zg e ai 6 0 设 c C 40 i e无 线 B
接 , 现远 程控 制 . 于 I E 0 .5 4技 术 标 准 的 实 基 E E8 2 1.
Zg e iB e体 系 结 构 如 图 1所 示 …
Zg e 应 用 层 iB e
文 章 编 号 :0 2—5 3 2 1 01—0 7 10 6 4( 0 0) 0 3—0 3
基 于 C 23 C 4 0的 Z g e iB e无 线 传 感 器 网 络 管 理 系 统 的 设 计 与 开 发
王 亭 岭 ,陈 建 明 ,熊 军 华
( 北水利水 电学院 , 南 郑州 401) 华 河 5 0 1
自动恢 复 和高 级 电源 管 理 等 优 点 . 整 个 网络 范 围 在 内 , 节点 之 间可 以进行 通 信 , 各 每个 网络 节 点 间的距
离可 以从 标准 的 7 扩展 到 几 百 米 , 至几 千 米 , 5m, 甚 整 个 Zg e i e网 络 还 可 以 与 现 有 的 其 他 各 种 网 络 连 B
Z g e 网络 层 iB e
I EEE 0 1 4 M AC 8 2. 5.
I E 8 2 1 . I E 0 .5 4 EE 0 4 l E E 8 2 1 . 5
8 89 5 I Hz PHYl 4 6 /1 V l 2. GHz PHY
传 感器 网络 管理 系 统 , 将 其 应 用 在 电力设 备检 修 并 时接地 线路 可靠 接 地与 管理 中. 结 构如 图 2所示 . 其 传 感 器 节 点 ( F 用 于采 集 监 测 信 息 并 发 送 R D) 给 网络 协调 器 ( F ; F F D) F D用 于 建立 一 个 新 的无 线 传感 器 网络 , 收 信 息 , 送 控 制命 令 ; 接 发 监控 中 心通 过 R S一2 2串 口实 现 与 网络协 调器 的通 信 . 3

CC2430芯片简介

CC2430芯片简介

有人形容高尔夫的18洞就好像人生,障碍重重,坎坷不断。

然而一旦踏上了球场,你就必须集中注意力,独立面对比赛中可能出现的各种困难,并且承担一切后果。

也许,常常还会遇到这样的情况:你刚刚还在为抓到一个小鸟球而欢呼雀跃,下一刻大风就把小白球吹跑了;或者你才在上一个洞吞了柏忌,下一个洞你就为抓了老鹰而兴奋不已。

CC2430芯片简介CC2430/CC2431是芯片巨人TI公司收购无线单片机公司CHIPCON后推出的全新概念新一代ZigBee无线单片机系列芯片。

CC2430是一款真正符合IEEE802.15. 4标准的片上SOC ZigBee产品。

CC2430除了包括RF收发器外,还集成了加强型8051MCU、32/64/128 KB的Flash内存、8 KB的RAM、以及ADC、DMA、看门狗等。

CC2430可工作在2.4 GHz频段,采用低电压(2.0~3.6 V)供电且功耗很低(接收数据时为27 mA,发送数据时为25 mA),其灵敏度高达-91 dBm、最大输出为+ 0.6 dBm、最大传送速率为250 kbps。

CC2430的外围元件数目很少,它使用一个非平衡天线来连接非平衡变压器,以使天线性能更加出色。

电路中的非平衡变压器由电容C309、C311和电感L301、L302、L303组成,整个结构可满足RF输入/输出匹配电阻(50 Ω)的要求。

内部T/R交换电路用于完成LNA和PA之间的交换。

R200、R201为偏置电阻,其中R200主要用于为32 MHz的晶体振荡器提供合适的工作电流,通过R201可为芯片内部射频部分提供精密电流参考源。

选用一只32 MHz的石英谐振器和两只电容(C210、C211)可以构成32 MHz晶体振荡器电路。

芯片内部的电压稳压器可为所有1.8 V电压的引脚和内部电源供电,C214、C209、C200等为去耦电容,主要用于电源滤波,以提高芯片的工作稳定性。

CC2430芯片的主要特点如下:◇内含高性能和低功耗的8051微控制器核;◇集成有符合IEEE802.15.4标准的2.4 GHz的RF无线电收发机;◇具有优良的无线接收灵敏度和强大的抗干扰能力。

TI的ZigBee芯片cc2430

TI的ZigBee芯片cc2430

百度首页 | 登录新闻网页贴吧知道MP3图片视频百科cc2430帮助添加到搜藏编辑词编辑词条条CC2430是一颗真正的系统芯片(SoC)CMOS解决方案。

这种解决方案能够提高性能并满足以ZigBee为基础的2.4GHz ISM波段应用对低成本,低功耗的要求。

它结合一个高性能2.4GHz DSSS(直接序列扩频)射频收发器核心和一颗工业级小巧高效的8051控制器。

CC2430的设计结合了8Kbyte的RAM及强大的外围模块,并且有3种不同的版本,他们是根据不同的闪存空间32,64和128kByte来优化复杂度与成本的组合。

CC2430的尺寸只有7×7mm 48-pin的封装,采用具有内嵌闪存的0.18&micro;m CMOS标准技术。

这可实现数字基带处理器,RF、模拟电路及系统存储器 整合在同一个硅晶片上。

MCU和存储器子系统针对协议栈,网络和应用软件的执行对MCU处理能力的要求,CC2430包含一个增强型工业标准的8位8051微控制器内核,运行时钟32MHz。

由于更快的执行时间和通过除去被浪费掉的总线状态的方式,使得使用标准8051指令集的CC2430增强型8051内核,具有8倍的标准8051内核的性能。

CC2430包含一个DMA控制器。

8k字节静态RAM,其中的4k字节是超低功耗SRAM。

32k,64k或128k字节的片内Flash块提供在电路可编程非易失性存储器。

CC2430集成了4个振荡器用于系统时钟和定时操作:一个32MHz晶体振荡器,一个16MHz RC-振荡器,一个可选的32.768kHz晶体振荡器和一个可选的32.768kHz RC 振荡器。

CC2430也集成了用于用户自定义应用的外设。

一个AES协处理器被集成在CC2430,以支持IEEE802.15.4 MAC 安全所需的(128位关键字)AES的运行,以实现尽可能少的占用微控制器。

中断控制器为总共18个中断源提供服务,他们中的每个中断都被赋予4个中断优先级中的某一个。

基于zigbee协议和CC2430的立体闹钟模型方案设计

基于zigbee协议和CC2430的立体闹钟模型方案设计
特 点 明显 。C 2 3 是 一 颗 真 正 的 系 统 芯 片 (o ) M O C 40 SC C S
( C 26 L D184),控制按键 ,DS 2 8 7 1C 8 时钟芯片 ,语 音
芯 片 ( S 4 0),以及 一 个 D 1B 0 度 传 感 器 指 示 ID10 S 8 2温 室 内温 度 。 DS 2 8 始 终 芯 片 能 够 自动 产 生 世 纪 、年 、月 、 1C8 7
Zg e联 盟 于 2 0 年 1月 推 出 了基 于 IE 8 21 . i e B 04 2 E E 0. 4 5
信号 ,如 “2 2 ” ,问题无法设置很多个 ,是 一个 简 1+ =
单的问题列表 ,循 环使用 ,不 回答 问题 ,无法停止闹钟 信号 ;此外还具有定时 自动放下窗帘功能 。 闹钟三大部分硬件设计 :
解决方案 ,用于实现嵌入式zg e应用 的片上 系统。它 i e B
支 持 2 G zI E 0 . . Zg e协 议 。这 种 解 决 方 案 . H E 821 4 iB e 4 E 5 /
能够提高性能并满足 P i e为基础的2 G M波段 AZg e B . Hz S 4 I
g 3

] C N I ≤Y 技术应用 T H O j E 0
支持 “ 一线总线 ”接 口的温度传感器 ,可以直接将温度
转化成 串行数字信号供处理器处理 。
I D 0 0 音 芯片工作 电压 3 S 4 0语 V,单片 录音8 1 分 ~6
钟 ,音质 好 ,适 合 闹钟 使 用 。 室 内照 明 电灯 控制 部 分 : 晶 闸 管 调 光 电路 电 路 采 用 M OC 0 1 向 晶 闸 管 3 2双

基于CC2430的ZigBee无线通信模块设计

基于CC2430的ZigBee无线通信模块设计
紧 密联 系在 一 起 , 层 为 其 上 一 层 提 供 特 定 的 服 务 。 每
通信 的高频 电路 , 以被看做 高性 能 的单片机 , 是 又 可 但
区别于 常规 的单片机 。其构 成特 色除 具备 一般单 片机
的性 能外 又加 入 了 自己本 身应 用 的特 别 电路 , 是一 个
中 图分 类 号 :T 2 N9 文 献 标 识 码 :B .
I ZiB e技 术 ge
应 用层 和安 全 服 务 提 供 层 。Zg e iB e堆 栈 框 架 如 图 1
所示 。
Zg e 技 术是一 种新 兴 的低 功 耗 、 距离 、 i e B 短 低功 率 无线 通信组 网技术 , 是一种介 于无 线标记 与蓝牙 技术 之 间而提 出的技 术 , 目的 是 为 了使 用 近距 离 无 线通 信 领 域 。每种通 信 都有 特 殊 的通 信 协议 , 同样 Zg e 技 术 i e B 也 有着 自己的无 线通 信标 准 。监 测 区域 内数 以千 计 的 微 小的传感器 通信 , 是通过彼 此间的相 互协调 作用来 实 现 的 。Zg e 的无线数据 传输 网络 平 台由 6 0 i e B 50 0个 无 线数 传模块 构 成 , 其监 测 空 间很 广 阔。在 现实环 境 中, 建立的此种 网络平 台类 似 于移动 通信 的 C) 网 M, 移 动通信 网站 中的一个基站 , 在整体 的网络范 围内, 彼此 之间的相互通 信可 以互 通 , 并且 Z B e的整体 网络本身 ie g
还可以与其他 的各种 网络进行连接L ] 1。 Zg e iB e协议栈 是 由层 次 划分 而成 的 , 与 层 之 间 层
当。Zg e 堆 栈 的 建 立 是 以 I E 0 . 5 4的标 准 iB e E E 82 1.

基于CC2430芯片的ZigBee在智能交通系统中的应用

基于CC2430芯片的ZigBee在智能交通系统中的应用



- - - 一 _ _ _

- 一






z e 由节 点・ 蜘 路
Z ̄ e路 由节点・ oe
圈 困 圜 园
《…












z ∞路 由节点・

I ]望 ・
基于ZGBE 无线 网络平 台的智能红绿灯 控制系统, I E 系统具有 以下几个特点: () 1 须挖路 布设 控制线路 ,各设备 之 间实现无 线 自动 组 网连接, 既降低了系统安装成本, 更重 要的是避免 了传 统 安装 方式 对交 通干 扰所 带来 的经济 损 失 。随时 可 以施 工 。而 且,也避免 了由于城市快速 发展,道路拓展等 变化 对原 有预埋 管线的干扰 。由于系统没有地面控 制箱和 控制 线路,避免 了恶意破 坏,大大减少了维护成本。
型, 即星 型结 构 、网状 结构 ( s ) Me h 和簇 状结 构( u t r Clse
t e ,特别是网状结构,具有很强 的网络 健壮性和系统可 r ) e
靠性。
灯状 态等相 关 交通信 息 ;根据 实 际需要 修 一 ~ 通状 况一 、红绿
改、配置道 口机 的参数,对信号 自动 控制系统 道 口机实现
7 5 2 0 .‘ 东 通信 技 术 0 72广
维普资讯
技 术 交 流
Zg e 是一种 无线连接技 术的商业化命 名,该无线 iB e 连接技术 主要解决低成本 、低功耗 、低复杂度 、低传输速 率 、近距离 的设备联 网应用。
Zg e 标 准 基 于 8 2 1 .协 议 栈 而 建 立 , 具 备 了 强 iB e 0 .54 大 网络 类 种

基于CC2430的Zigbee无线数传模块设计

基于CC2430的Zigbee无线数传模块设计

p c a e,t o i r e r t isc mmu i a in dit n e a d sa ii lw o rd s i to n e e i n wi ih s nstv n c to sa c n tb lt o p we ispain a d r c pt t h g e i — y, o h i i whih c n be u e d l ta l w o t t y, c a s d wi e y a o c s.
fa wo k o e m o u e ic u i h un to fe t a t n t ic i a d t e PC e t o fg r to r me r ft d l n l d ng t e f cin o a h p rs i he cr u t n h h t s/c n iu a in s h r . a y t sswe e d ne p a tc l n e fe h y tm s a wie e s s n o ewo k wi ih o wa e M n e t r o r c ia l a d v ri d t e s se i r ls e s r n t r t h【 y i h g
无线 标记 技术 和 蓝牙 技术 之 间 的技 术方 案 。主要用
随着传感 器 技术 、 S D P技 术 、 计算 机技 术 和 芯 片 技 术 的快 速 发展 , 线 传 感 器 网 络 和 短 距 离无 线 个 无
人 局域 网技术 得 到 了飞 速发 展 。世 界 各大 半导 体公 司 都相继 研 发 出了基 于 Zg e 术 的 S C芯 片 , iBe技 O 使 得 Zge i e技术 能 够 在 很 小 的 空 问 以很 高 的性 能 得 B 以实现 , 在 各 方 面 应 用 中越 来 越 体 现 出其 优 势 。 并

关于在CC2430中基于ZIGBEE2006的串口通信

关于在CC2430中基于ZIGBEE2006的串口通信

就跟我自己承诺的一样,我会发一篇关于zigbee串口通信的。

虽然这个是我五月份就做的东西,但是现在看来,还是有那么一群人对这个纠缠不清。

但是,这个其实很简单。

事实上zigbee协议栈2006是有自己集成好了串口函数的,就在MT层的SPIMgr.c文件里面。

这里是一部分的源码:void SPIMgr_Init (){halUARTCfg_t uartConfig;App_TaskID = 0;uartConfig.configured = TRUE;uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;uartConfig.flowControl = SPI_MGR_DEFAULT_OVERFLOW;uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;uartConfig.intEnable = TRUE;#if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc = SPIMgr_ProcessZToolData;#elif defined (ZAPP_P1) || defined (ZAPP_P2)uartConfig.callBackFunc = SPIMgr_ProcessZAppData;#elseuartConfig.callBackFunc = NULL;#endif#if defined (SPI_MGR_DEFAULT_PORT)HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig);#else(void)uartConfig;#endif#if defined (ZAPP_P1) || defined (ZAPP_P2)SPIMgr_MaxZAppBufLen = 1;SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;#endif}void SPIMgr_RegisterTaskID( byte taskID ){App_TaskID = taskID;}byte SPIMgr_CalcFCS( uint8 *msg_ptr, uint8 len ){byte x;byte xorResult;xorResult = 0;for ( x = 0; x < len; x++, msg_ptr++ )xorResult = xorResult ^ *msg_ptr;return ( xorResult );}#if defined (ZTOOL_P1) || defined (ZTOOL_P2)void SPIMgr_ProcessZToolData ( uint8 port, uint8 event ){uint8 ch;if (event == HAL_UART_TX_FULL){// Do something when TX if fullreturn;}if (event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)){while (Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT)){HalUARTRead (SPI_MGR_DEFAULT_PORT, &ch, 1);switch (state){case SOP_STATE:if (ch == SOP_V ALUE)state = CMD_STA TE1;break;case CMD_STATE1:CMD_Token[0] = ch;state = CMD_STA TE2;break;case CMD_STATE2:CMD_Token[1] = ch;state = LEN_STA TE;break;case LEN_STA TE:LEN_Token = ch;if (ch == 0)state = FCS_STATE;elsestate = DA TA_STA TE;tempDataLen = 0;SPI_Msg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t ) + 2+1+LEN_Token );if (SPI_Msg){SPI_Msg->hdr.event = CMD_SERIAL_MSG;SPI_Msg->msg = (uint8*)(SPI_Msg+1);SPI_Msg->msg[0] = CMD_Token[0];SPI_Msg->msg[1] = CMD_Token[1];SPI_Msg->msg[2] = LEN_Token;}else{state = SOP_STA TE;return;}break;case DATA_STA TE:SPI_Msg->msg[3 + tempDataLen++] = ch;if ( tempDataLen == LEN_Token )state = FCS_STA TE;break;case FCS_STATE:FSC_Token = ch;if ((SPIMgr_CalcFCS ((uint8*)&SPI_Msg->msg[0], 2 + 1 + LEN_Token) == FSC_Token)){osal_msg_send( MT_TaskID, (byte *)SPI_Msg );}else{osal_msg_deallocate ( (uint8 *)SPI_Msg);}state = SOP_STA TE;break;default:break;}}}}#endif //ZTOOL#if defined (ZAPP_P1) || defined (ZAPP_P2)void SPIMgr_ProcessZAppData ( uint8 port, uint8 event ){osal_event_hdr_t *msg_ptr;uint16 length = 0;uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);if ((SPIMgr_MaxZAppBufLen != 0) && (SPIMgr_MaxZAppBufLen <= rxBufLen)){length = SPIMgr_MaxZAppBufLen;}else{length = rxBufLen;}if (event == HAL_UART_TX_FULL){// Do something when TX if fullreturn;}if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)){if ( App_TaskID ){if ((SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY ) && (length != 0)){SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );msg_ptr = (osal_event_hdr_t *)osal_msg_allocate( length + sizeof(osal_event_hdr_t) );if ( msg_ptr ){msg_ptr->event = SPI_INCOMING_ZAPP_DATA;msg_ptr->status = length;HalUARTRead( SPI_MGR_DEFAULT_PORT, (uint8 *)(msg_ptr + 1), length );osal_msg_send( App_TaskID, (uint8 *)msg_ptr );}}}}}void SPIMgr_ZAppBufferLengthRegister ( uint16 maxLen ){if (maxLen <= SPI_MGR_DEFAULT_MAX_RX_BUFF)SPIMgr_MaxZAppBufLen = maxLen;elseSPIMgr_MaxZAppBufLen = 1;}void SPIMgr_AppFlowControl ( bool status ){if (status != SPIMgr_ZAppRxStatus ){SPIMgr_ZAppRxStatus = status;}if (status == SPI_MGR_ZAPP_RX_READY){SPIMgr_ProcessZAppData ( SPI_MGR_DEFAULT_PORT, HAL_UART_RX_TIMEOUT ); }}#endif //ZAPP这些意思很明显,特别注意下有色彩背景的代码。

CC2430开发套件使用指南

CC2430开发套件使用指南

CC2430开发套件使用指南
1.功能简介
CC2430开发套件硬件包括CC2430模块,仿真器底板和WX1110 多模块功能扩展板
三个部分,三者构成专业的ZigBee/WSN开发环境。

软件可以支持TI的zStack, SimpliTI, TI-MAC和Sample Examples等多个软件包。

2.初识硬件
CC2430模块
正面
背面有两个状态指示LED,LED 对应IO管脚:
CC2430仿真器底板
WX1110 多模块功能扩展板
可以在WX1110 多模块功能扩展板上安装CC2430模块,实现路由或网关节点功能。

3.搭建测试环境
测试步骤
1)把模块放到仿真器板上2x14排针接口
2)连接USB线到仿真器标数字的那个USB接口(后面称为仿真器接口)。

3)安装IAR编译软件
4)连接仿真器到计算机USB接口, 并按下电源开关
5)按照系统提示安装仿真器驱动(驱动位于IAR 安装目录下面,smartrf04eb的)
6)用IAR编译程序,配置Option选项,修改Debugger-> Setup-> Driver, 选择
“Texas Instrument"
7)编译好之后执行Debug就可以把程序下载到模块上,不同程序实现的功能不一
样。

CC2430低功耗模式(转自小峰博客)

CC2430低功耗模式(转自小峰博客)

CC2430低功耗模式(转自小峰博客)使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1The CC2430 has four major power modes, called PM0, PM1, PM2 and PM3. PM0 is the active mode while PM3 has the lowest power consumption. The power modes are shown in Table 23 together with voltage regulator and oscillator options.PM0 : The full functional mode. The voltage regulator to the digital core is on and either the HS-RCOSC or the 32 MHz XOSC or both are running. Either the 32.768 kHz RCOSC or the 32.768 kHz XOSC is running.(PM0 is the full functional mode of operation where the CPU, peripherals and RF transceiver are active. The voltage regulator is turned on. PM0 is used for normal operation.)PM1 : The voltage regulator to the digital part is on. Neither the 32 MHz XOSC nor the HS-RCOSC are running. Either the 32.768 kHz RCOSC or the 32.768 kHz XOSC is running. Thesystem will go to PM0 on reset or an external interrupt or when the sleep timer expires.(In PM1, the high-speed oscillators are powered down. The voltage regulator and the 32.768 kHz oscillators are on. When PM1 is entered, a power down sequence is run. When the device is taken out of PM1 to PM0, the high-speed oscillators are started. The device will run on the high speed RC oscillator until the high speed XOSC has settled.PM1 is used when the expected time until a wakeup event is relatively short since PM1 uses a fast power down/up sequence. ) PM2 : The voltage regulator to the digital core is turned off. Neither the 32 MHz XOSC nor the HS-RCOSC are running. Either the 32.768 kHz RCOSC or the 32.768 kHz XOSC is running. The system will go to PM0 on reset or an external interrupt or when the sleep timer expires.(PM2 has the second lowest power consumption. In stand-by mode the power-on reset, external interrupts, 32.768 kHz oscillator and sleep timer peripherals are active. All other internal circuits are powered down. The voltage regulator is also turned off. When PM2 is entered, a power down sequence is run. PM2 is used when the expected time until a wakeup event is relatively long since the power up/down sequence is relatively long. PM2 is typically entered when using the sleep timer. )PM3 : The voltage regulator to the digital core is turned off. None of the oscillators are running. The system will go to PM0 on reset or an external interrupt.(PM3 is used to achieve the operating mode with the lowest power consumption. In PM3 all internal circuits that are powered from the voltage regulator are turned off. The internal voltage regulator and all oscillators are also turned off. Power-on resetand external interrupts are the only functions that are operating in power-down mode, thus only a reset or external interrupt condition will wake the device up and place it into active mode. The contents of RAM and registers are preserved in power-down mode. PM3 uses the same power down/up sequence as PM2. PM3 is used to achieve ultra low power consumption when waiting for an external event.)协议栈对低功耗模式的配置:(具体参见hal_sleep.c)//---------------------------------------------------/* POWER CONSERVATION DEFINITIONS* Sleep mode H/W definitions (enabled with POWER_SAVING compile option)*/#define CC2430_PM0 0 /* PM0, Clock oscillators on, voltage regulator on */#define CC2430_PM1 1 /* PM1, 32.768 kHz oscillators on, voltage regulator on */#define CC2430_PM2 2 /* PM2, 32.768 kHz oscillators on, voltage regulator off */#define CC2430_PM3 3 /* PM3, All clock oscillators off, voltage regulator off *///---------------------------------------------------/* HAL power management mode is set according to thedifferent HW platform. Both* HAL_SLEEP_TIMER and HAL_SLEEP_DEEP selections will:* 1. turn off the system clock, and* 2. halt the MCU.* HAL_SLEEP_TIMER can be woken up by sleep timer interrupt, I/O interrupt and reset.!!* HAL_SLEEP_DEEP can be woken up by I/O interrupt and reset.!!*/#define HAL_SLEEP_OFF CC2430_PM0 //PM0#define HAL_SLEEP_TIMER CC2430_PM2 //PM2#define HAL_SLEEP_DEEP CC2430_PM3 //PM3//---------------------------------------------------最大最小睡眠时间/* MAX_SLEEP_TIME calculation:* Sleep timer maximum duration = 0xFFFF7F / 32768 Hz = 511.996 seconds* Round it to 510 seconds or 510000 ms (四舍五入)*/#define MAX_SLEEP_TIME 510000 /* maximum time to sleep allowed by ST *//* minimum time to sleep, this macro is to:* 1. avoid thrashing in-and-out of sleep with short OSAL timer (~2ms)* 2. define minimum safe sleep period for different CC2430 revisions* AN044 - MINIMUM SLEEP PERIODS WITH PULL-DOWN RESISTOR*/#if !defined (PM_MIN_SLEEP_TIME)#define PM_MIN_SLEEP_TIME 14 /* default to minimum safe sleep time for CC2430 Rev B */ #endif//---------------------------------------------------/* HAL power management mode is set according to the power management state.*/static uint8 halPwrMgtMode = HAL_SLEEP_OFF; //PM0/* stores the sleep timer count upon entering sleep */static uint32 halSleepTimerStart; //当进入睡眠时存储睡眠定时器计数值/* stores the accumulated sleep time */static uint32 halAccumulatedSleepTime; //存储睡眠定时器累积的计数值/* stores the deepest level the device is allowed to sleep* See AN044 - COMBINING POWER MODES*/static uint8 halSleepLevel = CC2430_PM2; //PM2 2#ifdef HAL_SLEEP_DEBUG_POWER_MODEstatic bool halSleepInt = FALSE;#endif//---------------------------------------------------OSAL_PwrMgr.h中:睡眠模式相关属性参数/* These attributes define sleep beheaver. The attributes can be changed* for each sleep cycle or when the device characteristic change.*/typedef struct{uint16 pwrmgr_task_state;uint16 pwrmgr_next_timeout;uint16 accumulated_sleep_time;uint8 pwrmgr_device;} pwrmgr_attribute_t;/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the* device is most likely on mains power. The PWRMGR_BATTERY selection allows* the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state.*/#define PWRMGR_ALWAYS_ON 0#define PWRMGR_BATTERY 1/* The PWRMGR_CONSERVE selection turns power savings on, all tasks have to* agree. The PWRMGR_HOLD selection turns power savings off.*/#define PWRMGR_CONSERVE 0#define PWRMGR_HOLD 1//---------------------------------------------------OSAL_pwrmgr.c中:With PWRMGR_ALWAYS_ON selection, there is no power savings andthe device is most likely on mains power.The PWRMGR_BATTERYselection allows the HAL sleep manager to enter sleep.void osal_pwrmgr_init( void ){// pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY;pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation.pwrmgr_attribute.pwrmgr_task_state = 0; //Cleared. All set to conserve}//********************************************************void halSleep( uint16 osal_timeout ){uint32 timeout;uint32 macTimeout;halAccumulatedSleepTime = 0; //睡眠定时器累积的计数值//-----------------------------------/* get next OSAL timer expiration converted to 320 usec units *///把osal_timeout转换成以320微秒为单位的时间值timeout = HAL_SLEEP_MS_TO_320US(osal_timeout);if (timeout == 0){timeout = MAC_PwrNextTimeout();}else{/* get next MAC timer expiration */macTimeout = MAC_PwrNextTimeout();/* get lesser of two timeouts */if ((macTimeout != 0) && (macTimeout < timeout)){timeout = macTimeout;}}//-----------------------------------/* HAL_SLEEP_PM2 is entered only if the timeout is zero and * the device is a stimulated(受激) device.*/ //timeout=0 且 device =stimulated device//timeout!=0则halPwrMgtMode=HAL_SLEEP_TIMER PM2 2 //timeout=0则halPwrMgtMode=HAL_SLEEP_DEEP PM3 3halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;//-----------------------------------/* The sleep mode is also controlled by halSleepLevel which * defined the deepest level of sleep allowed. This is applied * to timer sleep only.*///halSleepLevel = CC2430_PM2 = 2if ( timeout > 0 && halPwrMgtMode > halSleepLevel ) //PM3 深度睡眠{halPwrMgtMode = halSleepLevel;}//-----------------------------------/* Allow PM1 only.* AN044 - RESTRICT USE TO PM1 ONLY*/#if defined (PM1_ONLY) && (PM1_ONLY == TRUE)if (timeout > 0){halPwrMgtMode = CC2430_PM1;}else{/* do not allow PM3 either */return;}#endif//-----------------------------------/* DEEP sleep can only be entered when zgPollRate == 0.* This is to eliminate any possibility of entering PM3 between * two network timers.*/#if !defined (RTR_NWK) && defined (NWK_AUTO_POLL)if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||(timeout == 0 && zgPollRate == 0))#else//timeout=0或<最小睡眠时间if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||(timeout == 0))#endif{halIntState_t intState, ien0, ien1, ien2;HAL_ENTER_CRITICAL_SECTION(intState);/* always use "deep sleep" to turn off radio VREG on CC2430 */if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS){while( (HAL_SLEEP_MS_TO_320US(halAccumulatedSleepTime) < timeout) || (timeout == 0) ){/* get peripherals ready for sleep */HalKeyEnterSleep();#ifdef HAL_SLEEP_DEBUG_LEDHAL_TURN_OFF_LED3();#else/* use this to turn LEDs off during sleep */HalLedEnterSleep();#endif/* set main clock source to RC oscillator for Rev B and Rev D *///设置主时钟,准备进入睡眠. RC oscHAL_SLEEP_SET_MAIN_CLOCK_RC();//-------------------------------------/* enable sleep timer interrupt */if (timeout != 0){//睡眠时间大于最大允许睡眠时间if (timeout > HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME )) {timeout -= HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME );////设置sleeptimer定时时间halSleepSetTimer(HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TI ME ));}else{/* set sleep timer *///设置sleeptimer定时时间halSleepSetTimer(timeout);}/* set up sleep timer interrupt */HAL_SLEEP_TIMER_CLEAR_INT(); //清除中断标志HAL_SLEEP_TIMER_ENABLE_INT(); //使能中断}//-------------------------------------#ifdef HAL_SLEEP_DEBUG_LEDif (halPwrMgtMode == CC2430_PM1){HAL_TURN_ON_LED1();}else{HAL_TURN_OFF_LED1();}#endif//-------------------------------------/* save interrupt enable registers and disable all interrupts */ //备份各中断使能寄存器的值,并屏蔽中断HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2);//-------------------------------------/* This is to check if the stack is exceeding the disappearing * RAM boundary of 0xF000. If the stack does exceed the boundary* (unlikely), do not enter sleep until the stack is back to normal.*///检测有没有超出RAM界限if ( ((uint16)(*( __idata uint16*)(CSTK_PTR)) >= 0xF000) ){HAL_EXIT_CRITICAL_SECTION(intState);/* AN044 - DELAYING EXTERNAL INTERRUPTS, do not relocate this line.* it has to stay as close to PCON.IDLE = 1 as possible.*///EXTERNAL_INTERRUPT_DELAY(); //屏蔽低功郝/* set CC2430 power mode *///进入低功耗模式,等待唤醒再往下执行!HAL_SLEEP_SET_POWER_MODE(halPwrMgtMode);//########/* wake up from sleep */HAL_ENTER_CRITICAL_SECTION(intState);}//-------------------------------------/* restore interrupt enable registers *///恢复备份的各中断寄存器值HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);/* disable sleep timer interrupt *///关掉睡眠定时器中断HAL_SLEEP_TIMER_DISABLE_INT();/* set main clock source to crystal for Rev B and Rev D only *///设置主时钟,退出睡眠. 32MHx XOSCHAL_SLEEP_SET_MAIN_CLOCK_CRYSTAL();/* Calculate timer elasped *///计算流逝时间halAccumulatedSleepTime += (HalTimerElapsed() / TICK_COUNT);/* deduct the sleep time for the next iteration *///扣除时间if ( osal_timeout > halAccumulatedSleepTime){osal_timeout -= halAccumulatedSleepTime;}//-------------------------------------/* if the remaining time is less than the PM_MIN_SLEEP_TIME * burn the remaining time in a delay loop* AN044 - MINIMUM SLEEP PERIODS WITH PULL-DOWN RESISTOR*///睡眠时间小于最小安全睡眠时间if ( osal_timeout < PM_MIN_SLEEP_TIME ){halSleepWait(osal_timeout*1000);halAccumulatedSleepTime += osal_timeout;osal_timeout = halAccumulatedSleepTime;}//-------------------------------------#ifdef HAL_SLEEP_DEBUG_LEDHAL_TURN_ON_LED3();#else/* use this to turn LEDs back on after sleep */HalLedExitSleep();#endif//-------------------------------------/* handle peripherals; exit loop if key presses */if ( HalKeyExitSleep() ){#if defined (PM2_HOLDOFF_TIME) && (PM2_HOLDOFF_TIME > 0)/* The deepest sleep alowwed is PM1 until after the timer expired* AN044 - COMBINING POWER MODES*/halSleepLevel = CC2430_PM1;osal_stop_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT);osal_start_timerEx (Hal_TaskID, HAL_SLEEP_TIMER_EVENT, PM2_HOLDOFF_TIME);#endif /* (PM2_HOLDOFF_TIME > 0) */break;}/* exit loop if no timer active */if ( timeout == 0 ) break;}//-------------------------------------/* power on the MAC; blocks until completion *///开RF振荡器MAC_PwrOnReq();/* adjust OSAL timers *///调整系统时间osal_adjust_timers();}HAL_EXIT_CRITICAL_SECTION(intState);}}//********************************************************低功耗这块内容一直没有实验成功,不知是没设置好还是硬件模块有问题,以后有时间再琢磨琢磨……相关学习网址:。

参数错误怎么解决方法

参数错误怎么解决方法

参数错误怎么解决方法参数错误是在使用软件或系统的过程中经常遇到的问题,它会导致程序无法正常运行或者出现异常。

解决参数错误需要我们对问题进行分析和定位,然后采取相应的措施来修复。

本文将介绍一些常见的参数错误及其解决方法,希望能帮助到大家。

1. 检查输入的参数是否正确。

在程序开发或者使用过程中,经常会出现参数错误的情况。

一种常见的情况是输入的参数类型不正确,或者参数的取值范围超出了预期。

这时,我们需要仔细检查输入的参数是否符合要求,如果不符合,就需要对输入参数进行校验和转换,确保其符合程序的要求。

2. 查看程序日志或错误信息。

当程序出现参数错误时,通常会有相应的错误信息输出。

这些错误信息可以帮助我们快速定位问题所在。

因此,在遇到参数错误时,我们应该首先查看程序的日志或错误信息,了解具体的错误原因,然后再进行相应的处理。

3. 调试程序。

在遇到参数错误时,我们可以通过调试程序来找出问题所在。

通过设置断点、单步执行等方式,我们可以逐步追踪程序的执行过程,找出参数错误的具体位置和原因。

在调试过程中,我们可以查看变量的取值,了解程序的执行流程,从而更好地定位和解决参数错误。

4. 更新软件或系统。

有时,参数错误可能是由于软件或系统的bug引起的。

在这种情况下,我们可以尝试更新软件或系统,看是否有相关的修复补丁。

通过更新软件或系统,我们可以解决一些已知的bug,从而避免参数错误的发生。

5. 寻求帮助。

如果以上方法都无法解决参数错误,我们可以寻求相关领域的专家或者技术支持人员的帮助。

他们通常有丰富的经验和技术知识,可以帮助我们快速定位和解决参数错误。

总结。

参数错误是在软件开发和使用过程中常见的问题,解决参数错误需要我们对问题进行分析和定位,然后采取相应的措施来修复。

在遇到参数错误时,我们可以通过检查输入参数、查看错误信息、调试程序、更新软件或系统以及寻求帮助等方式来解决问题。

希望本文介绍的方法能够帮助大家更好地应对参数错误,提高工作效率和程序的稳定性。

CC2430问题日记

CC2430问题日记

转】CC2430问题日记1:无法打开下载文件进行程序下载。

这是早些时候刚拿到开发板遇到的第一个问题。

当时还一头雾水,挠破头皮时才发现有个选项没选对,link选项里面应该选output输出文件而不是debug调试文件。

2:串口接收相邻字节间的时间间隔由于采用的轮询串口接收中断标志的方式来接收存储串口数据,所以需要判断一个连续的数据流什么时候结束。

经反复实验,得出一个经验数值:以9600bps为例,连续发送的字节间间隔时间小于2.8ms,即在判断一个数据是否结束时,应至少等待2.8ms看是否接收到新的一个字节,若接收到则此数据流是连续的,还没结束;若等待2.8ms仍没数据接收到,则可以判断此数据流已经结束。

用C写的代码,对中断标志的查询大约循环400次≈2.8ms3:串口有可能接收到假数据当对方没有数据向2430的串口发送时,串口不能对中断标志进行无限循环的等待,必须设置一个最大等待次数,超过门限就退出循环。

但是实际实验时发现往往设置了门限却退不出循环,串口轮询接收函数死在那了,这个问题困扰了好久,最后才偶然的发现即使串口悬空,对方没有任何数据发向2430的串口,但串口仍然有可能收到一些全是0x00或是全0xFF或着杂乱无章的数据。

于是前面的问题有答案了:串口接收函数即使设置了最大循环等待次数,但接收函数无法退出的原因并不在此,而是接收到了连续不断的假数据!!由于一直处于接收状态,而且数据流又没断,所以串口一直在接收直到内存溢出,直到程序跑飞,也不可能超过等待次数返回。

所以解决办法:写串口中断轮询接收函数必须再加上一个输入参数,即最大允许接收字节数。

4:PC上位机的串口接收程序和cc2430下位机的串口发送配合问题底下的2430源源不断在向PC的RS232口发数据,PC上用VC写的定时器触发不停的查询串口接收缓冲区数据,但明显的PC上收到数据没2430发的那么多。

显然PC在接收串口的过程中随机地丢掉了几个数据包,使得数据更新速度很慢。

Zigbee网络设备启动—基本问题说明

Zigbee网络设备启动—基本问题说明

记录几个问题:***********************************1、有关设备的启动模式选项:(有待完善):非自动启动模式HOLD_AUTO_START:HOLD_AUTO_START is a compile option that will surpres s ZDApp from starting the device and wait for the application to start the device.不通过ZDApp(具体讲是ZDOInitDevice())而是等待应用程序来开启设备并初始化建立/加入网络.软启动模式SOFT_START:SOFT_START is a compile option that allows the device to start as a c oordinator if one isn't found. Otherwise, the device will start as a router.如果没有协调器则作为协调器启动,有则作为路由器启动.自动启动模式:个人认为就是自动通过ZDApp(具体讲是ZDOInitDevice())来开启设备并初始化建立/加入网络,设备的逻辑类型由所携带的配置文件来决定.**********************************************************************2、三种逻辑类型节点的配置文件协调器:f8wCoord.cfg配置文件中同时编译了路由功能RTR_NWK和协调器功能ZDO_COORDINATOR/* Common To All Applications */-DCPU32MHZ // CC2430s Run at 32MHz-DFORCE_MAC_NEAR // MAC code in NEAR-DROOT=__near_func // MAC/ZMAC code in NEAR-DMAC_CFG_APP_PENDING_QUEUE=TRUE/* Coordinator Settings */-DZDO_COORDINATOR // Coordinator Functions-DRTR_NWK // Router Functions/* Optional Settings */-DBLINK_LEDS // LED Blink Functions/* Compiler keywords */-DCONST="const __code"-DGENERIC=__generic // Ptr declaration路由器:f8wRouter.cfg配置文件中编译了路由功能RTR_NWK/* Common To All Applications */-DCPU32MHZ // CC2430s Run at 32MHz-DFORCE_MAC_NEAR // MAC code in NEAR-DROOT=__near_func // MAC/ZMAC code in NEAR-DMAC_CFG_APP_PENDING_QUEUE=TRUE/* Router Settings */-DRTR_NWK // Router Functions/* Optional Settings */-DBLINK_LEDS // LED Blink Functions/* Compiler keywords */-DCONST="const __code"-DGENERIC=__generic // Ptr declaration终端:f8wEdev.cfg配置文件中没有编译这两个功能./* Common To All Applications */-DCPU32MHZ // CC2430s Run at 32MHz-DFORCE_MAC_NEAR // MAC code in NEAR-DROOT=__near_func // MAC/ZMAC code in NEAR/* Optional Settings */-DMAC_OPT_FFD=0 // ZigBee RFD-DBLINK_LEDS // LED Blink Functions/* Compiler keywords */-DCONST="const __code"-DGENERIC=__generic // Ptr declaration协调器的配置文件只比路由器配置文件多编译了个-DZDO_COORDINATOR // Coordinator Functions 如果同时编译非自动启动模式HOLD_AUTO_START和软启动模式SOFT_START,设备可以通过应用程序来选择成为路由器或协调器.当然这个设备所带的配置文件应为f8wCoord.cfg.对于设备携带的是何种配置文件,可以打开project->options->c/c++compiler->extraOptions选项查看.比如SampleApp中的DemoEB,同时编译了SOFT_START和HOLD_AUTO_START,貌似下载进去后通过外部跳线来选择是当协调器还是路由器,不过这部分程序已经被注销了.当然的,DemoEB所带的配置文件应该是同时编译了路由功能和协调器功能的f8wCoord.cfg,即编译了RTR_NWK和ZDO_COORDINAT OR.再比如SimpleApp中两个实验中的灯与开关实验.开关设备SimpleSwitchEB无论按K1还是K2都是作为终端设备的,其预编译选项只有HOLD_AUTO_START而没有SOFT_START,配置文件为f8wEndev.cfg,没有协调器和路由功能;而灯设备SimpleControllerEB按键K1则作为协调器,按K2则作为路由器,其预编译选项同时编译了SOFT_START和HOLD_AUTO_START,配置文件为f8wCoord.cfg,即编译了RTR _NWK和ZDO_COORDINATOR. SimpleApp中传感器实验也一样,只能作为终端设备的SimpleSensorEB 预编译了HOLD_AUTO_START,配置文件为f8wEndev.cfg;而SimpleCollectorEB按K1作为协调器按K2作为路由器,预编译了SOFT_START和HOLD_AUTO_START,配置文件f8wCoord.cfg. 可以通过project ->options->c/c++compiler->extraOptions选项查看,也可由workspace看出,如下:作为终端的开关节点与作为协调器/路由器的灯节点:空白的文件表示没有包含在这个workspace中.作为终端的传感器节点与作为协调器、路由器的中心收集节点:空白的文件表示没有包含在这个workspace 中.**********************************************************************3、有两种方式来设置非自动启动模式:Hold Auto Start(1)、手工方式:在ZDApp_Init()函数中有个ZDAppCheckForHoldKey();(// Check for manual(手工的) "Hold Auto Star t").来看下这个函数:********************void ZDAppCheckForHoldKey( void ){#if (defined HAL_KEY) && (HAL_KEY == TRUE)//直接通过读取按键来判断是否需要采用HOLD_AUTO_START 模式,如果发现//SW_1处于按下(普通按键?)/向上(Joystick up)状态,则设置devState 为DEV_HOLD;// Get Keypad directly to see if a HOLD_START is needed.// Hold down the SW_BYPASS_START key (see OnBoard.h)// while booting to avoid starting up the device.if ( HalKeyRead () == SW_BYPASS_START) //HAL_KEY_SW_1{// Change the device state to HOLD on start updevState = DEV_HOLD;}#endif // HAL_KEY}*********************可以看到如果手工使HAL_KEY_SW_1置位状态,则会设置devState = DEV_HOLD.这里HAL_KEY的初始化见hal_board_cfg.h:#ifndef HAL_KEY#define HAL_KEY TRUE#endif而对SW_BYPASS_START的初始化见OnBoard.h:// These Key definitions are unique to this development system.// They are used to bypass functions when starting up the device.//这些键的定义仅适用于本应用例子,可以在设备启动时避开一些功能://避开网络层的NV存储和避开网络初始化#define SW_BYPASS_NV HAL_KEY_SW_5 // Bypass Network layer NV restore#define SW_BYPASS_START HAL_KEY_SW_1 // Bypass Network initialization因此避开网络层NV存储也可以通过手工方式来完成.(2)、预编译方式:project->options->c/c++compiler->preprocessor->defined symbols下编译选项:HOLD_AUTO_START SimpleApp例子里四种节点都预编译了HOLD_AUTO_START:非自动启动模式在ZDApp.c中:#if defined( HOLD_AUTO_START )devStates_t devState = DEV_HOLD;#elsedevStates_t devState = DEV_INIT;#endif把devState初始化为DEV_HOLD.以上两种方式最终都会设置devState = DEV_HOLD // Initialized - not started automatically********************************************************************************4、devStartMode和devState的初始化,ZDApp.c中:devStartMode:#if defined( ZDO_COORDINATOR ) && !defined( SOFT_START )// Set the default to coodinatordevStartModes_t devStartMode = MODE_HARD;#elsedevStartModes_t devStartMode = MODE_JOIN; // Assume joining//devStartModes_t devStartMode = MODE_RESUME; // if already "directly joined"// to parent. Set to make the device do an Orphan scan.#endif编译了ZDO_COORDINATOR并且没有编译SOFT_START,则初始化devStartMode = MODE_HARD;其他情况初始化devStartMode = MODE_RESUME;比如SampleApp三种逻辑类型节点.devState:#if defined( HOLD_AUTO_START )devStates_t devState = DEV_HOLD;// Initialized - not started automatically#elsedevStates_t devState = DEV_INIT;// Initialized - not connected to anything#endif预编译了HOLD_AUTO_START,则devState = DEV_HOLD;否则devState = DEV_INIT;********************************************************************************5、存储设备逻辑类型的NV条目ZCD_NV_LOGICAL_TYPE:(1)在ZGlobals.c下的NV条目表ZGlobal Item Table有这么一个条目:static CONST zgItem_t zgItemTable[ ] ={#if defined ( NV_INIT ){ZCD_NV_LOGICAL_TYPE, sizeof(zgDeviceLogicalType), &zgDeviceLogicalType},…………}zgItem_t结构体如下:typedef struct zgItem{uint16 id;uint16 len;void *buf;} zgItem_t;ZDO全局变量zgDeviceLogicalType被初始化为uint8 zgDeviceLogicalType = DEVICE_LOGICAL_TYP E;因此这里全局变量zgDeviceLogicalType的值为NV条目ZCD_NV_LOGICAL_TYPE的值,buf指向zgD eviceLogicalType.如果在应用程序中改变了设备逻辑类型并写入NV条目ZCD_NV_LOGICAL_TYPE中,这时即全局变量zgDeviceLogicalType的值改变了(卡在这步上近两天,因为找不着改变的逻辑状态与设备开启时选择的逻辑状态之间的关系).(2)NV条目ZCD_NV_LOGICAL_TYPE的值有哪些?// Device Logical Type//NV条目ZCD_NV_LOGICAL_TYPE的值包括:(即zgDeviceLogicalType的值)// Values for ZCD_NV_LOGICAL_TYPE (zgDeviceLogicalType)#define ZG_DEVICETYPE_COORDINATOR 0x00#define ZG_DEVICETYPE_ROUTER 0x01#define ZG_DEVICETYPE_ENDDEVICE 0x02#define ZG_DEVICETYPE_SOFT 0x03(3)对于DEVICE_LOGICAL_TYPE的值各逻辑类型设备初始化如下:// Device Logical Type//zgDeviceLogicalType = DEVICE_LOGICAL_TYPE#if defined ( SOFT_START )#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_SOFT //可选择类型#elif defined( ZDO_COORDINATOR )#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_COORDINATOR //协调器#elif defined (RTR_NWK)#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ROUTER //路由器#else#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ENDDEVICE //终端#endif如果编译了SOFT_START,则初始化DEVICE_LOGICAL_TYPE=ZG_DEVICETYPE_SOFT,即zgDevice LogicalType = ZG_DEVICETYPE_SOFT;如果没有编译SOFT_START但编译了ZDO_COORDINATOR,则初始DEVICE_LOGICAL_TYPE = ZG_DEVICETYPE_COORDINATOR,即zgDeviceLogicalType=Z G_DEVICETYPE_COORDINATOR;路由器和终端类似.********************************************************************************6、启动设备都要通过ZDApp_event_loop()函数调用ZDO_StartDevice()对ZDO_NETWORK_INIT事件的处理:ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );这里对于设备逻辑类型的传递参数ZDO_Config_Node_Descriptor.LogicalType,ZDConfig.c中初始化是这样的:NodeDescriptorFormat_t ZDO_Config_Node_Descriptor ={#if defined( ZDO_COORDINATOR ) && !defined( SOFT_START )NODETYPE_COORDINATOR,//协调器#elif defined (RTR_NWK)NODETYPE_ROUTER, //路由器#elseNODETYPE_DEVICE, //终端设备// Logical Type#endif…………}如果编译了ZDO_COORDINATOR且没有编译SOFT_START,则ZDO_Config_Node_Descriptor.Logical Type的值为NODETYPE_COORDINATOR; 如果没有编译ZDO_COORDINATOR或者编译了SOFT_S TART,且编译了了RTR_NWK,则ZDO_Config_Node_Descriptor.LogicalType的值为NODETYPE_ROU TER(比如simpleApp中灯节点和中心收集节点就是这种情况,因此它俩的ZDO_Config_Node_Descriptor. LogicalType被初始化为NODETYPE_ROUTER,当然当通过外部按键选择设备逻辑类型为协调器时,会通过内部程序把这个值改为NODETYPE_COORDINATOR,这点后面再作记录);剩下情况为NODETYPE_D EVICE.********************************************************************************7、simpleApp中的按键完成两个功能:设置设备的逻辑类型(ZC/ZR/ED) 和设置设备的启动方式(ZCD_STARTOPT_AUTO_START),然后写入相应的NV条目ZCD_NV_LOGICAL_TYPE和ZCD_NV_STARTUP_OPTION.ZDApp_Init()是先于应用任务如SampleApp_Init()初始化的.ZCD_NV_STARTUP_OPTION值包括:// These are bit weighted - you can OR these together.// Setting one of these bits will set their associated NV items// to code initialized values.#define ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 //默认配置#define ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 //默认网络状态#define ZCD_STARTOPT_AUTO_START 0x04 //自动启动#define ZCD_STARTOPT_CLEAR_CONFIG ZCD_STARTOPT_DEFAULT_CONFIG_STATE //清除配置=默认配置#define ZCD_STARTOPT_CLEAR_STATE ZCD_STARTOPT_DEFAULT_NETWORK_STATE //清除状态=默认网络状态ZCD_NV_LOGICAL_TYPE值参见4.******************************************************************************8、网络状态的类型://设备的网络状态为恢复的网络状态#define ZDO_INITDEV_RESTORED_NETWORK_STATE 0x00//网络状态初始化,即设备的网络状态为新的网络状态.可能意味着ZCD_NV_STARTUP_OPTION不能恢复,或没有任何网络状态恢复#define ZDO_INITDEV_NEW_NETWORK_STATE 0x01//复位前,网络重返选项为TRUE,因此该设备在网络中没有启动(仅一次),下次调用该函数将启动.#define ZDO_INITDEV_LEAVE_NOT_STARTED 0x02********************************************************************************9、NV条目ZCD_NV_STARTUP_OPTION初始化******************************************************************************** ******************************************************************************** ********************************************************************************分析一:(错误,见分析二;暂不删除)NV条目的初始化在zgInit()中.main()函数中:***************// Initialize basic NV items/*初始化NV条目*/zgInit();***************************************** @fn zgInit** @brief** Initialize the Z-Stack Globals. If an item doesn't exist in* NV memory, write the system default into NV memory. But if* it exists, set the item to the value stored in NV memory.** NOTE: The Startup Options (ZCD_NV_STARTUP_OPTION) indicate* that the Config state items (zgItemTable) need to be* set to defaults (ZCD_STARTOPT_DEFAULT_CONFIG_STATE). The*** @param none** @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not* exist in NV, NV_OPER_FAILED if failure.*/uint8 zgInit( void ){uint8 i = 0;uint8 setDefault = FALSE;// Do we want to default the Config state valuesif ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE )// 0x01 {setDefault = TRUE;}#if 0 //正常情况下被禁止来节省NV空间// Enable this section if you need to track the number of resets// This section is normally disabled to minimize "wear" on NV memory…………#endif// Initialize the Extended PAN ID as my own extended address//扩展地址ZMacGetReq( ZMacExtAddr, zgExtendedPANID );#ifndef NONWK// Initialize the Pre-Configured Key to the default keyosal_memcpy( zgPreConfigKey, defaultKey, SEC_KEY_LEN ); // Do NOT Change!!!#endif // NONWK//----------------------------------初始化各NV配置状态条目值//初始化NV条目表zgItemTable[ ].如果setDefault=TRUE,则设置为默认//值;否则读取原先存储在里面的值.while ( zgItemTable[i].id != 0x00 ){// Initialize the itemzgItemInit( zgItemTable[i].id, zgItemTable[i].len, zgItemTable[i].buf, setDefault );// Move on to the next itemi++;}//----------------------------------// Clear the Config State default//如果NV条目ZCD_NV_STARTUP_OPTION的ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位为1if ( setDefault ){//把ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位清0zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_STARTOPT_DEFAULT_CONFIG_STATE ); }return ( ZSUCCESS );}****************************************NOTE: The Startup Options (ZCD_NV_STARTUP_OPTION) indicatethat the Config state items (zgItemTable) need to beset to defaults (ZCD_STARTOPT_DEFAULT_CONFIG_STATE).开启选项表明了各NV配置状态条目(zgItemTable表中的即为NV配置状态条目)需要被设置为默认值. setDefault的值取决于zgReadStartupOptions(),而这个函数记取的正是ZCD_NV_STARTUP_OPTION的值.****************************************// Reads the ZCD_NV_STARTUP_OPTION NV Item.uint8 zgReadStartupOptions( void ){// Default to Use Config State and Use Network Stateuint8 startupOption = 0;// This should have been done in ZMain.c, but just in case.if ( osal_nv_item_init( ZCD_NV_STARTUP_OPTION,sizeof(startupOption),&startupOption ) == ZSUCCESS ){// Read saved startup control//NV条目ZCD_NV_STARTUP_OPTION值读到startupOptionosal_nv_read( ZCD_NV_STARTUP_OPTION,0,sizeof( startupOption ),&startupOption);}return ( startupOption );}********************************************************************************* @fn zgItemInit()** Initialize a global item. If the item doesn't exist in NV memory,* write the system default (value passed in) into NV memory. But if* it exists, set the item to the value stored in NV memory.** Also, if setDefault is TRUE and the item exists, we will write* the default value to NV space.** @param id - item id* @param len - item len* @param buf - pointer to the item* @param setDefault - TRUE to set default, not read* TRUE则设置为默认值而不读取原先的值* @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not * exist in NV, NV_OPER_FAILED if failure.*/static uint8 zgItemInit( uint16 id, uint16 len, void *buf, uint8 setDefault ) {uint8 status;// If the item doesn't exist in NV memory, create and initialize// it with the value passed in.status = osal_nv_item_init( id, len, buf ); //NV条目读写前要进行条目的初始化if ( status == ZSUCCESS ){if ( setDefault ) //条目存在,setDefault=TRUE,设置为默认值{// Write the default value back to NVstatus = osal_nv_write( id, 0, len, buf );}else//条目存在,setDefault=FALSE,读取原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}}return (status);}****************************************zgReadStartupOptions()中:Default to Use Config State and Use Network State说明采用默认的配置和网络状态,那设备初始启动时ZCD_NV_STARTUP_OPTION值应该是默认配置标志位和默认网络标志位都置1,两者相或0x03(见7),但还没能找到究竟哪里进行过初始化.回到zgInit():(1)setDefault = FALSE;(2)读取ZCD_NV_STARTUP_OPTION值如果ZCD_STARTOPT_D EFAULT_CONFIG_STATE标志位为1,设置setDefault = TRUE;(3)初始化NV配置状态条目表zgItemTa ble[ ]中各条目为默认值(4)清除ZCD_STARTOPT_DEFAULT_CONFIG_STATE标志位.至于清除ZCD_STARTOPT_DEFAULT_CONFIG_STATE标志位,我想如果用户不改变ZCD_NV_STAR TUP_OPTION条目的值,设备每次重启都会将NV条目表中各项初始化为默认值:比如SampleApp例子,每次设备重启配置状态都为默认值.而如果用户改变了ZCD_NV_STARTUP_OPTION的值,比如SimpleApp 中:zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );startOptions = ZCD_STARTOPT_AUTO_START;zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );zb_SystemReset();每次按键后都会先把设备逻辑状态写入NV中(准备下次启动设备时以保存在这个NV条目里的逻辑类型来启动),然后把ZCD_NV_STARTUP_OPTION设为ZCD_STARTOPT_AUTO_START 0x04,则下面两个标志位都为0.ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01 //默认配置状态:存储配置信息ZCD_STARTOPT_DEFAULT_NETWORK_STATE 0x02 //默认网络状态:存储网络信息这样系统重启进入zgInit()后:if ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE )// 0x01{setDefault = TRUE;}ZCD_STARTOPT_DEFAULT_CONFIG_STATE标志位不为1,setDefault保持FALSE,因而进入NV配置状态条目初始化zgItemInit()时,执行的是:else //条目存在,setDefault=FALSE,读取原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}这样把上次存储在NV条目ZCD_NV_LOGICAL_TYPE中的设备逻辑类型值读出作为此次NV条目ZCD _NV_LOGICAL_TYPE的值.问题是,还未确定开启选项ZCD_NV_STARTUP_OPTION的值初始化的地方.纠结中,待解决……************************************************************************************************************************************************************************************************************************************************分析二:@@@ZCD_NV_STARTUP_OPTION最开始在osal_nv_item_init()中初始化,初始化为0***************************************** @fn zgInit** @brief** Initialize the Z-Stack Globals. If an item doesn't exist in* NV memory, write the system default into NV memory. But if* it exists, set the item to the value stored in NV memory.** NOTE: The Startup Options (ZCD_NV_STARTUP_OPTION) indicate* that the Config state items (zgItemTable) need to be* set to defaults (ZCD_STARTOPT_DEFAULT_CONFIG_STATE). The*** @param none** @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not* exist in NV, NV_OPER_FAILED if failure.*/uint8 zgInit( void ){uint8 i = 0;uint8 setDefault = FALSE;// Do we want to default the Config state valuesif ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE ) // 0x01{setDefault = TRUE;}#if 0 //正常情况下被禁止来节省NV空间// Enable this section if you need to track the number of resets// This section is normally disabled to minimize "wear" on NV memory…………#endif// Initialize the Extended PAN ID as my own extended address//扩展地址ZMacGetReq( ZMacExtAddr, zgExtendedPANID );#ifndef NONWK// Initialize the Pre-Configured Key to the default keyosal_memcpy( zgPreConfigKey, defaultKey, SEC_KEY_LEN ); // Do NOT Change!!!#endif// NONWK//----------------------------------初始化各NV配置状态条目值//初始化NV条目表zgItemTable[ ].如果setDefault=TRUE,则设置为系统默认//值;否则设置为原先存储在里面的值.while ( zgItemTable[i].id != 0x00 ){// Initialize the itemzgItemInit( zgItemTable[i].id, zgItemTable[i].len, zgItemTable[i].buf, setDefault );// Move on to the next itemi++;}//----------------------------------// Clear the Config State default//如果NV条目ZCD_NV_STARTUP_OPTION的ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位为1if ( setDefault ){ //把ZCD_STARTOPT_DEFAULT_CONFIG_STATE标致位清0zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_STARTOPT_DEFAULT_CONFIG_STATE ); }return ( ZSUCCESS );}****************************************首先来看下zgReadStartupOptions():****************************************// Reads the ZCD_NV_STARTUP_OPTION NV Item.uint8 zgReadStartupOptions( void ){// Default to Use Config State and Use Network Stateuint8 startupOption = 0;// This should have been done in ZMain.c, but just in case.//能返回ZSUCCESS,说明条目已经存在;当然,如果不存在,还是在osal_nv_item_init //中创建条目并设置为startupOption的值.if ( osal_nv_item_init( ZCD_NV_STARTUP_OPTION,sizeof(startupOption),&startupOption ) == ZSUCCESS ){// Read saved startup control//NV条目ZCD_NV_STARTUP_OPTION值读到startupOptionosal_nv_read( ZCD_NV_STARTUP_OPTION,0,sizeof( startupOption ),&startupOption);}return ( startupOption );}****************************************这里读取ZCD_NV_STARTUP_OPTION NV值,再来看下osal_nv_item_init(): ***************************************** @fn osal_nv_item_init** @brief If the NV item does not already exist, it is created and* initialized with the data passed to the function, if any.* This function must be called before calling osal_nv_read() or* osal_nv_write().如果条目不存在,则创建并初始化为传递过来的值.如果存在,直接返回ZSUCCESS.这个必须在read和write之前调用.** @param id - Valid NV item Id.* @param len - Item length.* @param *buf - Pointer to item initalization data. Set to NULL if none.* 条目初始化时的值.* @return NV_ITEM_UNINIT - Id did not exist and was created successfully. * ZSUCCESS - Id already existed, no action taken.* NV_OPER_FAILED - Failure to find or create Id.*/uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf )/* Global fail flag for fail due to low bus voltage has less impact on code* size than passing back a return value all the way from the lowest level.*/failF = FALSE;// ZCD_NV_EXTADDR is maintained without an osalNvHdr_t, so it is always alreadyinitialized.//条目已经存在,则直接返回ZSUCCESSif ( (id == ZCD_NV_EXTADDR) || (findItem( id ) != OSAL_NV_ITEM_NULL) ){return ZSUCCESS; //只有条目已经存在了,才会返回ZSUCCESS}//条目不存在,则通过initItem创建条目并初始化为buf传递过来的值else if ( initItem( TRUE, id, len, buf ) ){if ( failF ){(void)initNV(); // See comment at the declaration of failF.return NV_OPER_FAILED;}else{return NV_ITEM_UNINIT;}}else{return NV_OPER_FAILED;}}****************************************在zgReadStartupOptions()中调用了osal_nv_item_init( ZCD_NV_STARTUP_OPTION,sizeof(startupOpti on),&startupOption );其中startupOption = 0;一开始并不存在ZCD_NV_STARTUP_OPTION这个NV 条目,因而这里会创建NV条目ZCD_NV_STARTUP_OPTION并初始化为startupOption传递过来的值0.成功则返回NV_ITEM_UNINIT,因而不会调用zgReadStartupOptions()的osal_nv_read( ZCD_NV_STAR TUP_OPTION,0,sizeof( startupOption ),&startupOption),最后返回startupOption=0.回到zgInit(),setDefa ult = FALSE保持不变,然后进入NV配置状态条目初始化zgItemInit( zgItemTable[i].id, zgItemTable[i]. len, zgItemTable[i].buf, setDefault ),注意此时传递进去的值zgItemTable[i].buf已经定义为系统默认值(可以查看ZGlobals.c的NWK GLOBAL VARIABLES栏).看下zgItemInit():***************************************** @fn zgItemInit()** @brief* Initialize a global item. If the item doesn't exist in NV memory,* write the system default (value passed in) into NV memory. But if* it exists, set the item to the value stored in NV memory.* 条目不存在,创建并设置为传递过来的值;存在则设置为原存储的值.* Also, if setDefault is TRUE and the item exists, we will write* the default value to NV space.** @param id - item id* @param len - item len* @param buf - pointer to the item* @param setDefault - TRUE to set default, not read** @return ZSUCCESS if successful, NV_ITEM_UNINIT if item did not* exist in NV, NV_OPER_FAILED if failure.*/static uint8 zgItemInit( uint16 id, uint16 len, void *buf, uint8 setDefault ){uint8 status;// If the item doesn't exist in NV memory, create and initialize// it with the value passed in.status = osal_nv_item_init( id, len, buf );//NV条目读写前都要进行条目的初始化//这里是要status == ZSUCCESS才会执行里面的内容,说明//此NV条目是已经存在的,这样才会返回ZSUCCESSif ( status == ZSUCCESS ){if ( setDefault ) //条目存在,设置为默认值{// Write the default value back to NVstatus = osal_nv_write( id, 0, len, buf );}else //条目存在,读取原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}}return (status);}****************************************可以看到同样调用了osal_nv_item_init( id, len, buf ),如果条目不存在则创建并设置为buf传递过来的值,如果存在则直接返回ZSUCCESS.一开始各NV配置状态条目不存在,因而这里创建各条目并设置为buf传递过来的值(系统定义的默认值).回到zgInit(),各NV配置状态条目初始化完成后,返回ZSUCCESS.因为此时setDefault保持FALSE不变,因而不会执行zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_ST ARTOPT_DEFAULT_CONFIG_STATE );以上为NV条目的初始化流程.初始化时ZCD_NV_STARTUP_OPTION=0,即把各NV条目初始化为系统默认的值.想到zgReadStartupOptions()开头那句话:// Default to Use Config State and Use Network Stateuint8 startupOption = 0;startupOption即为ZCD_NV_STARTUP_OPTION的初始化值.(###)如果,这样初始化完成后,又在应用程序中改变ZCD_NV_STARTUP_OPTION的值,改为ZCD_START OPT_DEFAULT_CONFIG_STATE.然后zb_SystemReset()重启系统.进入zgInit(),首先设置setDefault = FALSE,然后同样进入判断:if ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_CONFIG_STATE )// 0x01{setDefault = TRUE;}调用:zgReadStartupOptions()->osal_nv_item_init(),因为此时NV条目ZCD_NV_STARTUP_OPTION已经存在,所以osal_nv_item_init()不会再创建条目并设置为传递过来的值startupOption = 0,而是直接返回ZS UCCESS,因而这时在zgReadStartupOptions()里会调用osal_nv_read( ZCD_NV_STARTUP_OPTION,0,s izeof( startupOption ),&startupOption)读取先前已经存储在条目ZCD_NV_STARTUP_OPTION里的值: ZCD_STARTOPT_DEFAULT_CONFIG_STATE!所以这里设置setDefault = TRUE.然后进入各NV配置状态条目初始化:zgItemInit( zgItemTable[i].id, zgItemTable[i].len, zgItemTable[i].buf, setDefault );进入zgItemInit(),同样先调用了osal_nv_item_init( id, len, buf ),因为各NV配置状态条目已经存在,所以不再创建而是直接返回ZSUCCESS,所以这次会调用:if ( status == ZSUCCESS ){if ( setDefault ) //条目存在,设置为默认值{// Write the default value back to NVstatus = osal_nv_write( id, 0, len, buf );}else//条目存在,设置为原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}}因为setDefault = TRUE,所以重新设置各NV配置状态条目为系统默认值.然后回到zgInit(),最终调用if ( setDefault ){ //把ZCD_STARTOPT_DEFAULT_CONFIG_STATE这位清0zgWriteStartupOptions( ZG_STARTUP_CLEAR, ZCD_STARTOPT_DEFAULT_CONFIG_STATE ); }这里把ZCD_NV_STARTUP_OPTION条目值重新清0(我上面只假设ZCD_NV_STARTUP_OPTION的值为ZCD_STARTOPT_DEFAULT_CONFIG_STATE 0x01).(###)当然,如果像SampleApp例子没有在应用程序中修改过ZCD_NV_STARTUP_OPTION,最开始启动设备时会创建条目并初始化为0(startupOption = 0),然后创建各NV配置状态条目并初始化为系统默认值.以后的每次设备启动,ZCD_NV_STARTUP_OPTION值为0,setDefault = FALSE,各NV配置状态条目初始化执行的是:else//条目存在,设置为原先存储的值{// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );}读取此前的配置状态.(###)再比如SimpleApp例子,应用程序通过按键改变NV条目ZCD_NV_STARTUP_OPTION以及NV配置状态条目ZCD_NV_LOGICAL_TYPE的值,通过zb_WriteConfiguration()写入NV中,然后zb_SystemRe set()重启系统.进入zgInit(),通过zgReadStartupOptions()读出的ZCD_NV_STARTUP_OPTION值不为ZC D_STARTOPT_DEFAULT_CONFIG_STATE,因而setDefault = FALSE.再进入zgItemInit(),因为条目存在且setDefault = FALSE,所以执行// The item exists in NV memory, read it from NV memorystatus = osal_nv_read( id, 0, len, buf );把条目的值设置为先前存储的值.即在SampleApp例子中,把上次存储在NV条目ZCD_NV_LOGICAL_TY PE中的设备逻辑类型值读出作为此次NV条目ZCD_NV_LOGICAL_TYPE的值.(1)初始ZCD_NV_STARTUP_OPTION=0.如果设备是首次启动,则调用status = osal_nv_item_init( id, len, buf )创建各NV配置状态条目并初始化为系统默认值;如果设备不是首次启动,则调用osal_nv_read( id, 0, len, buf )读取各NV配置状态条目先前存储的值作为本次的值.(2)设置ZCD_NV_STARTUP_OPTION=ZCD_STARTOPT_DEFAULT_CONFIG_STATE.NV条目ZCD_ NV_STARTUP_OPTION已经存在,调用osal_nv_write( id, 0, len, buf )设置各NV配置状态条目为系统默认值.最后把这位清0.(3)设置ZCD_NV_STARTUP_OPTION=ZCD_STARTOPT_AUTO_START.NV条目ZCD_NV_STARTUP _OPTION已经存在,调用osal_nv_read( id, 0, len, buf )读取各NV配置状态条目先前存储的值作为本次的值.********************************************************************************************************************************************************************************************************************************************************************************************************************************。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

zigbee—CC2430—常规报错修改
用IAR 7.60.1打开以前用IAR 7.51编写的2530程序,重新编译,无错,但在链接的过程中弹出了一个出错对话框,提示错误信息如下:
---------------------------
IarIdePm
---------------------------
Tool Internal Error:
Internal Error: In function:
Diagnostic: Value is too large to be represented as a unsigned 32-bit quantity.
P0: 0 P1: 0
--------------------------
分析推测出错原因,在编译过程中没有错误,只在链接过程中出错,那么可能是链接的设置不正确,新版本的IAR对链接所需的配置文件做了改动。

查看Option设置框里面的Linker系列设置,最后发现是
Linker&mdash;&mdash;Config&mdash;&mdash;Linker command file里面选择的xcl配置文件不正确。

解决办法:
Option&mdash;&mdash;Linker&mdash;&mdash;Config&md
ash;&mdash;Linker command file,打上Override default前面的勾,点击右侧按钮,选择路径为IAR Systems\Embedded Workbench
5.4\8051\config\devices\Texas Instruments\下面的xcl文件,其中具体哪一个要看芯片上的标识,如果是2530F64的就选lnk51ew_cc2530F64.xcl,F256的就选lnk51ew_cc2530F25
6.xcl
还可以不用IAR提供的xcl,采用其他的xcl配置文件,比如ZStack程序中就专门在其
\Projects\zstack\Tools\CC2530DB\目录下包含了一个名为f8w2530.xcl的配置文件,而ZStack采用的就是这个配置文件而非IAR提供的配置文件。

相关文档
最新文档