在需要与上位机通信的时候,往往采用串口的方式,同时接收上位机的指令的优先级要最高,以免相应不够及时,串口优先级过高造成的后果就是别的任务被频繁的打断,特别是跟其他传感器通信的时候,对于时序的要求十分的严格,串口频繁的进入中断造成时序被打断,往往不能得到正确的数据。针对这个问题,可以采用DMA形式来接收上位机的数据,进而避免进入串口中断。
关于DMA,原理就不讲了,直接上代码。
第一步:初始化DMA
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_Streamx>(u32)DMA2) //得到当前的stream属于DMA2还是DMA1
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); //DMA2使能
}
else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); //DMA1使能
}
DMA_DeInit(DMA_Streamx);
while(DMA_GetCmdStatus(DMA_Streamx)!=DISABLE){} //等待DMA可配置
/* 配置 DMA Stream */
DMA_InitStructure.DMA_Channel = chx; //通道选择
DM