z-stack协议uart分析(DMA)
1、从ZMain里面的main函数开始分析
2、进入int main( void );
HalDriverInit(); //硬件相关初始化,有DMA初始化和UART初始化
3、进入HalDriverInit();
/* DMA */
#if (defined HAL_DMA) && (HAL_DMA == TRUE)
// Must be called before the init call to any module that uses DMA.
HalDmaInit();
#endif
/* UART */
#if (defined HAL_UART) && (HAL_UART == TRUE) // HAL_UART已经在IAR里面定义了HAL_UART=TRUE
HalUARTInit();
#endif
4、进入HalUARTInit();
#if HAL_UART_DMA // HAL_UART_DMA已经在hal_board_cfg.h里面定义了HAL_UART_DMA #define HAL_UART_DMA 1
HalUARTInitDMA();
#endif
5、进入HalUARTInitDMA();配置引脚功能和DMA通道等
- /******************************************************************************
- * @fn HalUARTInitDMA
- *
- * @brief Initialize the UART
- *
- * @param none
- *
- * @return none
- *****************************************************************************/
- static void HalUARTInitDMA(void)
- {
- halDMADesc_t *ch;
- P2DIR &= ~P2DIR_PRIPO;
- P2DIR |= HAL_UART_PRIPO;
- #if (HAL_UART_DMA == 1)
- PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0.
- #else
- PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1.
- #endif
- PxSEL |= UxRX_TX; // Enable Tx and Rx peripheral functions on pins.
- ADCCFG &= ~UxRX_TX; // Make sure ADC doesnt use this.
- UxCSR = CSR_MODE; // Mode is UART Mode.
- UxUCR = UCR_FLUSH; // Flush it.
- // Setup Tx by DMA.
- ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX );
- // The start address of the destination.
- HAL_DMA_SET_DEST( ch, DMA_UDBUF );
- // Using the length field to determine how many bytes to transfer.
- HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN );
- // One byte is transferred each time.
- HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE );
- // The bytes are transferred 1-by-1 on Tx Complete trigger.
- HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE );
- HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX );
- // The source address is incremented by 1 byte after each transfer.
- HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 );
- // The destination address is constant - the Tx Data Buffer.
- HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 );
- // The DMA Tx done is serviced by ISR in order to maintain full thruput.
- HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE );
- // Xfer all 8 bits of a byte xfer.
- HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS );
- // DMA has highest priority for memory access.
- HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );
- // Setup Rx by DMA.
- ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX );
- // The start address of the source.
- HAL_DMA_SET_SOURCE( ch, DMA_UDBUF );
- // Using the length field to determine how many bytes to transfer.
- HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN );
- /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx.
- * The byte after the Rx Data Buffer is the Baud Cfg Register,
- * which always has a known value. So init Rx buffer to inverse of that
- * known value. DMA word xfer will flip the bytes, so every valid Rx byte
- * in the Rx buffer will be preceded by a DMA_PAD char equal to the
- * Baud Cfg Register value.
- */
- HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD );
- // The bytes are transferred 1-by-1 on Rx Complete trigger.
- HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED );
- HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX );
- // The source address is constant - the Rx Data Buffer.
- HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 );
- // The destination address is incremented by 1 word after each transfer.
- HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 );
- HAL_DMA_SET_DEST( ch, dmaCfg.rxBuf );
- HAL_DMA_SET_LEN( ch, HAL_UART_DMA_RX_MAX );
- // The DMA is to be polled and shall not issue an IRQ upon completion.
- HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE );
- // Xfer all 8 bits of a byte xfer.
- HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS );
- // DMA has highest priority for memory access.
- HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );
- }
6、紧接着需要配置串口
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = SERIAL_APP_BAUD;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = SERIAL_APP_RX_SZ; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = SERIAL_APP_TX_SZ; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = SerialApp_CallBack;
HalUARTOpen (UART0, &uartConfig);
7、进入HalUARTOpen (UART0, &uartConfig);
#if (HAL_UART_DMA == 1)
if (port == HAL_UART_PORT_0) HalUARTOpenDMA(config);
#endif
8、进入HalUARTOpenDMA(config);
- /******************************************************************************
- * @fn HalUARTOpenDMA
- *
- * @brief Open a port according tp the configuration specified by parameter.
- *
- * @param config - contains configuration information
- *
- * @return none
- *****************************************************************************/
- static void HalUARTOpenDMA(halUARTCfg_t *config)
- {
- dmaCfg.uartCB = config->callBackFunc;
- // Only supporting subset of baudrate for code size - other is possible.
- HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) ||
- (config->baudRate == HAL_UART_BR_19200) ||
- (config->baudRate == HAL_UART_BR_38400) ||
- (config->baudRate == HAL_UART_BR_57600) ||
- (config->baudRate == HAL_UART_BR_115200));
- if (config->baudRate == HAL_UART_BR_57600 ||
- config->baudRate == HAL_UART_BR_115200)
- {
- UxBAUD = ;
- }
- else
- {
- UxBAUD = ;
- }
- switch (config->baudRate)
- {
- case HAL_UART_BR_9600:
- UxGCR = ;
- dmaCfg.txTick = ; // (32768Hz / (9600bps / 10 bits))
- // 10 bits include start and stop bits.
- break;
- case HAL_UART_BR_19200:
- UxGCR = ;
- dmaCfg.txTick = ;
- break;
- case HAL_UART_BR_38400:
- UxGCR = ;
- dmaCfg.txTick = ;
- break;
- case HAL_UART_BR_57600:
- UxGCR = ;
- dmaCfg.txTick = ;
- break;
- default:
- // HAL_UART_BR_115200
- UxGCR = ;
- dmaCfg.txTick = ;
- break;
- }
- // 8 bits/char; no parity; 1 stop bit; stop bit hi.
- if (config->flowControl)
- {
- UxUCR = UCR_FLOW | UCR_STOP;
- PxSEL |= HAL_UART_Px_CTS;
- // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the Rx
- // buffer level. Start by allowing flow.
- PxOUT &= ~HAL_UART_Px_RTS;
- PxDIR |= HAL_UART_Px_RTS;
- }
- else
- {
- UxUCR = UCR_STOP;
- }
- dmaCfg.rxBuf[] = *(volatile uint8 *)DMA_UDBUF; // Clear the DMA Rx trigger.
- HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX);
- HAL_DMA_ARM_CH(HAL_DMA_CH_RX);
- osal_memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*);
- UxCSR |= CSR_RE;
- UxDBUF = ; // Prime the DMA-ISR pump.
- // Initialize that TX DMA is not pending
- dmaCfg.txDMAPending = FALSE;
- dmaCfg.txShdwValid = FALSE;
- }
9、至此就可以正常使用该串口了,但是具体如何调用呢,有如下函数
z-stack协议uart分析(DMA)的更多相关文章
- 协议形式化分析Scyther 资料整理
1.性能分析 目前来说形式化的分析已经成为安全协议的一种很流行的方法,但是每种工具都用其不同适合的协议,Scyther软件是一种形式化分析工具,极大的促进了协议的分析和设计,scyther工具在运行界 ...
- capwap协议重点分析
一. CAPWAP概述 CAPWAP由两个部分组成:CAPWAP协议和无线BINDING协议. (1)CAPWAP协议是一个通用的隧道协议,完成AP发现AC等基本协议功能,和具体的无线接入技术 ...
- Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...
- NS2仿真:两个移动节点网络连接及协议性能分析
NS2仿真实验报告2 实验名称:两个移动节点网络连接及协议性能分析 实验日期:2015年3月9日~2015年3月14日 实验报告日期:2015年3月15日 一.实验环境(网络平台,操作系统,网络拓扑图 ...
- 基于byte[]的HTTP协议头分析代码
smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 基于byte[]的HTTP协议头分析代码 最近需要为组件实现一个HTTP的扩展包,所以简单地实现 ...
- tsung HTTP协议统计报告分析
tsung HTTP协议统计报告分析 by:授客 QQ:1033553122 1. Main Static l higest 10sec mean: 基于每10s的统计,最大耗时 l lowe ...
- [转帖]InfiniBand技术和协议架构分析
InfiniBand技术和协议架构分析 2017年06月06日 20:54:16 Hardy晗狄 阅读数:15207 标签: 云计算存储Infiniband 更多 个人分类: 存储云计算 版权声明 ...
- am335x uart分析
/************************************************************ * am335x uart分析 * 本文记录am335x uart驱动的注册 ...
- OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...
随机推荐
- Javascript操作DOM常用API总结
基本概念 在讲解操作DOM的api之前,首先我们来复习一下一些基本概念,这些概念是掌握api的关键,必须理解它们. Node类型 DOM1级定义了一个Node接口,该接口由DOM中所有节点类型实现.这 ...
- Excel—利用散点图计算相关系数
1.建立数组 2.创建散点图. 3.添加趋势线. 4.设立为线性函数,勾选显示公式.显示R^2值,R即为相关系数. 5. 备注:此外也可以使用=CORREL()函数对相关系数进行求值.其结果是一致的.
- 【Matlab】特征值
特征值 clc;clear; %[V,D]=eig(A) //求取特征值 A=[ 1 2 4; 4 0 7; 9 1 3 ]; [V,D]=eig(A) 结果如下: 求解特征值与特征向量时矩阵必须是方 ...
- 信息安全比赛总结(21ic转帖)
我们的题目是基于这个ZedBoard的__视频流的人脸识别识别的算法采用的是PCA,,但是在后期的调试和实验中发现,,PCA的效果很容易受到环境,比如光照强度,背景,摄像头像素等影响:如果后期的改进的 ...
- Mysql字符转义
在字符串中,某些序列具有特殊含义.这些序列均用反斜线('\')开始,即所谓的转义字符.MySQL识别下面的转义序列: \0 ASCII 0(NUL)字符. \' 单引号('''). \" 双 ...
- ASP.NET上实现
ASP.NET上实现 fengzhuang.cs: using System;using System.Collections.Generic;using System.Linq;using Syst ...
- linux第二天
由于今天公司事情比较多,今天基本没有自学.了解了一下type命令:主要是显示命令类型的命令.linux命令分为内置命令和外部命令两种.内置命令就shell内置的命令,外部命令,就是需要有系统存在一个名 ...
- DuBrute 3.1
PS:转载自小残博客. 今天发现时隔很久的DuBrute竟然更新了,为此我在分享给大家,软件我没测试效果,使用过的朋友或许很清楚,不会太差! 曾几何时,小残也在用DUbrute爆破工具,且玩的不亦乐乎 ...
- HTML5本地存储
之前对这个还不太熟悉,项目中在账号登录时,获取账号的信息,存储在本地然后随时调用//存储localStorage.setItem('data',值); //获取var information = lo ...
- oracle 学习笔记(一)
1. 数据库原理 1.1. 数据库简介 1.1.1. 文件存储 对数据的存储需求一直存在.保存数据的方式,经历了手工管理.文件管理等阶段,直至数据库管理阶段. 文件存储方式保存数据的弊端: 缺乏对数据 ...