完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
uint8_t DMADataBuffer[200]; //DMA数据缓存 DMA每次传送一行数据
//0x400ff052时PORTB PDIR 16-23位 的寄存器地址 移植时 需要修改 具体参看K10英文DATASHEET DMA_Init(1,51,(uint32_t)0x400ff052,(uint32_t)DMADataBuffer,1,0,0,1,-200,1,200); //******************************************************************************** //函数名:DMA_Init //参 数:ch 代表通道,0~15 // touch 引起dma请求的触发源 2~63见参考手册85页 // sa 源地址;da 目的地地址; // len 传输多少的字节数 // soff 源地址传一次地址偏移量,0代表源地址不变,1代表源地址每次加1 // slen 传输完成后源地址指针返回 // doff 目标地址传输一次地址偏移量,0代表目标地址不变,1代表目标地址每次加1 // dlen 传输完成后目标指针返回 // mode dma工作模式选择,0代表dma软件启动传输;1表示通道触发传输;2表示pit周期性触发此时ch取值0~3 // counter 小的循环次数,最多255次(因变量定义问题) // 默认配置每次移动1字节,不设置优先级 ,主循环传输完成后产生中断 // 注意:在使用地址时加强制转换,一次传输8位,当counter=1时len可以>1,如果counter>1则len只能等于1,目前测试其它不稳定 //目前此函数可以进行数组到数组的传递,数到数组的传递,固定地址到变化地址的传递等,只要合理的配置地址指针就可以实现 // 目前不能进行pit周期性触发 //日期:2012年2月21日 //////////////////////////////////////////// void DMA_Init(uint8_t ch,uint8_t touch,uint32_t sa,uint32_t da,uint32_t len,uint8_t soff,int8_t slen,uint8_t doff,int8_t dlen,uint8_t mode,uint32_t counter) { SIM->SCGC7|=SIM_SCGC7_DMA_MASK;//开启DMA模块时钟,见参考手册272页 DMA0->TCD[ch].NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(len);//配置数据传输的多少字节,见手册447页 DMA0->TCD[ch].SADDR=DMA_SADDR_SADDR(sa); //设置源地址, 见参考手册445页 DMA0->TCD[ch].SOFF=DMA_SOFF_SOFF(soff); //配置通道的地址偏移量为每次加1个地址 见参考手册446页 DMA0->TCD[ch].ATTR=(DMA_ATTR_SMOD(0)|DMA_ATTR_SSIZE(0x0)|DMA_ATTR_DMOD(0)|DMA_ATTR_DSIZE(0x0));//配置通道的属性一次8位 见参考手册446页 DMA0->TCD[ch].SLAST=DMA_SLAST_SLAST(slen);//设置数据完成后指针不返回,见参考手册450页 DMA0->TCD[ch].DADDR=DMA_DADDR_DADDR(da) ; //设置目的地址,见参考手册450页 DMA0->TCD[ch].DOFF=DMA_DOFF_DOFF(doff); //目标地址每次传输偏移量,见参考手册451页 DMA0->TCD[ch].DLAST_SGA=DMA_DLAST_SGA_DLASTSGA(dlen);//完毕后目标地址不返回,见参考手册453页 DMA0->TCD[ch].CSR|=(DMA_CSR_INTMAJOR_MASK|DMA_CSR_DREQ_MASK); //见参考手册455页 switch(ch) { case 0: NVIC_EnableIRQ(DMA0_IRQn);break; //开启中断标号 case 1: NVIC_EnableIRQ(DMA1_IRQn);break; //开启中断标号 case 2: NVIC_EnableIRQ(DMA2_IRQn);break; //开启中断标号 case 3: NVIC_EnableIRQ(DMA3_IRQn);break; //开启中断标号 case 4: NVIC_EnableIRQ(DMA4_IRQn);break; //开启中断标号 case 5: NVIC_EnableIRQ(DMA5_IRQn);break; //开启中断标号 case 6: NVIC_EnableIRQ(DMA6_IRQn);break; //开启中断标号 case 7: NVIC_EnableIRQ(DMA7_IRQn);break; //开启中断标号 /*请根据上述方式自己加到15*/ } DMA0->TCD[ch].CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(counter); //见参考手册452页 DMA0->TCD[ch].BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(counter);//配置主循环为1次,见手册457页 if(mode==0) { } if(mode==1) { //通道触发,没有周期性触发的功能 DMA0->SERQ|=DMA_SERQ_SERQ(ch);//开启对应通道ch使能,见参考手册433页 SIM->SCGC6|=SIM_SCGC6_DMAMUX_MASK ; //开启DMAMUX模块时钟,见参考手册271页 DMAMUX->CHCFG[ch]|=DMAMUX_CHCFG_SOURCE(touch) ; //设置ch通道触发源,见参考手册395页 DMAMUX->CHCFG[ch]|=(DMAMUX_CHCFG_ENBL_MASK); // 使能DMA-ch通道,见参考手册395页 } if(mode==2) { //通道触发,带有周期性触发的功能 (此功能没有实现,原因不明) DMA0->SERQ|=DMA_SERQ_SERQ(ch);//开启对应通道ch使能,见参考手册433页 SIM->SCGC6|=SIM_SCGC6_DMAMUX_MASK ; //开启DMAMUX模块时钟,见参考手册271页 DMAMUX->CHCFG[ch]|=(DMAMUX_CHCFG_ENBL_MASK|DMAMUX_CHCFG_TRIG_SHIFT|DMAMUX_CHCFG_SOURCE(touch)); //使能DMA-ch通道及pit周期性触发,见参考手册395页 } } 编译后会出现integer conversion resulted in truncation这个warning,在此处DMA_Init(1,51,(uint32_t)0x400ff052,(uint32_t)DMADataBuffer,1,0,0,1,-200,1,200);求解答。 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
imx6ull裸机编程,使用宏定义无法驱动,使用指针就可以驱动
227 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十二章 音频FFT实验
186 浏览 0 评论
飞凌嵌入式ElfBoard EL 1板卡-i2c与从设备通讯编程示例之i2c-tools工具使用
1243 浏览 0 评论
stc15f2k60s2利用串口传输字模存储到eeprom并进行点阵显示
1567 浏览 1 评论
1540 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11614 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 09:00 , Processed in 0.684419 second(s), Total 67, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号