完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 chengxiyue 于 2015-3-25 15:42 编辑
void DMAC_DataTransfer(void) { /* Enable the DMAC */ R_DMAC0_Start(); /* Start UART0 operations */ R_UART0_Start(); /* Wait for transfers to complete */ while(gDMAC_Transfer != 0x1) { /* Transmit a byte from the data buffer */ TXD0 = gDMAC_DataBuff[gTransfer_Count]; /* Wait for end of UART transmit */ while(STIF0 == 0); /* Check if the last byte in the buffer has been transmitted */ if(gTransfer_Count++ == 0xF) { /* Reset count */ gTransfer_Count = 0; } } /* Inform the user that the specified number of transfers has been reached */ DisplayString(LCD_LINE2, " END "); } 就是这一段,DMA启动后会自动把内存中该地址的数据一个一个的送往目标地址,这个例子程序中查询后还继续给目标地址赋值是多此一举,正确的根据手册应该在第一次启动时只赋值一次后面DMA会自动传递数据。正确的应该是这样已经测试通过 void DMA_Config(uint16_t *RAM_ADDRESS,uint16_t cnt) { DRC0 = _80_DMA_OPERATION_ENABLE; NOP(); NOP(); DMAMK0 = 1U; /* disable INTDMA0 interrupt */ DMAIF0 = 0U; /* clear INTDMA0 interrupt flag */ /* Set INTDMA0 high priority */ DMAPR10 = 0U; DMAPR00 = 0U; //DMA priority is low DMC0 = _40_DMA_TRANSFER_DIR_RAM2SFR | _00_DMA_DATA_SIZE_8 | _06_DMA_TRIGGER_ST0_CSI00; DSA0 = 0x10; // DMA SFR_ADDRESS TXD0 DRA0 =RAM_ADDRESS;// 0xefc7; //DMA Ram address DBC0 =cnt;//cnt;// _0020_DMA0_BYTE_COUNT; DMA Buffer size DEN0 = 0U; /* disable DMA0 operation */ } void DMA1_USART1_SEND(uint8_t *Buff,uint16_t len) { DMA_Config(Buff+1,len);//DMA Channel 0, R_DMAC0_Start(); //start DMA R_UART0_Start(); //start uart /* Wait for transfers to complete */ TXD0 = Buff[gTransfer_Count]; /*while(gDMAC_Transfer != 0x1) { TXD0 = Buff[gTransfer_Count];// Transmit a byte from the data buffer while(STIF0 == 0);// Wait for end of UART transmit if(gTransfer_Count++ ==len)//Check if the last byte in the buffer has been transmitted { gTransfer_Count = 0;//Reset count } } gDMAC_Transfer = 0; */ } __interrupt static void r_dmac0_interrupt(void) { /* Set flag to indicate end of transfers */ gDMAC_Transfer = 0x1; /* Clear DMAC interrupt flag */ DMAIF0 = 0; //R_DMAC0_Stop(); //transfer complete ,stop DMA } DMA用代码生成器出来的程序使用的话很不方便,因为RAM地址在代码生成器中只能设置一次,不能灵活发送除指定RAM地址数组以外地址的数据,所以编写 DMA_Config(uint16_t *RAM_ADDRESS,uint16_t cnt)第一个参数传送进去RAM地址,第二个参数传送进去DMA数据缓冲区大小,DMA方向是RAM->SFR.这样可以很方便的把该函数作为串口发送函数,传送任意地址自定义的数据。 目标寄存器地址修改这个DSA0 = 0x10;赋值时只赋目标寄存器低8位地址。 |
|
相关推荐
2 个讨论
|
|
是这样的 说的很有道理~~
|
|
|
|
|
|
谢谢分享,大赞!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)PWM输出+ADC采集
765 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】尝试嵌入式操作系统Free-RTOS
1588 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】触摸按钮尝试
697 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】IIC 通信的 OLED 显示
664 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】原创测量代码运行时间
552 浏览 0 评论
【试用答疑】RA-Eco-RA4M2-100PIN开发板试用活动答疑帖
5079浏览 4评论
1740浏览 4评论
4208浏览 3评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】RA0E1-32PIN-V1.0开发板测试一下点灯
2298浏览 3评论
【RA4M2设计挑战赛】智慧农业监测RA4M2采集数据上传阿里云
1552浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 20:10 , Processed in 0.484317 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号