哪位大侠有串口DMA接收的例程共享一下。
最好是寄存器编程的,呵呵。因为整个工程都是寄存器编程的,用着比较方便。
另外,我自己用串口dma发送数据的例程改了一下,但是收不到数据,代码如下,哪位大侠给指点指点:
u8 DmaTest[30];
volatile bool FlagofDmaTest;
void DMA1_Channel6_IRQHandler(void)
{
FlagofDmaTest = TRUE;
}
void MYDMA1CH6_Config(u32 cpar)
{
u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0; //开启DMA1时钟
DR_Base=cpar;
//DMA1_Channel6->CPAR=DR_Base; //DMA1 外设地址
DMA1_Channel6->CPAR=(u32)&USART2->DR; //DMA1 外设地址
DMA1_Channel6->CCR=0X00000000; //复位
DMA1_Channel6->CCR &= ~(1<<4); //从外设读
DMA1_Channel6->CCR &= ~(1<<5); //普通模式,不执行循环操作
DMA1_Channel6->CCR &= ~(1<<6); //外设地址非增量模式
DMA1_Channel6->CCR |= 1<<7; //存储器增量模式
DMA1_Channel6->CCR &= ~(3<<8); //外设数据宽度为8位
DMA1_Channel6->CCR &= ~(3<<10); //存储器数据宽度8位
DMA1_Channel6->CCR |= 1<<12; //中等优先级
DMA1_Channel6->CCR &= ~(1<<14); //非存储器到存储器模式
//传输完成中断
DMA1_Channel6->CCR |= 1<<1; //允许传输完成中断
MY_NVIC_Init(2,2,DMA1_Channel6_IRQChannel,2);//组2,最低优先级
}
//开启一次DMA传输
void MYDMA1CH6_Enable(u32 cmar,u16 cndtr)
{
DMA1_Channel6->CCR &= ~(1<<0); //关闭DMA传输
DMA1_Channel6->CPAR=(u32)&USART2->DR; //外设地址
DMA1_Channel6->CMAR=(u32)cmar; //存储器地址
DMA1_MEM_LEN6=cndtr;
DMA1_Channel6->CNDTR=DMA1_MEM_LEN6; //DMA1,传输数据量
DMA1_Channel6->CCR|=1<<0; //开启DMA传输
}
int main(int argc,char** argv)
{
Stm32_Clock_Init(9); //frequent init:72M
delay_init(72); //delay init
uart2_init(36,19200,8,1,'N',200);
MYDMA1CH6_Config((u32)&USART2->DR);
//MYDMA1CH6_Enable((u32)DmaTest,10);
FlagofDmaTest = FALSE;
while(1)
{
FlagofDmaTest = FALSE;
uart2_send("Hi,yumei test\r\n",15);
MYDMA1CH6_Enable((u32)DmaTest,10);
while(FlagofDmaTest == FALSE);
}
}
哪位大侠给指点一下吧,可以肯定的是串口dma方式发送及串口中断方式接收肯定没问题,但是作如上设置后,dma的存储缓冲区内始终为空,收不到任何字符。
调试好几天了,谢谢各位了。
|