第十一章 AT32F403A基于V2库8串口程序

目录

概述

硬件

软件

        IO分配

        初始化代码

        中断服务代码

        发送数据代码

测试

最后


概述

         本文主要是使用AT32F403A开发板,基于V2库的8个串口的使用,和串口中断接收数据章的功能一样,只是扩展到8个串口,log通过串口1 来printf出来。

         串口工具使用的Atlink-ez自带的串口功能,开发板硬件已经默认接到mcu的串口1上。win10以下的系统需要安装虚拟串口驱动才能正确识别到com口。

         工程建立、调试工具配置在前面章节有详细介绍。


硬件

        硬件方面使用的是雅特力官方发布的AT32F403A开发板,板子上的芯片是AT32F403AVGT7的型号,开发板上面还板载了一个atlink-ez的仿真器,atlink-ez还有一个串口的功能,硬件上是接到了MCU的串口1上。这个atlink-ez也可以掰下来使用。

         如下图是开发板pcb图(左边的就是atlink-ez):


软件

        IO分配

         串口1:TX PA9,RX PA10

         串口2:TX PA2,RX PA3

         串口3:TX PB10,RX PB11

         串口4:TX PC10,RX PC11

         串口5:TX PC12,RX PD2

         串口6:TX PC6,RX PC7

         串口7:TX PE8,RX PE7

         串口8:TX PE1,RX PE0

         8个串口的波特率都是115200,数据位 8,停止位 1,无校验。

         都开启RDBF中断接收数据,IDLE中断判定一帧数据。


        初始化代码


/*
*串口1  配置函数
*IO:PA9/PA10
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void usart1_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the USART1 Clock*/
	crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);		//开启GPIOA的时钟
	crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);		//开启USART1的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the USART1 TX pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_9;								//PA9
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOA, &gpio_init_struct);

	/* Configure the USART1 RX pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_10;								//PA10
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOA, &gpio_init_struct);
	
	nvic_irq_enable(USART1_IRQn, 0, 0);      						//使能串口1中断,优先级0,次优先级0
	
	/*Configure UART param*/
    usart_init(USART1, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(USART1,USART_PARITY_NONE);			//无校验
    usart_transmitter_enable(USART1, TRUE);								//使能发送
    usart_receiver_enable(USART1, TRUE);								//使能接收
	
	usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(USART1, TRUE);											//使能串口
	
}

/*
*串口2  配置函数
*IO:PA2/PA3
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void usart2_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the USART2 Clock*/
	crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);		//开启GPIOA的时钟
	crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);		//开启USART2的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the USART2 TX pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_2;								//PA2
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOA, &gpio_init_struct);

	/* Configure the USART2 RX pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_3;								//PA3
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOA, &gpio_init_struct);
	
	nvic_irq_enable(USART2_IRQn, 0, 1);      						//使能串口2中断,优先级0,次优先级1
	
	/*Configure UART param*/
    usart_init(USART2, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(USART2,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(USART2,USART_PARITY_NONE);			//无校验
    usart_transmitter_enable(USART2, TRUE);								//使能发送
    usart_receiver_enable(USART2, TRUE);								//使能接收
	
	usart_interrupt_enable(USART2, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(USART2, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(USART2, TRUE);											//使能串口
	
}

/*
*串口3  配置函数
*IO:PB10/PB11
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void usart3_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the USART3 Clock*/
	crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);		//开启GPIOB的时钟
	crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);		//开启USART3的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the USART3 TX pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_10;								//PB10
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOB, &gpio_init_struct);

	/* Configure the USART3 RX pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_11;								//PB11
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOB, &gpio_init_struct);
	
	nvic_irq_enable(USART3_IRQn, 0, 2);      								//使能串口3中断,优先级0,次优先级2
	
	/*Configure UART param*/
    usart_init(USART3, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(USART3,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(USART3,USART_PARITY_NONE);			//无校验
    usart_transmitter_enable(USART3, TRUE);								//使能发送
    usart_receiver_enable(USART3, TRUE);								//使能接收
	
	usart_interrupt_enable(USART3, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(USART3, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(USART3, TRUE);											//使能串口
	
}

/*
*串口4  配置函数
*IO:PC10/PC11
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void uart4_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the UART4 Clock*/
	crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);		//开启GPIOC的时钟
	crm_periph_clock_enable(CRM_UART4_PERIPH_CLOCK, TRUE);		//开启UART4的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the UART4 TX pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_10;								//PC10
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOC, &gpio_init_struct);

	/* Configure the UART4 RX pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_11;								//PC11
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOC, &gpio_init_struct);
	
	nvic_irq_enable(UART4_IRQn, 0, 3);      						//使能串口4中断,优先级0,次优先级3
	
	/*Configure UART param*/
    usart_init(UART4, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(UART4,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(UART4,USART_PARITY_NONE);				//无校验
    usart_transmitter_enable(UART4, TRUE);								//使能发送
    usart_receiver_enable(UART4, TRUE);									//使能接收
	
	usart_interrupt_enable(UART4, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(UART4, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(UART4, TRUE);											//使能串口
	
}

/*
*串口5  配置函数
*IO:PC12/PD2
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void uart5_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the UART5 Clock*/
	crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);		//开启GPIOC的时钟
	crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);		//开启GPIOD的时钟
	crm_periph_clock_enable(CRM_UART5_PERIPH_CLOCK, TRUE);		//开启UART5的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the UART5 TX pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_12;								//PC12
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOC, &gpio_init_struct);

	/* Configure the UART5 RX pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_2;								//PD2
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOD, &gpio_init_struct);
	
	nvic_irq_enable(UART5_IRQn, 0, 4);      						//使能串口5中断,优先级0,次优先级4
	
	/*Configure UART param*/
    usart_init(UART5, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(UART5,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(UART5,USART_PARITY_NONE);				//无校验
    usart_transmitter_enable(UART5, TRUE);								//使能发送
    usart_receiver_enable(UART5, TRUE);									//使能接收
	
	usart_interrupt_enable(UART5, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(UART5, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(UART5, TRUE);											//使能串口
	
}

/*
*串口6  配置函数
*IO:PC6/PC7
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void usart6_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	 /*Enable the USART6 Clock*/
	crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);		//开启GPIOC的时钟
	crm_periph_clock_enable(CRM_USART6_PERIPH_CLOCK, TRUE);		//开启USART6的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the USART6 TX pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_6;								//PC6
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOC, &gpio_init_struct);

	/* Configure the USART6 RX pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_7;								//PC7
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOC, &gpio_init_struct);
	
	nvic_irq_enable(USART6_IRQn, 0, 5);      						//使能串口6中断,优先级0,次优先级5
	
	/*Configure UART param*/
    usart_init(USART6, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(USART6,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(USART6,USART_PARITY_NONE);			//无校验
    usart_transmitter_enable(USART6, TRUE);								//使能发送
    usart_receiver_enable(USART6, TRUE);								//使能接收
	
	usart_interrupt_enable(USART6, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(USART6, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(USART6, TRUE);											//使能串口
	
}

/*
*串口7  配置函数
*IO:PE8/PE7
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void uart7_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the UART7 Clock*/
	crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);		//开启GPIOE的时钟
	crm_periph_clock_enable(CRM_UART7_PERIPH_CLOCK, TRUE);		//开启UART7的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the UART7 TX pin */	
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_8;								//PE8
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOE, &gpio_init_struct);

	/* Configure the UART7 RX pin */	
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_7;								//PE7
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOE, &gpio_init_struct);
	
	nvic_irq_enable(UART7_IRQn, 0, 6);      						//使能串口7中断,优先级0,次优先级6
	
	/*Configure UART param*/
    usart_init(UART7, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(UART7,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(UART7,USART_PARITY_NONE);				//无校验
    usart_transmitter_enable(UART7, TRUE);								//使能发送
    usart_receiver_enable(UART7, TRUE);									//使能接收
	
	usart_interrupt_enable(UART7, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(UART7, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(UART7, TRUE);											//使能串口
	
}

/*
*串口8  配置函数
*IO:PE1/PE0
*blound: 波特率
*数据位 8,停止位 1,无校验
*/

void uart8_init(u32 bound)
{
	gpio_init_type gpio_init_struct;
	/*Enable the UART8 Clock*/
	crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);		//开启GPIOE的时钟
	crm_periph_clock_enable(CRM_UART8_PERIPH_CLOCK, TRUE);		//开启UART8的时钟
	   
    gpio_default_para_init(&gpio_init_struct);
	/* Configure the UART8 TX   pin */	
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;								//复用
    gpio_init_struct.gpio_pins = GPIO_PINS_1;								//PE1
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;							//无上下拉
    gpio_init(GPIOE, &gpio_init_struct);

	/* Configure the UART8 TX   pin */	
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;	//较大电流推动/吸入能力
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;				//推挽输出
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;							//输入模式
    gpio_init_struct.gpio_pins = GPIO_PINS_0;								//PE0
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;								//上拉
    gpio_init(GPIOE, &gpio_init_struct);
	
	nvic_irq_enable(UART8_IRQn, 0, 7);      						//使能串口1中断,优先级0,次优先级7
	
	/*Configure UART param*/
    usart_init(UART8, bound, USART_DATA_8BITS, USART_STOP_1_BIT);		//波特率,8数据位,1停止位
    usart_hardware_flow_control_set(UART8,USART_HARDWARE_FLOW_NONE);	//无硬件流操作
    usart_parity_selection_config(UART8,USART_PARITY_NONE);				//无校验
    usart_transmitter_enable(UART8, TRUE);								//使能发送
    usart_receiver_enable(UART8, TRUE);									//使能接收
	
	usart_interrupt_enable(UART8, USART_RDBF_INT, TRUE);				//使能串口接收中断
	usart_interrupt_enable(UART8, USART_IDLE_INT, TRUE);				//使能串口空闲中断
    usart_enable(UART8, TRUE);											//使能串口
	
}

        中断服务代码


/*
*串口1中断服务函数
*
*
*/


void USART1_IRQHandler(void)
{	
	uint8_t clear;
	if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)              // USART1接收中断响应
	{
		Muartnum[0].Uartrxbuf[Muartnum[0].Uartrxcut++] =USART1->dt;	  // USART1读取数据寄存器		
	}

	if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET)               // USART1总线空闲
	{
		clear=USART1->sts;                                              // USART1清除空闲中断标志位
		clear=USART1->dt;												// USART1清除空闲中断标志位
		clear&=0;
		Muartnum[0].Uartrxsta = 1;										// USART1接收完成标志位

	}
		
}




/**
*	串口2的中断函数
* 
*
*/

void USART2_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[1].Uartrxbuf[ Muartnum[1].Uartrxcut++] =USART2->dt;
	}
	else if(usart_flag_get(USART2, USART_IDLEF_FLAG) != RESET)
	{
		clear=USART2->sts ;
		clear=USART2->dt;
		clear&=0;
		Muartnum[1].Uartrxsta=1;
	}
}

/**
*	串口3的中断函数
* 
*
*/

void USART3_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(USART3, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[2].Uartrxbuf[ Muartnum[2].Uartrxcut++] =USART3->dt;
	}
	else if(usart_flag_get(USART3, USART_IDLEF_FLAG) != RESET)
	{
		clear=USART3->sts;
		clear=USART3->dt;
		clear&=0;
		Muartnum[2].Uartrxsta=1;
	}
}

/**
*	串口4的中断函数
* 
*
*/

void UART4_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(UART4, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[3].Uartrxbuf[ Muartnum[3].Uartrxcut++] =UART4->dt;
	}
	else if(usart_flag_get(UART4, USART_IDLEF_FLAG) != RESET)
	{
		clear=UART4->sts;
		clear=UART4->dt;
		clear&=0;
		Muartnum[3].Uartrxsta=1;
	}
}

/**
*	串口5的中断函数
* 
*
*/

void UART5_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(UART5, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[4].Uartrxbuf[ Muartnum[4].Uartrxcut++] =UART5->dt;
	}
	else if(usart_flag_get(UART5, USART_IDLEF_FLAG) != RESET)
	{
		clear=UART5->sts;
		clear=UART5->dt;
		clear&=0;
		Muartnum[4].Uartrxsta=1;
	}
}

/**
*	串口6的中断函数
* 
*
*/

void USART6_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(USART6, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[5].Uartrxbuf[ Muartnum[5].Uartrxcut++] =USART6->dt;
	}
	else if(usart_flag_get(USART6, USART_IDLEF_FLAG) != RESET)
	{
		clear=USART6->sts;
		clear=USART6->dt;
		clear&=0;
		Muartnum[5].Uartrxsta=1;
	}
}

/**
*	串口7的中断函数
* 
*
*/

void UART7_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(UART7, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[6].Uartrxbuf[ Muartnum[6].Uartrxcut++] =UART7->dt;
	}
	else if(usart_flag_get(UART7, USART_IDLEF_FLAG) != RESET)
	{
		clear=UART7->sts;
		clear=UART7->dt;
		clear&=0;
		Muartnum[6].Uartrxsta=1;
	}
}

/**
*	串口8的中断函数
* 
*
*/

void UART8_IRQHandler(void)
{
	uint8_t clear;
	if(usart_flag_get(UART8, USART_RDBF_FLAG) != RESET) 
	{
		 Muartnum[7].Uartrxbuf[ Muartnum[7].Uartrxcut++] =UART8->dt;
	}
	else if(usart_flag_get(UART8, USART_IDLEF_FLAG) != RESET)
	{
		clear=UART8->sts;
		clear=UART8->dt;
		clear&=0;
		Muartnum[7].Uartrxsta=1;
	}
}

        发送数据代码


/*
*串口1-8发送函数
*num:串口号,0-7
*SendData:发送的数据
*len:发送长度
*/

void Muarttxdatas(u8 num,u8*SendData,u16 len)
{
	u16 i ;
	usart_type* usart_x;
	if(num==0)
	{
		usart_x=USART1 ;
	}
	else if(num==1)
	{
		usart_x=USART2 ;
	}
	else if(num==2)
	{
		usart_x=USART3 ;
	}
	else if(num==3)
	{
		usart_x=UART4 ;
	}
	else if(num==4)
	{
		usart_x=UART5 ;
	}
	else if(num==5)
	{
		usart_x=USART6 ;
	}
	else if(num==6)
	{
		usart_x=UART7 ;
	}
	else if(num==7)
	{
		usart_x=UART8 ;
	}
    for(i=0;i<len;i++)
    {
        while(usart_flag_get(usart_x, USART_TDBE_FLAG) == RESET);
        usart_data_transmit(usart_x, SendData[i]);
		while(usart_flag_get(usart_x, USART_TDC_FLAG) == RESET);			
    }
}

测试

        测试代码

                 串口1出来输出log外也会把收到的数据给发送出来,其他串口只会把收到的数据发送出来。


         测试结果:

              通过串口往板子发送数据,正常的话会收到相同的数据,经过测试,8个串口功能正常。


最后

         有问题的可以加QQ群技术交流,同时相关代码上传到QQ群中。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值