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通道等

  1. /******************************************************************************
  2. * @fn HalUARTInitDMA
  3. *
  4. * @brief Initialize the UART
  5. *
  6. * @param none
  7. *
  8. * @return none
  9. *****************************************************************************/
  10. static void HalUARTInitDMA(void)
  11. {
  12. halDMADesc_t *ch;
  13.  
  14. P2DIR &= ~P2DIR_PRIPO;
  15. P2DIR |= HAL_UART_PRIPO;
  16.  
  17. #if (HAL_UART_DMA == 1)
  18. PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O to Alt. 1 location on P0.
  19. #else
  20. PERCFG |= HAL_UART_PERCFG_BIT; // Set UART1 I/O to Alt. 2 location on P1.
  21. #endif
  22. PxSEL |= UxRX_TX; // Enable Tx and Rx peripheral functions on pins.
  23. ADCCFG &= ~UxRX_TX; // Make sure ADC doesnt use this.
  24. UxCSR = CSR_MODE; // Mode is UART Mode.
  25. UxUCR = UCR_FLUSH; // Flush it.
  26.  
  27. // Setup Tx by DMA.
  28. ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX );
  29.  
  30. // The start address of the destination.
  31. HAL_DMA_SET_DEST( ch, DMA_UDBUF );
  32.  
  33. // Using the length field to determine how many bytes to transfer.
  34. HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN );
  35.  
  36. // One byte is transferred each time.
  37. HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE );
  38.  
  39. // The bytes are transferred 1-by-1 on Tx Complete trigger.
  40. HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE );
  41. HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX );
  42.  
  43. // The source address is incremented by 1 byte after each transfer.
  44. HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 );
  45.  
  46. // The destination address is constant - the Tx Data Buffer.
  47. HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 );
  48.  
  49. // The DMA Tx done is serviced by ISR in order to maintain full thruput.
  50. HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_ENABLE );
  51.  
  52. // Xfer all 8 bits of a byte xfer.
  53. HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS );
  54.  
  55. // DMA has highest priority for memory access.
  56. HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );
  57.  
  58. // Setup Rx by DMA.
  59. ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX );
  60.  
  61. // The start address of the source.
  62. HAL_DMA_SET_SOURCE( ch, DMA_UDBUF );
  63.  
  64. // Using the length field to determine how many bytes to transfer.
  65. HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN );
  66.  
  67. /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx.
  68. * The byte after the Rx Data Buffer is the Baud Cfg Register,
  69. * which always has a known value. So init Rx buffer to inverse of that
  70. * known value. DMA word xfer will flip the bytes, so every valid Rx byte
  71. * in the Rx buffer will be preceded by a DMA_PAD char equal to the
  72. * Baud Cfg Register value.
  73. */
  74. HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD );
  75.  
  76. // The bytes are transferred 1-by-1 on Rx Complete trigger.
  77. HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE_REPEATED );
  78. HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX );
  79.  
  80. // The source address is constant - the Rx Data Buffer.
  81. HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 );
  82.  
  83. // The destination address is incremented by 1 word after each transfer.
  84. HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 );
  85. HAL_DMA_SET_DEST( ch, dmaCfg.rxBuf );
  86. HAL_DMA_SET_LEN( ch, HAL_UART_DMA_RX_MAX );
  87.  
  88. // The DMA is to be polled and shall not issue an IRQ upon completion.
  89. HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE );
  90.  
  91. // Xfer all 8 bits of a byte xfer.
  92. HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS );
  93.  
  94. // DMA has highest priority for memory access.
  95. HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );
  96. }

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);

  1. /******************************************************************************
  2. * @fn HalUARTOpenDMA
  3. *
  4. * @brief Open a port according tp the configuration specified by parameter.
  5. *
  6. * @param config - contains configuration information
  7. *
  8. * @return none
  9. *****************************************************************************/
  10. static void HalUARTOpenDMA(halUARTCfg_t *config)
  11. {
  12. dmaCfg.uartCB = config->callBackFunc;
  13. // Only supporting subset of baudrate for code size - other is possible.
  14. HAL_UART_ASSERT((config->baudRate == HAL_UART_BR_9600) ||
  15. (config->baudRate == HAL_UART_BR_19200) ||
  16. (config->baudRate == HAL_UART_BR_38400) ||
  17. (config->baudRate == HAL_UART_BR_57600) ||
  18. (config->baudRate == HAL_UART_BR_115200));
  19.  
  20. if (config->baudRate == HAL_UART_BR_57600 ||
  21. config->baudRate == HAL_UART_BR_115200)
  22. {
  23. UxBAUD = ;
  24. }
  25. else
  26. {
  27. UxBAUD = ;
  28. }
  29.  
  30. switch (config->baudRate)
  31. {
  32. case HAL_UART_BR_9600:
  33. UxGCR = ;
  34. dmaCfg.txTick = ; // (32768Hz / (9600bps / 10 bits))
  35. // 10 bits include start and stop bits.
  36. break;
  37. case HAL_UART_BR_19200:
  38. UxGCR = ;
  39. dmaCfg.txTick = ;
  40. break;
  41. case HAL_UART_BR_38400:
  42. UxGCR = ;
  43. dmaCfg.txTick = ;
  44. break;
  45. case HAL_UART_BR_57600:
  46. UxGCR = ;
  47. dmaCfg.txTick = ;
  48. break;
  49. default:
  50. // HAL_UART_BR_115200
  51. UxGCR = ;
  52. dmaCfg.txTick = ;
  53. break;
  54. }
  55.  
  56. // 8 bits/char; no parity; 1 stop bit; stop bit hi.
  57. if (config->flowControl)
  58. {
  59. UxUCR = UCR_FLOW | UCR_STOP;
  60. PxSEL |= HAL_UART_Px_CTS;
  61. // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the Rx
  62. // buffer level. Start by allowing flow.
  63. PxOUT &= ~HAL_UART_Px_RTS;
  64. PxDIR |= HAL_UART_Px_RTS;
  65. }
  66. else
  67. {
  68. UxUCR = UCR_STOP;
  69. }
  70.  
  71. dmaCfg.rxBuf[] = *(volatile uint8 *)DMA_UDBUF; // Clear the DMA Rx trigger.
  72. HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_RX);
  73. HAL_DMA_ARM_CH(HAL_DMA_CH_RX);
  74. osal_memset(dmaCfg.rxBuf, (DMA_PAD ^ 0xFF), HAL_UART_DMA_RX_MAX*);
  75.  
  76. UxCSR |= CSR_RE;
  77. UxDBUF = ; // Prime the DMA-ISR pump.
  78.  
  79. // Initialize that TX DMA is not pending
  80. dmaCfg.txDMAPending = FALSE;
  81. dmaCfg.txShdwValid = FALSE;
  82. }

9、至此就可以正常使用该串口了,但是具体如何调用呢,有如下函数

z-stack协议uart分析(DMA)的更多相关文章

  1. 协议形式化分析Scyther 资料整理

    1.性能分析 目前来说形式化的分析已经成为安全协议的一种很流行的方法,但是每种工具都用其不同适合的协议,Scyther软件是一种形式化分析工具,极大的促进了协议的分析和设计,scyther工具在运行界 ...

  2. capwap协议重点分析

    一.     CAPWAP概述 CAPWAP由两个部分组成:CAPWAP协议和无线BINDING协议. (1)CAPWAP协议是一个通用的隧道协议,完成AP发现AC等基本协议功能,和具体的无线接入技术 ...

  3. Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析

    本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...

  4. NS2仿真:两个移动节点网络连接及协议性能分析

    NS2仿真实验报告2 实验名称:两个移动节点网络连接及协议性能分析 实验日期:2015年3月9日~2015年3月14日 实验报告日期:2015年3月15日 一.实验环境(网络平台,操作系统,网络拓扑图 ...

  5. 基于byte[]的HTTP协议头分析代码

    smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 基于byte[]的HTTP协议头分析代码 最近需要为组件实现一个HTTP的扩展包,所以简单地实现 ...

  6. tsung HTTP协议统计报告分析

    tsung HTTP协议统计报告分析 by:授客 QQ:1033553122 1.   Main Static l  higest 10sec mean: 基于每10s的统计,最大耗时 l  lowe ...

  7. [转帖]InfiniBand技术和协议架构分析

    InfiniBand技术和协议架构分析 2017年06月06日 20:54:16 Hardy晗狄 阅读数:15207 标签: 云计算存储Infiniband 更多 个人分类: 存储云计算   版权声明 ...

  8. am335x uart分析

    /************************************************************ * am335x uart分析 * 本文记录am335x uart驱动的注册 ...

  9. OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法

    OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...

随机推荐

  1. Javascript操作DOM常用API总结

    基本概念 在讲解操作DOM的api之前,首先我们来复习一下一些基本概念,这些概念是掌握api的关键,必须理解它们. Node类型 DOM1级定义了一个Node接口,该接口由DOM中所有节点类型实现.这 ...

  2. Excel—利用散点图计算相关系数

    1.建立数组 2.创建散点图. 3.添加趋势线. 4.设立为线性函数,勾选显示公式.显示R^2值,R即为相关系数. 5. 备注:此外也可以使用=CORREL()函数对相关系数进行求值.其结果是一致的.

  3. 【Matlab】特征值

    特征值 clc;clear; %[V,D]=eig(A) //求取特征值 A=[ 1 2 4; 4 0 7; 9 1 3 ]; [V,D]=eig(A) 结果如下: 求解特征值与特征向量时矩阵必须是方 ...

  4. 信息安全比赛总结(21ic转帖)

    我们的题目是基于这个ZedBoard的__视频流的人脸识别识别的算法采用的是PCA,,但是在后期的调试和实验中发现,,PCA的效果很容易受到环境,比如光照强度,背景,摄像头像素等影响:如果后期的改进的 ...

  5. Mysql字符转义

    在字符串中,某些序列具有特殊含义.这些序列均用反斜线('\')开始,即所谓的转义字符.MySQL识别下面的转义序列: \0 ASCII 0(NUL)字符. \' 单引号('''). \" 双 ...

  6. ASP.NET上实现

    ASP.NET上实现 fengzhuang.cs: using System;using System.Collections.Generic;using System.Linq;using Syst ...

  7. linux第二天

    由于今天公司事情比较多,今天基本没有自学.了解了一下type命令:主要是显示命令类型的命令.linux命令分为内置命令和外部命令两种.内置命令就shell内置的命令,外部命令,就是需要有系统存在一个名 ...

  8. DuBrute 3.1

    PS:转载自小残博客. 今天发现时隔很久的DuBrute竟然更新了,为此我在分享给大家,软件我没测试效果,使用过的朋友或许很清楚,不会太差! 曾几何时,小残也在用DUbrute爆破工具,且玩的不亦乐乎 ...

  9. HTML5本地存储

    之前对这个还不太熟悉,项目中在账号登录时,获取账号的信息,存储在本地然后随时调用//存储localStorage.setItem('data',值); //获取var information = lo ...

  10. oracle 学习笔记(一)

    1. 数据库原理 1.1. 数据库简介 1.1.1. 文件存储 对数据的存储需求一直存在.保存数据的方式,经历了手工管理.文件管理等阶段,直至数据库管理阶段. 文件存储方式保存数据的弊端: 缺乏对数据 ...