本来觉得从发送改写成接收.应该是很简单的啊.实践了一下..基本上失败了.收到的数据保存在本地数组.然后分别在LCD显示和通过另一个串口输出.LCD会快速的显示一遍所有字符.串口输出则全部是乱码.也不知道哪里错了.用的红牛板.谢谢大家啦
完整程序在下面.贴几个自己觉得问题比较大的地方.大虾帮忙瞅瞅吧
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
DR_Base=cpar;
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址 DMA通道 x外设地址寄存器(DMA_CPARx)
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址 DMA通道 x存储器地址寄存器(DMA_CmARx)
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<0; //通道开启 add
DMA_CHx->CCR|=1<<1; //允许传输完成中断 add
DMA_CHx->CCR|=0<<4; //从外设读
DMA_CHx->CCR|=0<<5; //普通模式 0
DMA_CHx->CCR|=1<<6; //外设地址非增量模式
DMA_CHx->CCR|=0<<7; //存储器增量模式
DMA_CHx->CCR|=0<<8; //外设数据宽度为8位
DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式 0
}
main:
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)SendBuff,10);// added
LCD_ShowString(60,150,"Start Transimit....");
LCD_ShowString(60,170," %");//显示百分号
printf("
DMA DATA:
");
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)SendBuff,10);// added
USART1->CR3=1<<6; //使能串口1的DMA接受
MYDMA_Enable(DMA1_Channel5);//开始一次DMA传输!
此帖出自
小平头技术问答
已经调好了.之前是因为本地指针自增1没有打开.发个能超时的DMA收发程序.有点小白,自己写的 嘿嘿
[ 本帖最后由 astwyg 于 2011-6-14 16:23 编辑 ]
一周热门 更多>