STM32F429 8个串口DMA接收

 

 USART1-------UART8  8路串口接收DMA设置:

/** * @brief  初始化串口1接收--用到的DMA通道 */
void DMA_USART1_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);					//DMA2时钟使能 

	DMA_DeInit(DMA2_Stream5);
	while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA2 Stream5,USART1接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_4;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx1_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA2_Stream5, &DMA_InitStructure);								//初始化DMA Stream


	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
	NVIC_Init(&NVIC_InitStructure);  
	DMA_Cmd(DMA2_Stream5, ENABLE); 

	DMA_ITConfig(DMA2_Stream5, DMA_IT_TC, DISABLE);							//DMA2传输完成中断


}


/** * @brief  初始化串口2 接收--用到的DMA通道 */
void DMA_USART2_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);					//DMA1时钟使能

	DMA_DeInit(DMA1_Stream5);
	while (DMA_GetCmdStatus(DMA1_Stream5) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA1 Stream5,USART2接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_4;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx2_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA1_Stream5, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, DISABLE);							//DMA2传输完成中断
	DMA_Cmd(DMA1_Stream5, ENABLE);
}

/** * @brief  初始化串口3 接收--用到的DMA通道 */
void DMA_USART3_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);					//DMA1时钟使能

	DMA_DeInit(DMA1_Stream1);
	while (DMA_GetCmdStatus(DMA1_Stream1) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA1 Stream1,USART3接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_4;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx3_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA1_Stream1, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA1_Stream1, DMA_IT_TC, DISABLE);							//DMA1传输完成中断
	DMA_Cmd(DMA1_Stream1, ENABLE);
}

/** * @brief  初始化串口4 接收--用到的DMA通道 */
void DMA_UART4_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);					//DMA1时钟使能

	DMA_DeInit(DMA1_Stream2);
	while (DMA_GetCmdStatus(DMA1_Stream2) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA1 Stream2,UART4接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_4;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&UART4->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx4_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA1_Stream2, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA1_Stream2, DMA_IT_TC, DISABLE);							//DMA1传输完成中断
	DMA_Cmd(DMA1_Stream2, ENABLE);
}


/** * @brief  初始化串口5 接收--用到的DMA通道 */
void DMA_UART5_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);					//DMA1时钟使能

	DMA_DeInit(DMA1_Stream0);
	while(DMA_GetCmdStatus(DMA1_Stream0) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA1 Stream0,UART5接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_4;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&UART5->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx5_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA1_Stream0, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA1_Stream0, DMA_IT_TC, DISABLE);							//DMA1传输完成中断
	DMA_Cmd(DMA1_Stream0, ENABLE);
}

/** * @brief  初始化串口6 接收--用到的DMA通道 */
void DMA_USART6_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);					//DMA2时钟使能

	DMA_DeInit(DMA2_Stream2);
	while (DMA_GetCmdStatus(DMA2_Stream2) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA2 Stream2,USART6接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_5;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART6->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx6_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA2_Stream2, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, DISABLE);							//DMA1传输完成中断
	DMA_Cmd(DMA2_Stream2, ENABLE);
}

/** * @brief  初始化串口7 接收--用到的DMA通道 */
void DMA_UART7_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);					//DMA1时钟使能

	DMA_DeInit(DMA1_Stream3);
	while (DMA_GetCmdStatus(DMA1_Stream3) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA1 Stream3,USART7接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_5;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&UART7->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx7_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA1_Stream3, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA1_Stream3, DMA_IT_TC, DISABLE);							//DMA1传输完成中断
	DMA_Cmd(DMA1_Stream3, ENABLE);
}

/** * @brief  初始化串口8 接收--用到的DMA通道 */
void DMA_UART8_Initializes(void)
{
	DMA_InitTypeDef  DMA_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);					//DMA1时钟使能

	DMA_DeInit(DMA1_Stream6);
	while (DMA_GetCmdStatus(DMA1_Stream6) != DISABLE);						//等待DMA可配置 
	/* 配置 DMA1 Stream6,UART8接收 */
	DMA_InitStructure.DMA_Channel			 = DMA_Channel_5;				//通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&UART8->DR;			//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr	 = (u32)rx8_data;		//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR				 = DMA_DIR_PeripheralToMemory;	//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize		 = DMA_RX_LENGTH;		//数据传输量 
	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_InitStructure.DMA_Priority			 = DMA_Priority_Medium;			//中等优先级
	DMA_InitStructure.DMA_FIFOMode			 = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold		 = DMA_FIFOThreshold_1QuarterFull;
	DMA_InitStructure.DMA_MemoryBurst		 = DMA_MemoryBurst_Single;		//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst	 = DMA_PeripheralBurst_Single;	//外设突发单次传输
	DMA_Init(DMA1_Stream6, &DMA_InitStructure);								//初始化DMA Stream

	DMA_ITConfig(DMA1_Stream6, DMA_IT_TC, DISABLE);							//DMA1传输完成中断
	DMA_Cmd(DMA1_Stream6, ENABLE); 
	
}

下面是8路串口接收中断函数,

仅以串口1为例,其他串口中断的依此类推

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8	clear;

	if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)	//空闲帧中断
			{							
			DMA_Cmd(DMA2_Stream5, DISABLE);		//关闭DMA,防止处理其间有数据
			clear =USART1->DR;  	//先读取接收缓存中数据,目的是清空闲中断标志位 (USART_IT_IDLE=0)
			clear = USART1->SR;
			clear=clear;
			
			rx1_n = 256 - DMA_GetCurrDataCounter(DMA2_Stream5);	
			FLAG1=1;				//一帧数据接收结束标志	
			
            自己的处理代码放这里
				
		DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 |DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);	//清除DMA2_Steam5传输完成标志  
		DMA_SetCurrDataCounter(DMA2_Stream5, 256);
		DMA_Cmd(DMA2_Stream5, ENABLE);	
			rx1_n=0;		
		    }		
}

主函数MAIN()

int main(void)
{
	u8	n,m;
	u16	i=0;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	uart1_init(9600);
	DMA_USART1_Initializes();		//uart1_rx, DMA接收数据初始化

	uart2_init(9600);
	DMA_USART2_Initializes();		//uart2_rx, DMA接收数据初始化
	
	uart3_init(9600);
	DMA_USART3_Initializes();		//uart3_rx, DMA接收数据初始化
	
	uart4_init(9600);
	DMA_UART4_Initializes();		//uart4_rx, DMA接收数据初始化
	
	uart5_init(9600);
	DMA_UART5_Initializes();		//uart5_rx, DMA接收数据初始化
	
	uart6_init(9600);
	DMA_USART6_Initializes();		//uart6_rx, DMA接收数据初始化
	
	uart7_init(9600);
	DMA_UART7_Initializes();		//uart7_rx, DMA接收数据初始化

	
	uart8_init(9600);
	DMA_UART8_Initializes();		//uart8_rx, DMA接收数据初始化
	
	WHILE(1){



                }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值