Zstack中串口操作的深度解析(一)ByKennan.PDF

Zstack中串口操作的深度解析(一)ByKennan.PDF

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

tangtianbao1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档