打印
[Zigbee]

CC2530协议栈串口实验

[复制链接]
744|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-8-5 13:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
实验设备
硬件:PC 机一台;ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

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


使用特权

评论回复

相关帖子

沙发
gwsan|  楼主 | 2019-8-5 13:28 | 只看该作者
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 中调用就行。


使用特权

评论回复
板凳
gwsan|  楼主 | 2019-8-5 13:29 | 只看该作者
第一步:串口初始化

串口初始化相信大家很熟悉,就是配置串口号、波特率、校验位、数据位、停止位等等。在基础实验我们都是配置好寄存器然后使用。现在我们在 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


使用特权

评论回复
地板
gwsan|  楼主 | 2019-8-5 13:29 | 只看该作者

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

表3-1

使用特权

评论回复
5
gwsan|  楼主 | 2019-8-5 13:30 | 只看该作者
我们打开 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 根线的方式务必关流控。


使用特权

评论回复
6
gwsan|  楼主 | 2019-8-5 13:30 | 只看该作者
注意: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 串口驱动头文件

使用特权

评论回复
7
gwsan|  楼主 | 2019-8-5 13:31 | 只看该作者
第二步:登记任务号
在刚刚添加 MT_UartInit ()函数的 SampleApp_Init( uint8 task_id )函数里,紧接着MT_UartInit (),加上 MT_UartRegisterTaskID(task_id)函数,以登记任务号。如图所示。



图 3-4 登记任务号


使用特权

评论回复
8
gwsan|  楼主 | 2019-8-5 13:31 | 只看该作者
第三步:执行任务
紧接着 MT_UartRegisterTaskID(task_id)函数,在其后面添加函数 HalUARTWrite(0,“Usart. OK\n”, sizeof("UartInit OK\n”)),也就是让系统执行这个任务了。至此,代码修改完毕。

使用特权

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



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


使用特权

评论回复
10
gwsan|  楼主 | 2019-8-5 13:32 | 只看该作者

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

图3-7预编译

【注】需要注释xMT_TASK,xMT_SYS_FUNC,xMT_ZDO_FUNC,不然会出现乱码。


使用特权

评论回复
11
gwsan|  楼主 | 2019-8-5 13:34 | 只看该作者

按下终端节点的复位按钮,可以通过串口助手看到如下结果。

图3-8实验现象

使用特权

评论回复
12
gwsan|  楼主 | 2019-8-5 13:34 | 只看该作者
3.3 实验总结
        ZStack 的工作流程:
(1) 关闭所有中断;
(2) 芯片外部(板载外设)初始化;
(3) 芯片内部初始化;
(4) 初始化操作系统;
(5) 打开所有中断;
(6) 执行操作系统。

        基于协议栈的串口实验的工作流程:
(1) 串口初始化;
(2)登记任务号;
(3) 执行任务。


使用特权

评论回复
13
phosphate| | 2019-8-6 14:40 | 只看该作者
感谢分享!学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3426

帖子

1

粉丝