历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2018年02月12日 | 基于STM32和CC2520的TinyOS移植方法

2018-02-12 来源:eefocus

    TinyOS系统以其组件结构模型、事件驱动、并发型等优点成为目前最受关注的无线传感器网络操作系统。但TinyOS不支持STM32和CC2 520芯片。因此在分析TinyOS基本原理、NesC编程语言实现机制及其编译过程的基础上,介绍了基于STM32和CC2520的TinyOS移植方法,完成了STM32的I/O组件、Timer组件、USART组件、SPI组件和CC2520芯片驱动的移植。在实现CC2520的基本通信功能基础上,实现简单MAC协议。最后测试了各组件的移植效果。实验测试结果表明,节点可以稳定可靠地通信。


    无线传感器网络(Wireless Sensor Network,WSN)是一种应用相关的网络。需要对某些操作系统进行移植。本文采用TinyOS作为软件平台,成功移植了Radio、Timer、USART、SPI和General I/O等5个底层模块。测试结果表明,移植的5个底层模块能够正常工作。

    1 MCU和无线模块介绍

    STM32系列按性能分成两个系列:STM32F103“增强型”系列和STM32F101“基本型”系列,时钟频率达到72 MHz,是同类产品中性能最高的产品。本项目采用芯片STM32F103RBT6。CC2520选用第二代ZigBee/IEEE 802.15.4无线电频率(RF)收发器。

    2 TinyOS操作系统和NesC分析

    2.1 NesC介绍

    NesC是专门为网络嵌入式系统设计的编程语言,是对C的扩展,它基于TinyOS的结构化概念和执行模型而设计。主要编程模式包括:事件驱动、弹性并发型和面向组件程序设计等。NesC编译器进行数据竞争检测(提高可靠性)、积极的函数内联(降低资源消耗)等整体程序分析,简化了应用程序的开发。

    2.2 TinyOS分析

    TinyOS(Tiny MICro Threading Operating System)是由加州大学伯克利分校开发的开源的传感器网络操作系统,其本身是由NesC语言编写。TinyOS的组件模型体系结构如图1所示。上层组件对下层组件发命令,下层组件向上层组件发信号通知事件,最底层的硬件抽象组件直接和硬件打交道。

c.JPG

    TinyOS的硬件抽象层通常是3级抽象结构,称作HAA(Hardware Abstraction Architecture)。整个硬件抽象层分为硬件表示层(HPL)、硬件适配层(HAL)和硬件接口层(HIL)。

    硬件表示层(Hardware Presentation Layer,HPL)是对硬件平台的功能性描述,主要通过存储单元和I/O映射端口访问硬件和通过硬件中断来实现以下功能:能量管理、控制硬件、硬件中断开闭、提供硬件中断服务程序等。

    在HPL上的是硬件适配层(Hardware Adaptation Layer,HAL),该层是整个硬件抽象层的核心,利用HPL提供的原始接口建立硬件描述资源,并通过状态来反映硬件的使用情况以实现对硬件的仲裁控制,提高系统性能。

    硬件抽象层的最高层是硬件接口层(Hardware Interface Layer,HIL),该层把HAL层提供的接口转换成硬件独立的接口,隐藏了平台之间的差异,并向上层提供统一的硬件API接口。

    3 基于STM32和CC2520平台的TinyOS实现

    由上文所述,将TinyOS移植到STM32核处理器和CC2520上的关键问题是硬件抽象层组件的定制和编译器工具链的配置。基于TinyOS开源代码的约定,主要修改代码放置在/tos/Chips/STM32和tos/platforms/STM32p103。

    3. 1 修改芯片文件

    每个芯片都通过多个接口或组件提供它所实现的功能,这些接口或组件组成芯片的驱动。将芯片的结构抽象文件放于tos/chips。如果芯片有子系统则建立子目录,如:tos/chips/STM32/timer。需要改写的TinyOS和MCU相关模块如下所述。

    3.1.1 STM32核处理器

    为了同其他外围设备的驱动分开,需要在MCU相关的文件中增加两个定义;原子操作的开始和结束,在头文件hardware.h中定义;低功耗工作模式,由组件MCUSleepC定义。具体可以参考其他MCU文件编写。

    TinyOS通过一些接口管理MCU的状态,决定MCU何时进入低功耗状态。MCUSleepC组件向上层提供McuSleep和McuPowerState接口。TinyOS调度器在原子操作中调用McuSleep.sleep(),保证在进入低功耗状态前处于开中断状态。在sleep状态,可以关闭一些高耗能的模块,比如:高频时钟、PLL等。

    3. 1.2 修改I/O、LED灯、Timer、USART、SPI组件

    (1)通用I/O接口

    HIL层组件通过3个接口描述MCU可以控制的通用输入输出引脚。General I/O接口描述输入输出引脚被清零或置位状态、设置为输入或输出模式。GpioInterrupt接口描述单个引脚触发的中断,可以对每一个引脚分别配置为上升沿触发或者下降沿触发中断。GpioCapture接口描述捕获单个引脚发生的事件,可以对每一个引脚分别配置为上升沿触发或者下降沿触发。


    (2)LED灯

    TinyOS最多可独立支持平台上3个LED灯。TinyOS通过PlatformLedsC组件直接访问3个LED灯,LedC和LedP组件再通过装配PlatformLedsC组件,向上层组件提供Led接口,相当于General I/O接口的使用。在PlatformLedsC组件中,可以对每种开发板指定相应的LED引脚。

    (3)Timer

    MCU时钟通常有3种常见的功能:控制、时钟/计数器、触发。将与MCU时钟相关的文件放到Chips/STM32/timer。时钟的通用功能通过一系列的接口定义实现:

   d.JPG

    (4)USART

    节点可以通过USART与PC通信,将与USART相关文件放于chips/STM32/UART。本文只通过HplSTM32UartNoDMAP组件的STM32Uart1C配件实现了简单的USART功能。串口的初始化包括:波特率、字长、奇偶校验位、流控制、打开串口时钟和配置串口发送接收引脚等。

    (5)SPI

    由于CC2520通过SPI接口和MCU通信,所以必须实现SPI接口。SPI的初始化包括:时钟信号的相位和极性、NSS模式、数据帧格式、主从模式等。

    3.2 CC2520驱动

    在tos/chips/cc2520中,定义与CC2520芯片相关的组件,这里面的组件直接对芯片进行操作。在tos/platforms/cc2520文件夹中定义CC2520和MCU交互的接口。CC2520通过SPI接口与STM32完成设置和收发数据两方面的任务。

    CC2520工作流程如下:应用程序中使用SplitControl接口,该接口最终连接到CCDriverLayerP上,在SOFtwareInit.init中对CC2520使用的和MCU相连的引脚进行初始配置。

    首先,复位CC2520,并且关闭电压调整器,根据Datasheet,延时1100 μs,延时通过接口BusyWait。延时完成后,开启电压调整器,并延时200μs后使能CC2520。完成后,申请SPI资源,该资源接口连接在CC2520DriverLayerP上,资源申请允许后,在CC25 20DriverLayerP中捕获到SpiResource.granted事件,然后开始通过SPI接口初始化CC2520,调用startOscillator。之后,调用initRadio对CC2520的寄存器进行相应配置。

    而在接收模式时,CC2520收到物理帧的SFD字段后,会在SFD引脚输出高电平,直到接收完该帧。如果启用了地址识别,在地址识别后,SFD引脚立即转为输出低电平。FIFO和FIFOP引脚标识FIFO缓存区的状态。如果接收FIFO缓存区有数据,FIFO引脚输出高电平;如果接收FIFO缓冲区为空,FIFO引脚输出低电平。TinyOS无线模块组织架构图如图2所示。

e.JPG

      3.3 修改平台文件

    在tos/platforms下放置平台相关文件,将物理驱动相关的组件连接起来组成具体平台。创建一个平台需要完成5个部分:

    ①“.platform”文件告知编译系统驱动文件的位置,由一系列的包含路径和NesC的参数组成。ncc将“.platform”文件当作perl脚本读出,并将参数传递到NesC预编译器。

    ②平台导入程序PlatformP/PlatformC,通过调用两个初始化接口platformC.Init和MainC.softwarelnit来激活MCU、传感器和射频等硬件模块及相关软件。platformC.Init通常完成时钟校准和引脚设置,保证硬件在可操作状态。

    ③与硬件具体功能相关的头文件“hardware.h”和将芯片与平台结合的具体代码。“hardware.h”包含了其他硬件子系统的头文件,并被主文件“MainC.nc”所包含。

    ④修改链接脚本文件,仿照其他平台文件在tos/platforms文件夹下建立tos.x文件,设置rom和ram的起始地址和大小。设置中断向量表、代码段、数据段、非初始化数据段和其他段的放置位置。

    ⑤定义中断向量表,在tos/platforms/STM32-p103/vectors文件夹下新建STM32-vector.c文件,用于放置中断向量表,按照STM32提供的中断配置中断向量表,并初始化默认中断处理函数,实际应用中这些中断处理函数可以在其他文件中重定义。比如时钟中断处理函数在McuSleepC.nc中重定义。

    3.4 修改编译工具链

    3.4.1 配置交叉开发工具链

    STM32支持的编译器有很多,比如:ARM—NONE—EABI—GCC、KEIL、IAR等。本文采用ARM—NONE—EABI—GCC编译器。NesC程序的编译主要分两步,首先调用ncc编译器把NesC预编译成C文件(即预编译过程);然后通过一个脚本程序,将经过NesC预编译生成的TinyOS应用程序转换成可以下载到开发板的hex格式文件;最后送入J—Flash ARM下载器下载到硬件。修改后的编译工具链如图3所示。f.JPG

    
    下面对这个过程进行详细的介绍。
    第一步:源组件文件(.nc源文件)的分析和转换,在这个阶段调用TinyOS自带的编译器ncc,对.nc源文件进行文法、语法分析,检测共享数据缓冲区等。再根据各个组件和接口对其使用的函数和变量进行名字扩展,使其具有全局唯一性。最后把所有的函数和变量都整合到一个主函数main()中,并生成相应的app.c文件。此时生成的已经是普通的C语言程序。以上这个替换过程是由ncc的核心程序nescl.exe完成的。
    第二步:在生成app.c文件后,ncc调用arm—none—eabi—gcc的交叉编译器工具对该C文件进行编译、链接生成可执行文件main.exe,然后通过arm—none—eabi—objcopy工具转换成main.hex,以便最后下载到STM32平台上运行调试。
3.4.2 定制编译环境
    为使编译系统能够寻找到编译平台,在工程主文件夹下增加环境定制文件“setup.sh”,定制工程目录、编译工具、解释工具等路径。在/support/make目录增加“STM32-p103.target”文件。定制STM32的MAKE系统。在make文件中指定用arm—none—eabi—gcc为编译器,arm-none-eabi-objcopy为输出格式转换器。
    以一个简单的应用程序radioCountTOLEDs为例,在STM32平台上编译的结果如图4所示。

a.JPG

    可以通过TinyOS自带的工具生成各个组件的连线关系,只需要在make命令后面添加docs选项。

    4 测试

    TinyOS自带的radioCountToLEDs测试程序,需用通用I/O接口、Timer、Leds、SPI和无线模块(CC2520)驱动等组件。为了查看USART模块驱动,也为了便于跟踪程序执行流程,在源程序中加入了串口输出代码,结果如图5所示。

b.JPG

      本实验通过一个节点每一秒定时广播数据包,定时器中断触发时发送一个16位的数据,并把此数加1。其他节点接收此数据,并根据接收数据的低3位是否为1来分别控制3个Led灯闪烁。通过观察节点上Led灯的有规律闪烁,能够证明各模块成功移植。

    结语

    本文简单介绍了NesC语言的特点和TinyOS系统架构,重点介绍了TinyOS的编译机制,并在此基础上详细说明了将TinyOS内核程序移植到以STM32核处理器和CC2520无线模块芯片为核心的开发板上的具体方法。通过测试发现,各个模块能够正常稳定工作。但无线模块协议栈还不够完善,功能还不全面,仍需要进一步的研究。


推荐阅读

史海拾趣

AZ Displays公司的发展小趣事

AZ Displays深知品质是企业生存的根本。因此,公司始终将质量控制放在首位,从原材料采购到生产工艺的每一个环节都进行严格把控。通过严格的质量管理体系和高效的供应链管理,AZ Displays的产品质量得到了客户的高度认可,逐渐在行业内建立了卓越的声誉。

Davico Industrial Ltd公司的发展小趣事

AZ Displays深知品质是企业生存的根本。因此,公司始终将质量控制放在首位,从原材料采购到生产工艺的每一个环节都进行严格把控。通过严格的质量管理体系和高效的供应链管理,AZ Displays的产品质量得到了客户的高度认可,逐渐在行业内建立了卓越的声誉。

Alcatel-Lucent公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,AZ Displays始终保持着创新的活力。公司不断投入研发资源,推出具有创新性和领先性的产品。同时,AZ Displays还积极关注行业动态和新兴技术,不断调整和优化产品策略,以确保公司在市场中的领先地位。

这些故事展示了AZ Displays在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。未来,随着科技的不断进步和市场需求的不断变化,AZ Displays将继续保持创新活力,为客户提供更优质的产品和服务。

ERA Transformers公司的发展小趣事

为了保持技术领先地位和市场竞争力,ERA Transformers公司非常重视创新与研发工作。公司每年都会投入大量资金用于新产品的研发和技术创新。在一次研发项目中,公司成功开发出了一种具有超高能效和极低损耗的新型变压器。这款产品的问世立即引起了市场的广泛关注,并成功获得了多项国内外专利。持续的创新与研发使得ERA Transformers公司在电子行业中始终保持着领先地位。

AD Semiconductor公司的发展小趣事

随着市场需求的不断增长,ERA Transformers公司面临着扩大生产规模的挑战。为了满足客户需求并保持市场竞争力,公司决定投资建设一个新的生产基地。经过精心规划和筹备,新的生产基地顺利建成并投入使用。这不仅大大提高了公司的生产能力,还进一步提升了产品质量和生产效率。新基地的建成标志着ERA Transformers公司在电子行业中的地位更加稳固。

Ferroxcube公司的发展小趣事

随着全球环保意识的日益增强,电子行业也开始面临着越来越严格的环保要求。Ferroxcube公司作为行业领军企业,积极响应环保号召,开始研发更加环保的磁性元件。

经过长时间的研发和试验,公司成功推出了一款采用环保材料制成的新型磁芯。这款磁芯不仅性能优异,而且在使用寿命结束后可以方便地进行回收再利用,大大降低了对环境的污染。

这一创新产品一经推出,就受到了市场的热烈欢迎。许多环保意识强烈的客户纷纷选择使用Ferroxcube的环保磁芯,以支持绿色环保事业。这也使得Ferroxcube在环保领域的声誉大大提升,为公司赢得了更多的市场份额和客户认可。

问答坊 | AI 解惑

机器人技术

20世纪50年代,为代替人工从事单调、重复的体力劳动或危险的工作,提高产品质量,工业机器人应运而生。从那以后,机器人作为生产自动化的典型代表,在制造业领域获得了巨大成功。 那么什么是机器人呢?从人们一般的理解来看,机器人是具有一些类似 ...…

查看全部问答>

怎么想嵌入式linux系统中写入自己的程序

我想在一个嵌入式linux系统中写入自己的开发程序,  芯片是PPC linux内核是linux 2.6.26 目标机上拥有Jtag.可以用此和目标机相连. 宿主机就是一台普通的PC机,装有windows XP系统, 我不知道在宿主机上应该用什么调试器,编译器. 如果将开 ...…

查看全部问答>

找编写testbench(VHDL)文件高手帮忙

如何在testbench(VHDL)文件中读取文本内容,来生成激励文件,给个例子,小弟未曾用testbench编写过激励…

查看全部问答>

EVC下对话框贴背景图后CStatic的设置透明背景问题??

各位:      用EVC做了一个对话框,并在OnPaint里给对话框贴了背景图,然后上面的控件(如CStatic)的背景还是原来标准对话框的背景,然后我又把CStatic控件的背景改为透明的,让其背景为对话框的图片,我想这样本应该就可以 ...…

查看全部问答>

《电子报》单片机文章

不知那位仁兄有电子报 2007年12期文章《单片机控制电饭煲预约和智能煮饭》一文 的源代码,麻烦发到我的邮箱liufeihui@163.com,不胜感激!…

查看全部问答>

问问大 家用STM32跑什么系统比较好啊?还是裸奔更有前途呢?

本人新手,刚刚学习了一点CM3的知识嘿嘿请大虾们多多指教啊…

查看全部问答>

keil烧写(flash)cortex M4如何配置

大侠们,第一次使用cortex M4芯片(飞思卡尔K40X256)不知道如何配置,错误如图:…

查看全部问答>

请教一个关于光电传感器的问题

各位朋友,我请教一个问题希望能得到大家帮助.光电传感器是否一定是:只要检测到一个信号就做一次机械动作,我现在需要每检测到两个信号才做一次机械动作行不行啊?谢谢大家!…

查看全部问答>

直流电子负载的设计制作(F题)

电子负载用于测试直流稳压电源、蓄电池等电源的性能。设计并制作一台电子负载,有恒流和恒压两种方式,可手动切换。恒流方式时要求不论输入电压如何变化(在一定的范围内),流过该电子负载的电流恒定,且电流值可设定。工作于恒压方式时,电子负载 ...…

查看全部问答>