[Cortex-M0技术交流] RyanHsiung学习第六贴, PDMA小试,用PDMA接收串口数据!!

[复制链接]
 楼主| Ryanhsiung 发表于 2011-10-15 17:29 | 显示全部楼层 |阅读模式
本帖最后由 Ryanhsiung 于 2011-10-15 17:32 编辑

DMA这个功能在高速处理大量数据,非常的重要。所以这个是必须玩的!
声明:
   //本文为抄袭Swallow_0322之作  https://bbs.21ic.com/icview-235493-1-1.html,:HOT大叔NUC120助学板第十一贴----SPI(PDMA方式)
   这里谢谢Swallow_0322 网友的例程,

盗版之处:
   1、简化了一些操作,去掉了DMA1通道只留了DMA0
   2、将其变更为UART串口事件驱动
   3、DMA操作完成后,返回刚接收到的数据
DMA使用注意:
   1 、要注意 使能相应外设 PDMA  功能 (DrvUART_EnablePDMA(UART_PORT0);)
缺点:
   1、若是有PING-PONG操作最好,可以不间断的使用DMA
  1. void PDMA0_Configuration (void)
  2. {
  3.         STR_PDMA_T sPDMA;
  4.         uint32_t UARTPort;
  5.        
  6.         DrvPDMA_Init();                                                                                // 初始化PDMA(PDMA 控制器时钟使能控制)
  7.         UARTPort = UART0_BASE;                                                           //
  8.         DrvPDMA_SetCHForAPBDevice(eDRVPDMA_CHANNEL_0, eDRVPDMA_UART0, eDRVPDMA_READ_APB);// APB设备选择 PDMA 通道 SPI选择PDMA通道0 读操作
  9.         //DrvPDMA_SetCHForAPBDevice(eDRVPDMA_CHANNEL_1,eDRVPDMA_UART1,eDRVPDMA_WRITE_APB);
  10.         sPDMA.sSrcCtrl.u32Addr = UARTPort;                                         // 选择DMA 操作的源地址  
  11.         sPDMA.sDestCtrl.u32Addr = (uint32_t)DestArray;                 // 选择DMA 操作目标地址
  12.         sPDMA.u8TransWidth =         eDRVPDMA_WIDTH_8BITS;                 // 传输宽度
  13.         sPDMA.u8Mode = eDRVPDMA_MODE_APB2MEM;                                 // 操作模式: IP到存储器模式 (APB-to-Memory)
  14.         sPDMA.sSrcCtrl.eAddrDirection = eDRVPDMA_DIRECTION_FIXED;                         // 传输地址固定
  15.         sPDMA.sDestCtrl.eAddrDirection = eDRVPDMA_DIRECTION_INCREMENTED;        // 传输地址 持续增加
  16.         sPDMA.i32ByteCnt = 10;                                                         // 字节数
  17.         DrvPDMA_Open(eDRVPDMA_CHANNEL_0, &sPDMA);                        // 配置 并打开PDMA1
  18.         DrvPDMA_EnableInt(eDRVPDMA_CHANNEL_0, eDRVPDMA_BLKD);                                // 使能PDMA通道0中断 中断源为:eDRVPDMA_BLKD(PDMA Transfer Done 中断使能)
  19.          

  20.         DrvPDMA_InstallCallBack(eDRVPDMA_CHANNEL_0, eDRVPDMA_BLKD, (PFN_DRVPDMA_CALLBACK) PDMA0_Callback );         // PDMA 通道0 安装中断回调函数
  21.         DrvUART_EnablePDMA(UART_PORT0);                                                // 使能相应外设 PDMA  功能
  22.         DrvPDMA_CHEnableTransfer(eDRVPDMA_CHANNEL_0);                 // 使能PDMA通道0         csr.trig_en位置1 ,传输完成后自动清0
  23. }

DMA接收完成后,返回相应数据,并从新打开DMA
  1. void PDMA0_Callback(void)
  2. {
  3.         printf("当次:%x、%x、%x、%x、%x、%x、%x、%x、%x、%x\n",DestArray[0],DestArray[1],DestArray[2]\
  4.         ,DestArray[3],DestArray[4],DestArray[5],DestArray[6],DestArray[7],DestArray[8],DestArray[9] );               
  5.        
  6.         DrvPDMA_CHEnableTransfer(eDRVPDMA_CHANNEL_0);        //使能PDMA通道0        从新开始接收
  7. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +1 收起 理由
x181084431 + 1 简洁明了

查看全部评分

Swallow_0322 发表于 2011-10-16 11:04 | 显示全部楼层
顶!
x181084431 发表于 2011-10-16 21:19 | 显示全部楼层
网页上的代码看起来真不舒服!
  不过写得很简洁明了,一看明白了DMA人操作 不错的例程!
hotpower 发表于 2011-10-16 23:40 | 显示全部楼层
学习了,俺只做了spi的pdma,uart的更实用。
谢谢!
 楼主| Ryanhsiung 发表于 2011-10-17 07:53 | 显示全部楼层
5# hotpower 不敢 :lol
 楼主| Ryanhsiung 发表于 2011-10-18 19:33 | 显示全部楼层
自己顶一下
564451696 发表于 2011-10-25 09:42 | 显示全部楼层
这个要顶。。
Lynnplay 发表于 2011-11-10 13:24 | 显示全部楼层
顶!!学习了~~
hotpower 发表于 2011-11-10 16:41 | 显示全部楼层
学习就要如此“反汇编”,要看透原作者的意图,将其精华为己用才是真。
qtmm 发表于 2012-12-25 16:45 | 显示全部楼层
请问你上面那个调试的窗口(就是那个写着接收设置 发送缓冲区的那个)哪里有这个软件啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4653

帖子

14

粉丝
快速回复 在线客服 返回列表 返回顶部