看了DMA的教程,自己想当然的编了个接收程序,主要实现通过串口接收数据,然后在LCD上显示,但是程序卡死在第二个while中,不知道如何解决

2019-07-20 23:05发布

主程序:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"  
#include "dma.h"
#define Receive_BUF_SIZE 200

u8 ReceiveBuff[Receive_BUF_SIZE]; //数据缓冲区
  
int main(void)

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168);     //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED 
LCD_Init(); //LCD初始化
MYDMA_Config(DMA2_Stream2,DMA_Channel_4,(u32)&USART1->DR,(u32)ReceiveBuff,Receive_BUF_SIZE);

USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);  //使能串口1的DMA接收     
    MYDMA_Enable(DMA2_Stream2,Receive_BUF_SIZE);     //开始一次DMA传输!

while (1)
{
while(1)
{
if(DMA_GetFlagStatus(DMA2_Stream2,DMA_FLAG_TCIF2)!=RESET)//等待DMA2_Steam2传输完成

DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF2);//清除DMA2_Steam2传输完成标志
break; //跳出循环
       }
}

LCD_ShowString(30,50,200,16,16,ReceiveBuff);
LED0=!LED0;
delay_ms(200);
}
}
这是DMA的配置
 DMA_InitStructure.DMA_Channel = chx;  //通道选择
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
  DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralToMemory;//外设到存储器模式
  DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量 
  DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式,由于是从存储器读数据给外设,所以存储器设置为增量模式,这样的话,它地址可以自动增加;而外设因为是固定的地址,所以设为非增量模式。 
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位,(外设是多少位的存储器就是多少位的).
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式 ,用来设置 DMA 模式是否循环采集
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable  ; //不开启先入先出模式        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//选择 FIFO 阈值,为 FIFO 容量的1/4,1/2,3/4 以及 1 倍
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输,用来配置存储器
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输,用来配置外设
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。