Zstack 中串口操作的深度解析(一)
By Kennan
最近在学习 TI 的 Z-stack 协议栈的过程中(1.4.3-1.2.1 版本,CC2430 处理器),对于协议栈串口操作的相
关问题一直是一知半解,同时在论坛上和 QQ 群里也总是有人问这个问题,也经常有人在串口应用中出问
题。所以最近抽点儿时间仔细研究了一下协议栈的串口操作部分函数,做一个随手笔记,以供大家参考。
为了说清楚协议栈的串口问题,我要先交代一下 CC2430 的 DMA 和中断问题。
一、DMA 控制器相关事宜
为了搞清楚 UART 的 DMA 操作,在弄 UART 之前,有必要把 DMA 的问题搞清楚。这里我不想把
CC2430 的 user guide 拿出来仔细说,有需要的就去看看吧。我这里从协议栈的 hal_dma.h 和 hal_dma.c 开
始,把 DMA 的一些基本事情交代了,好为后面的 UART 解释铺垫道路。
用 source insight 打开 hal_dma.h 文件,里面基本上是大量的宏定义、常数定义,在有就是一个结构体
typedef struct {
uint8 srcAddrH;
uint8 srcAddrL;
uint8 dstAddrH;
uint8 dstAddrL;
uint8 xferLenV;
uint8 xferLenL;
uint8 ctrlA;
uint8 ctrlB;
} halDMADesc_t;
还有两个变量:
extern halDMADesc_t dmaCh0;
extern halDMADesc_t dmaCh1234[4];
之外就是 void HalDmaInit( void )这个初始化 DMA 的函数。
这里所以要提一下变量 dmaCh0 和 dmaCh1234[4]以及 halDMADesc_t 这个结构体,是因为在 UART 部
分的驱动里面大量地用到了它们三个。我们先看结构体 halDMADesc_t,这里面主要定义的是 DMA 操作
过程中的源地址变量、目的地址变量(都是 16 位地址,用高低字节的两个 uint8 变量来组成)、要传输的数
据长度以及几个寄存器的控制变量。
为什么要这么做一个结构体呢?这个事情还是要从 CC2430 处理器 user guide 中 DMA 控制器操作说明
说起。我们先节选手册上关于 DMA 的几段描述:
[第一段:from TI CC2430 Data Sheet(rev.2.1) SWRS036F, Page 88 of 211]