***********STM32F407 DMA求助 Demo是参考原子哥的!***********

2019-07-20 11:59发布

思路:我写的是利用DMA将内存的数据送到串口3上,在中断里写清除的标志位!
现象:在所有的数据都搬运完毕后,才打印剩余量!
代码:
***********************************************************************************************************
int main(void)
{
int pro=0;
int i=0;
BSP_Init();
delay_init();
for(i=0;i<8000;i++)
Buffer=i;
USART_OUT(USART3,"****  F407_USART_DMA  **** ");      //向串口1发送开机字符 
USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);/*使能 USART3的发送数据DMA请求 至此USART3与DMA开始工作*/
GPIO_SetBits(GPIOB,GPIO_Pin_11);
while(1)
{
/*因为 DMA 工作是独立于 CPU 之外的,所以在 DMA 工作的同时 CPU 可以做其他事
 我们等到 DMA 传输完毕后产生一个状态指示,即点亮一个 LED */
delay_ms(1000);
pro=DMA_GetCurrDataCounter(DMA1_Stream3);
USART_OUT(USART3, "剩余传送量=%d ",pro);

 /*DMA 传输完毕后会自动关闭通道,数据就打印不出来了!   
而且还得开启DMA的接收完成中断服务函数*/
}
}
***********************************************************************************************************
void DMA1_Stream3_IRQHandler(void)
{
if (DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3) != RESET)  //判断传输完成后,标志位置1
{
DMA_ClearITPendingBit(DMA1_Stream3, DMA_IT_TCIF3);//清除通道3传输完成标志
DMA_Cmd(DMA1_Stream3, DISABLE);  
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
USART_OUT(USART3," ****DMA传输完毕_中断******* "); 
}
}
***********************************************************************************************************

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
小Y
1楼-- · 2019-07-20 14:36
额,上传完以后才发现图片有点让人无语!抱歉!
正点原子
2楼-- · 2019-07-20 16:08
 精彩回答 2  元偷偷看……
小Y
3楼-- · 2019-07-20 19:50
回复【3楼】正点原子:
---------------------------------
期待原子哥的F4的板子!

问题找到了,DMA的功能我早就实现了,一直想要模仿原子哥,做出那个进度的显示(PS:设备简陋,用打印了),然后我就用顺手用那个DMA传输的串口打印,结果一直实现不了!后来我分析了好久,最后换了一个串口打印,就出效果了!

不过那个F4的double buffer还是不是很清楚,不知道你搞清楚了么?这个的配置貌似要比起几个系列的简单吧?
小Y
4楼-- · 2019-07-20 22:35
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-21 02:46
 精彩回答 2  元偷偷看……
小Y
6楼-- · 2019-07-21 08:38
回复【6楼】正点原子:
---------------------------------
是的,原子哥,我第一次接触DMA,看了下,网上人的例子,都是F1系列的,我不是很了解,看了他们的code,发现都是在中断里进行buf的切换,
是不是F4可以不用这么麻烦了!

一周热门 更多>