打印
[Cortex-M0技术交流]

RyanHsiung学习第六贴, PDMA小试,用PDMA接收串口数据!!

[复制链接]
3557|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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
void PDMA0_Configuration (void)
{
        STR_PDMA_T sPDMA;
        uint32_t UARTPort;
       
        DrvPDMA_Init();                                                                                // 初始化PDMA(PDMA 控制器时钟使能控制)
        UARTPort = UART0_BASE;                                                           //
        DrvPDMA_SetCHForAPBDevice(eDRVPDMA_CHANNEL_0, eDRVPDMA_UART0, eDRVPDMA_READ_APB);// APB设备选择 PDMA 通道 SPI选择PDMA通道0 读操作
        //DrvPDMA_SetCHForAPBDevice(eDRVPDMA_CHANNEL_1,eDRVPDMA_UART1,eDRVPDMA_WRITE_APB);
        sPDMA.sSrcCtrl.u32Addr = UARTPort;                                         // 选择DMA 操作的源地址  
        sPDMA.sDestCtrl.u32Addr = (uint32_t)DestArray;                 // 选择DMA 操作目标地址
        sPDMA.u8TransWidth =         eDRVPDMA_WIDTH_8BITS;                 // 传输宽度
        sPDMA.u8Mode = eDRVPDMA_MODE_APB2MEM;                                 // 操作模式: IP到存储器模式 (APB-to-Memory)
        sPDMA.sSrcCtrl.eAddrDirection = eDRVPDMA_DIRECTION_FIXED;                         // 传输地址固定
        sPDMA.sDestCtrl.eAddrDirection = eDRVPDMA_DIRECTION_INCREMENTED;        // 传输地址 持续增加
        sPDMA.i32ByteCnt = 10;                                                         // 字节数
        DrvPDMA_Open(eDRVPDMA_CHANNEL_0, &sPDMA);                        // 配置 并打开PDMA1
        DrvPDMA_EnableInt(eDRVPDMA_CHANNEL_0, eDRVPDMA_BLKD);                                // 使能PDMA通道0中断 中断源为:eDRVPDMA_BLKD(PDMA Transfer Done 中断使能)
         

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

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

PDMA.png (9.09 KB )

PDMA.png

UART(PDMA) For RyanHsiung Study.rar

1.97 MB

评分
参与人数 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的更实用。
谢谢!

使用特权

评论回复
5
Ryanhsiung|  楼主 | 2011-10-17 07:53 | 只看该作者
5# hotpower 不敢 :lol

使用特权

评论回复
6
Ryanhsiung|  楼主 | 2011-10-18 19:33 | 只看该作者
自己顶一下

使用特权

评论回复
7
564451696| | 2011-10-25 09:42 | 只看该作者
这个要顶。。

使用特权

评论回复
8
Lynnplay| | 2011-11-10 13:24 | 只看该作者
顶!!学习了~~

使用特权

评论回复
9
hotpower| | 2011-11-10 16:41 | 只看该作者
学习就要如此“反汇编”,要看透原作者的意图,将其精华为己用才是真。

使用特权

评论回复
10
qtmm| | 2012-12-25 16:45 | 只看该作者
请问你上面那个调试的窗口(就是那个写着接收设置 发送缓冲区的那个)哪里有这个软件啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

64

主题

4653

帖子

14

粉丝