- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Zstack中串口操作的深度解析(一)ByKennan
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]
[第二段:from TI CC2430 Data Sheet(rev.2.1) SWRS036F, Page 92 of 211]
仔细阅读这两段文档,大致意思是DMA 通道被使用之前must first be configured, 然后就要must be
armed before any transfers are allowed to be initiated.再后,就是trigger event occurs. 也就是说DAM 通道要先
配置,然后被武装起来(arm,我不知道该怎么翻译更恰当) ,之后就等待触发事件的到来并开始进行数据传
输。对我们来说,如何配置DMA 很重要,从上面的这段文档还可以看出:配置参数需要先放在一个structure
里面(也就是前面的 halDMADesc_t) ,并且每一个DMA 通道需要一个这样的结构体。更重要的是:DMA
通道0 可以有一个单独的配置结构体,DMA 通道1~4 的配置结构体必须位于连续的地址空间。这也就是
为什么定义了dmaCh0 结构体和dmaCh1234[4]结构体数组。而这个hal_dma.h 文件中定义的大量宏操作基
本都是用来操作dmaCh0 结构体及dmaCh1234[4]这个结构体数组的。
再看一下hal_dma.c 文件,发现很简单,只有那两个结构体的定义,再有就是DMA 初始化函数的一
个简单实现。不过从这个简单实现来看,真正的结构体填充、硬寄存器操作统统都没有实现,这样的DMA
初始化大家肯定都不会满意的。
那么????怎么回事儿?其实换一个角度想,DMA 是为外设和数据空
文档评论(0)