完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一,DMA基础
二,寄存器设置 DMACTL0, DMA Control Register 0三,代码 Single transfer Block transfer Burst-block transfer #include void DMA0_Init(char DMA0_trigger,char Trans_Mode,char Source_Mode,char Dest_Mode, char Byte,unsigned int Source_Add,unsigned int Dest_Add, unsigned int Data_Size,char DMA_NVIC) { unsigned int DMAxCTL=0; switch (Trans_Mode) //设置DMA通道的传输模式 { case 0: DMAxCTL|= DMADT_0; break; //单次传输 case 1: DMAxCTL|= DMADT_1; break; //块传输 case 2: DMAxCTL|= DMADT_2; break; //突发传输 case 3: DMAxCTL|= DMADT_3; break; //突发传输 case 4: DMAxCTL|= DMADT_4; break; //突发传输 case 5: DMAxCTL|= DMADT_5; break; //单次重复 case 6: DMAxCTL|= DMADT_5; break; //块重复 case 7: DMAxCTL|= DMADT_5; break; //突发重复 } switch(Dest_Mode) { case 0: DMAxCTL|=DMADSTINCR_0 ;break; //目的地址不改变 case 1: DMAxCTL|=DMADSTINCR_1 ;break; //目的地址不改变 case 2: DMAxCTL|=DMADSTINCR_2 ;break; //目的地址减少 case 3: DMAxCTL|=DMADSTINCR_3 ;break; //目的地址增加 } switch(Source_Mode) { case 0: DMAxCTL|=DMASRCINCR_0 ;break; //源地址不改变 case 1: DMAxCTL|=DMASRCINCR_1 ;break; //源地址不改变 case 2: DMAxCTL|=DMASRCINCR_2 ;break; //源地址减少 case 3: DMAxCTL|=DMASRCINCR_3 ;break; //源地址增加 } switch(Byte) { case 0: break; case 1:DMAxCTL|=DMADSTBYTE+ DMASRCBYTE;break;//目的地址源地址都是同样字节传输 } if(DMA0_trigger==0) DMAxCTL|=DMAREQ;//定义软件触发开始 if(DMA_NVIC==1) {DMAxCTL&=~DMAIFG;DMAxCTL|=DMAIE;} /*开始设置*/ //DMACTL0, DMA Control Register0设置 DMACTL0|=DMA0_trigger; //DMACTL1, DMA Control Register 1 //DMA收到触发请求时,等待当前指令执行完成后 DMACTL1|= DMAONFETCH; //DMAxDA, DMA Destination Address Register设置 DMA0DA=Dest_Add; //DMAxSA, DMA Source Address Register设置 DMA0SA=Source_Add; //DMAxSZ, DMA Size Address Register设置 DMA0SZ=Data_Size; //DMAxCTL, DMA Channel x Control Registes设置r DMA0CTL |= DMAxCTL+DMAEN; // config } void DMA1_Init(char DMA1_trigger,char Trans_Mode,char Source_Mode,char Dest_Mode, char Byte,unsigned int Source_Add,unsigned int Dest_Add, unsigned int Data_Size,char DMA_NVIC) { unsigned int DMAxCTL=0; switch (Trans_Mode) //设置DMA通道的传输模式 { case 0: DMAxCTL|= DMADT_0; break; //单次传输 case 1: DMAxCTL|= DMADT_1; break; //块传输 case 2: DMAxCTL|= DMADT_2; break; //突发传输 case 3: DMAxCTL|= DMADT_3; break; //突发传输 case 4: DMAxCTL|= DMADT_4; break; //突发传输 case 5: DMAxCTL|= DMADT_5; break; //单次重复 case 6: DMAxCTL|= DMADT_5; break; //块重复 case 7: DMAxCTL|= DMADT_5; break; //突发重复 } switch(Dest_Mode) { case 0: DMAxCTL|=DMADSTINCR_0 ;break; //目的地址不改变 case 1: DMAxCTL|=DMADSTINCR_1 ;break; //目的地址不改变 case 2: DMAxCTL|=DMADSTINCR_2 ;break; //目的地址减少 case 3: DMAxCTL|=DMADSTINCR_3 ;break; //目的地址增加 } switch(Source_Mode) { case 0: DMAxCTL|=DMASRCINCR_0 ;break; //源地址不改变 case 1: DMAxCTL|=DMASRCINCR_1 ;break; //源地址不改变 case 2: DMAxCTL|=DMASRCINCR_2 ;break; //源地址减少 case 3: DMAxCTL|=DMASRCINCR_3 ;break; //源地址增加 } switch(Byte) { case 0: break; case 1:DMAxCTL|=DMADSTBYTE+ DMASRCBYTE;break;//目的地址源地址都是同样字节传输 } if(DMA1_trigger==0) DMAxCTL|=DMAREQ;//定义软件触发开始 if(DMA_NVIC==1) {DMAxCTL&=~DMAIFG;DMAxCTL|=DMAIE;} /*开始设置*/ //DMACTL0, DMA Control Register0设置 DMACTL0|=DMA1_trigger<<4; //DMACTL1, DMA Control Register 1 //DMA收到触发请求时,等待当前指令执行完成后 DMACTL1|= DMAONFETCH; //DMAxDA, DMA Destination Address Register设置 DMA1DA=Dest_Add; //DMAxSA, DMA Source Address Register设置 DMA1SA=Source_Add; //DMAxSZ, DMA Size Address Register设置 DMA1SZ=Data_Size; //DMAxCTL, DMA Channel x Control Registes设置r DMA1CTL |= DMAxCTL+DMAEN; // config } void DMA2_Init(char DMA2_trigger,char Trans_Mode,char Source_Mode, char Dest_Mode, char Byte,unsigned int Source_Add,unsigned int Dest_Add, unsigned int Data_Size,char DMA_NVIC) { unsigned int DMAxCTL=0; switch (Trans_Mode) //设置DMA通道的传输模式 { case 0: DMAxCTL|= DMADT_0; break; //单次传输 case 1: DMAxCTL|= DMADT_1; break; //块传输 case 2: DMAxCTL|= DMADT_2; break; //突发传输 case 3: DMAxCTL|= DMADT_3; break; //突发传输 case 4: DMAxCTL|= DMADT_4; break; //突发传输 case 5: DMAxCTL|= DMADT_5; break; //单次重复 case 6: DMAxCTL|= DMADT_5; break; //块重复 case 7: DMAxCTL|= DMADT_5; break; //突发重复 } switch(Dest_Mode) { case 0: DMAxCTL|=DMADSTINCR_0 ;break; //目的地址不改变 case 1: DMAxCTL|=DMADSTINCR_1 ;break; //目的地址不改变 case 2: DMAxCTL|=DMADSTINCR_2 ;break; //目的地址减少 case 3: DMAxCTL|=DMADSTINCR_3 ;break; //目的地址增加 } switch(Source_Mode) { case 0: DMAxCTL|=DMASRCINCR_0 ;break; //源地址不改变 case 1: DMAxCTL|=DMASRCINCR_1 ;break; //源地址不改变 case 2: DMAxCTL|=DMASRCINCR_2 ;break; //源地址减少 case 3: DMAxCTL|=DMASRCINCR_3 ;break; //源地址增加 } switch(Byte) { case 0: break; case 1:DMAxCTL|=DMADSTBYTE+ DMASRCBYTE;break;//目的地址源地址都是同样字节传输 } if(DMA2_trigger==0) DMAxCTL|=DMAREQ;//定义软件触发开始 if(DMA_NVIC==1) {DMAxCTL&=~DMAIFG;DMAxCTL|=DMAIE;} /*开始设置*/ //DMACTL0, DMA Control Register0设置 DMACTL0|=DMA2_trigger<<8; //DMACTL1, DMA Control Register 1 //DMA收到触发请求时,等待当前指令执行完成后 DMACTL1|= DMAONFETCH; //DMAxDA, DMA Destination Address Register设置 DMA2DA=Dest_Add; //DMAxSA, DMA Source Address Register设置 DMA2SA=Source_Add; //DMAxSZ, DMA Size Address Register设置 DMA2SZ=Data_Size; //DMAxCTL, DMA Channel x Control Registes设置r DMA2CTL |= DMAxCTL+DMAEN; // config } //非重复传输 void DMA_RepeatEnable(char DMAx_channel) { switch (DMAx_channel) //使能对应通道 { case 0: DMA0CTL |= DMAEN; break; //0通道 case 1: DMA1CTL |= DMAEN; break; //1通道 case 2: DMA2CTL |= DMAEN; break; //2通道 } } //软件触发 void DMA_Ruanjian(char DMAx_channel) { switch (DMAx_channel) //使能对应通道 { case 0: DMA0CTL |= DMAREQ; break; //0通道 case 1: DMA1CTL |= DMAREQ; break; //1通道 case 2: DMA2CTL |= DMAREQ; break; //2通道 } } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2951 浏览 16 评论
3455 浏览 1 评论
8984 浏览 16 评论
4045 浏览 18 评论
1097浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 23:21 , Processed in 1.141851 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号