目录
概述
本文主要是使用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群中。