第四部分 提高篇-第3章 CC2530协议栈串口实验

实验设备
硬件:PC 机一台;ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

上节我们实现了无线LED通讯实验,相信大家对 ZStack 已经有了一定的认识,今天就来一个比较简单的实验,讲解如何在 ZStack 里使用串口功能。本实验并没有实现数据的收发,只是通过实际例子,让大家加深对 ZStack 工作原理的理解。另外,读者应该在进一步理解 ZStack 工作原理的同时,掌握在 ZStack 协议里实现一个功能任务所需要完成的工作。

3.1实验分析及代码讲解

串口在嵌入式开发中非常重要,一般都要使用串口通讯、调试,所以学会串口使用也是必须的。大家还记得裸机实验里怎么使用串口功能的吗?我们裸机使用串口功能的步骤是:

(1) 串口初始化;
(2) 执行任务(发送/接收)。

其实,跟裸机实验里的串口实验一样,本实验也是按照同样的步骤来进行的,第(1)步不变;在第(1)步和第(2)步之间需要多做了一步,就是:给它登记一下;第(2)步照样执行。所以,本实验使用串口的具体步骤是

(1)串口初始化;
(2)登记任务号;
(3)执行任务。
打开《\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB\SampleApp.eww 》工程。在左边workspace 目录下比较重要的两个文件夹分别是 Zmain 和 App。我们开发主要在 App 文件夹进行,这也是用户自己添加自己代码的地方。主要修改 SampleApp.c 和 SampleApp.h 即可,如果增加传感器则增加相应的模块驱动到App里面,在 SampleApp.c 中调用就行。
第一步:串口初始化

串口初始化相信大家很熟悉,就是配置串口号、波特率、校验位、数据位、停止位等等。在基础实验我们都是配置好寄存器然后使用。现在我们在 workspace 下找到HAL\Target\CC2530EB\drivers 的 hal_uart.c 文件,我们可以看到里面已经包括了串口初始化、发送、接收等函数,全都封装好了;我们只需根据自己需要修改相关配置,调用相应的接口函数就可使用串口了,是不是觉得很方便呢?

如图3-1 所示。浏览一下关于串口的操作函数还是挺全的。我们看看 workspace 上的 MT层,发觉有很多基本函数,前面带 MT。包括 MT_UART.C,我们打开这个文件。看到MT_UartInit()函数,这里也有一个串口初始化函数的,没错 Z-stack 上有一个 MT 层,用户可以选用 MT 层配置和调用其他驱动。进一步简化了操作流程。我们已经知道串口配置的方法, 那么应该在那里初始化呢? 当然是 SampleApp_Init(),如果你还有疑问说明你上个实验还要复习一下,我们大概再说下吧。

用户自己添加的应用任务程序在 Zstack 中的调用过程是:
main() —> osal_init_system()—> osalInitTasks()—> SampleApp_Init()
我们打开 APP 目录下的 SampleApp.c 发现 SampleApp_Init()函数。我们在这里加入串口初始化代码。

这里写图片描述

图3-1

本实验相关的文件如下表:

表3-1

文件名 描述
MT_UART.c 串口初始化及配置相关函数
MT_UART.h 串口初始化及配置相关函数的声明等
hal_uart.h 串口硬件相关接口定义函数声明
hal_uart.c 串口硬件相关接口定义函数
SampleApp.h 用户处理函数声明
SampleApp.c 用户处理函数

我们打开 MT_UART.c,如图 2所示。然后找到 MT_UartInit ()函数。
这里写图片描述
这里写图片描述
这里写图片描述
第 108 行:uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;是配置波特率,我们有右键“go to definition of” MT_UART_DEFAULT_BAUDRATE,可以看到:
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400
默认的波特率是 38400bps,现在我们修改成 115200bps,修改如下:
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
如果继续追踪我们会发现在hal_uart.h由HAL_UART_BR_115200的宏定义。
第 110 行:uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW; 语句是配置流控的,我们进入定义可以看到:
#define MT_UART_DEFAULT_OVERFLOW TRUE
默认是打开串口流控的,如果你是只连了 TX/RX 2 根线的方式务必关流控。

注意:2 根线的通讯连接一定要关流控,不然是永远收发不了信息的,现在大部产品很少用流控。

#define MT_UART_DEFAULT_OVERFLOW FALSE
第 121~127 行:这个是预编译,根据预先定义的 ZTOOL 或者 ZAPP 选择不同的数据处理函数。后面的 P1 和 P2 则是串口 0 和串口 1。我们用 ZTOOL,串口 0。我们可以在 option——C/C++ Compiler的Preprocessor 地方加入。

这里写图片描述

图3-2

修改完之后,我们在 SampleApp_Init( uint8 task_id )函数调用配置好的 MT_UartInit ()函数;然后,记得在 SampleApp.c 文件开头的地方将图所示的头文件 include 进去
这里写图片描述

图 3-3 串口驱动头文件

第二步:登记任务号
在刚刚添加 MT_UartInit ()函数的 SampleApp_Init( uint8 task_id )函数里,紧接着MT_UartInit (),加上 MT_UartRegisterTaskID(task_id)函数,以登记任务号。如图所示。

这里写图片描述

图 3-4 登记任务号

第三步:执行任务
紧接着 MT_UartRegisterTaskID(task_id)函数,在其后面添加函数 HalUARTWrite(0,”Usart. OK\n”, sizeof(“UartInit OK\n”)),也就是让系统执行这个任务了。至此,代码修改完毕。

3.2实验现象

按照下图所示,打开工程程序,如图所示选择 CoordinatorEB-Pro 进行编译,然后下载到开发板上,配置好串口调试助手,按下开发板复位键,我们发现开头显示一些乱码,按字符格式显示,是一串字符数据,并没有达到我们预期的效果。其实,这是 Z-stack MT 层定义的串口发送格式,以 FE 开头。那么怎么解决问题?既然问题是 MT 层,所以我们只要在预编译里,将有关 MT 层的都注释掉就可以了。

这里写图片描述

图3-5基于协议栈的 Uart 实验工程的路径

这里写图片描述

图 3-6 基于协议栈的 Uart 实验工程

这里写图片描述

图3-7预编译

【注】需要注释xMT_TASK,xMT_SYS_FUNC,xMT_ZDO_FUNC,不然会出现乱码。
按下终端节点的复位按钮,可以通过串口助手看到如下结果。
这里写图片描述

图3-8实验现象

3.3 实验总结

 ZStack 的工作流程:
(1) 关闭所有中断;
(2) 芯片外部(板载外设)初始化;
(3) 芯片内部初始化;
(4) 初始化操作系统;
(5) 打开所有中断;
(6) 执行操作系统。
 基于协议栈的串口实验的工作流程:
(1) 串口初始化;
(2)登记任务号;
(3) 执行任务。

本章参考代码

点击进入

IAR8.2以上版本编译低版本的协议栈的错误及解决方法

Error[e16]: Segment RAM_CODE_FLASH (size: 0x27 align: 0) is too long for segment definition. At least 0x4 more bytes needed. The problem occurred
while processing the segment placement command “-Z(CODE)RAM_CODE_FLASH=_RAM_CODE_FLASH_START-_RAM_CODE_FLASH_END”, where at the moment of placement the
available memory ranges were “CODE:39ddd-39dff”

解决方法:
根据上面说的,RAM_CODE_FLASH需要再扩大至少4个字节,打开Tool-fw82530.xcl文件,将RAM_CODE_FLASH_END的值再增大至少0x4,如下
这里写图片描述
将0x22改为0x26,具体值视错误提示而定。再次rebuild all即可消除错误
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013162035/article/details/80959834
今日推荐