硬件平台:stm32f103(自带5串口)
5个串口同时工作不丢包-_-
相关宏定义
typedef enum
{
uartport1,
uartport2,
uartport3,
uartport4,
uartport5,
uartport_usb,
}uartport;
#define rxtimeout 10 // 接收超时时间,如10msec内未接收任何数据,当作一个接收包
#define uart_txbufferlen 0x100 //发送缓冲区大小
#define uart_rxbufferlen 0x400 //接接缓冲区大小
typedef struct
{
//接收
volatile uint rxhead;
volatile uint rxtail;
volatile uchar rxbuf[uart_rxbufferlen];
volatile uchar rxtimeout_base;
volatile uchar rxtimeout;
//发送
volatile uint txhead;
volatile uint txtail;
volatile boolean txempty;
volatile uchar baudrate;
volatile uchar txidletimeout;
volatile uchar txidletimeout_base;
volatile uchar txbuf[uart_txbufferlen];
}uart_struct;
static uart_struct uart1;
static uart_struct uart2;
static uart_struct uart3;
static uart_struct uart4;
static uart_struct uart5;
串口1初始化
usart_inittypedef usart_initstruct;
gpio_inittypedef gpio_initstruct;
nvic_inittypedef nvic_initstruct;
rcc_apb2periphclockcmd( rcc_apb2periph_usart1, enable );
gpio_initstruct.gpio_speed = gpio_speed_50mhz;
/* configure usart1 tx (pa9) as alternate function push-pull */
gpio_initstruct.gpio_pin = pin_usart1_txd;
gpio_initstruct.gpio_mode = gpio_mode_af_pp;
gpio_init( port_usart1_txd, &gpio_initstruct );
/* configure usart1 rx (pa10) as input floating */
gpio_initstruct.gpio_pin = pin_usart1_rxd;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_usart1_rxd, &gpio_initstruct );
usart_structinit(&usart_initstruct);
usart_initstruct.usart_baudrate = 115200;
usart_initstruct.usart_wordlength = usart_wordlength_8b;
usart_initstruct.usart_stopbits = usart_stopbits_1;
usart_initstruct.usart_parity = usart_parity_no ;
usart_initstruct.usart_mode = usart_mode_rx | usart_mode_tx;
usart_initstruct.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
usart_init(usart1, &usart_initstruct);
/* enable the usartx interrupt */
#if 1
// usart_itconfig(usart2, usart_it_txe, enable);
usart_itconfig(usart1, usart_it_rxne, enable);
nvic_initstruct.nvic_irqchannel = usart1_irqn;
nvic_initstruct.nvic_irqchannelpreemptionpriority = 0;
nvic_initstruct.nvic_irqchannelsubpriority = 0;
nvic_initstruct.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstruct);
#endif
usart_cmd(usart1, enable);
串口2初始化
usart_inittypedef usart_initstruct;
gpio_inittypedef gpio_initstruct;
nvic_inittypedef nvic_initstruct;
rcc_apb1periphclockcmd( rcc_apb1periph_usart2, enable );
gpio_initstruct.gpio_speed = gpio_speed_50mhz;
/* configure usart2 cts (pa0) as input floating */
#if uart2_hardware_flow
gpio_initstruct.gpio_pin = pin_usart2_cts;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_usart2_cts, &gpio_initstruct );
#endif
/* configure usart2 rx (pa3) as input floating */
gpio_initstruct.gpio_pin = pin_usart2_rxd;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_usart2_rxd, &gpio_initstruct );
/* configure usart2 rts (pa1) as alternate function push-pull */
#if uart2_hardware_flow
gpio_initstruct.gpio_pin = pin_usart2_rts;
gpio_initstruct.gpio_mode = gpio_mode_af_pp;
gpio_init( port_usart2_rts, &gpio_initstruct );
#endif
/* configure usart2 tx (pa2) as alternate function push-pull */
gpio_initstruct.gpio_pin = pin_usart2_txd;
gpio_initstruct.gpio_mode = gpio_mode_af_pp;
gpio_init( port_usart2_txd, &gpio_initstruct );
usart_structinit(&usart_initstruct);
usart_initstruct.usart_baudrate = 115200;
usart_initstruct.usart_wordlength = usart_wordlength_8b;
usart_initstruct.usart_stopbits = usart_stopbits_1;
usart_initstruct.usart_parity = usart_parity_no ;
usart_initstruct.usart_mode = usart_mode_rx | usart_mode_tx;
#if uart2_hardware_flow
usart_initstruct.usart_hardwareflowcontrol = usart_hardwareflowcontrol_rts;
#else
usart_initstruct.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
#endif
usart_init(usart2, &usart_initstruct);
#if 1
// usart_itconfig(usart2, usart_it_txe, enable);
usart_itconfig(usart2, usart_it_rxne, enable);
nvic_initstruct.nvic_irqchannel = usart2_irqn;
nvic_initstruct.nvic_irqchannelpreemptionpriority = 0;
nvic_initstruct.nvic_irqchannelsubpriority = 0;
nvic_initstruct.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstruct);
#endif
usart_cmd(usart2, enable);
串口3初始化
usart_inittypedef usart_initstruct;
gpio_inittypedef gpio_initstruct;
nvic_inittypedef nvic_initstruct;
rcc_apb1periphclockcmd( rcc_apb1periph_usart3, enable );
gpio_initstruct.gpio_speed = gpio_speed_50mhz;
/* configure usart1 tx (pc10) as alternate function push-pull */
gpio_initstruct.gpio_pin = pin_uart3_txd;
gpio_initstruct.gpio_mode = gpio_mode_af_pp;
gpio_init( port_uart3_txd, &gpio_initstruct );
/* configure usart1 rx (pc11) as input floating */
gpio_initstruct.gpio_pin = pin_uart3_rxd;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_uart3_rxd, &gpio_initstruct );
usart_structinit(&usart_initstruct);
usart_initstruct.usart_baudrate = 115200;
usart_initstruct.usart_wordlength = usart_wordlength_8b;
usart_initstruct.usart_stopbits = usart_stopbits_1;
usart_initstruct.usart_parity = usart_parity_no ;
usart_initstruct.usart_mode = usart_mode_rx | usart_mode_tx;
usart_initstruct.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
usart_init(usart3, &usart_initstruct);
/* enable the usartx interrupt */
#if 1
usart_itconfig(usart3, usart_it_rxne, enable);
nvic_initstruct.nvic_irqchannel = usart3_irqn;
nvic_initstruct.nvic_irqchannelpreemptionpriority = 0;
nvic_initstruct.nvic_irqchannelsubpriority = 0;
nvic_initstruct.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstruct);
#endif
usart_cmd(usart3, enable);
串口4初始化
usart_inittypedef usart_initstruct;
gpio_inittypedef gpio_initstruct;
nvic_inittypedef nvic_initstruct;
rcc_apb1periphclockcmd( rcc_apb1periph_uart4, enable );
gpio_initstruct.gpio_speed = gpio_speed_50mhz;
#if 0
gpio_initstruct.gpio_pin = pin_uart4_cts;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_uart4_cts, &gpio_initstruct );
// gpio_resetbits(port_uart4_cts,pin_uart4_cts);
#endif
/* configure usart1 tx (pc10) as alternate function push-pull */
gpio_initstruct.gpio_pin = pin_uart4_txd;
gpio_initstruct.gpio_mode = gpio_mode_af_pp;
gpio_init( port_uart4_txd, &gpio_initstruct );
/* configure usart1 rx (pc11) as input floating */
gpio_initstruct.gpio_pin = pin_uart4_rxd;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_uart4_rxd, &gpio_initstruct );
usart_structinit(&usart_initstruct);
usart_initstruct.usart_baudrate = 115200;
usart_initstruct.usart_wordlength = usart_wordlength_8b;
usart_initstruct.usart_stopbits = usart_stopbits_1;
usart_initstruct.usart_parity = usart_parity_no ;
usart_initstruct.usart_mode = usart_mode_rx | usart_mode_tx;
usart_initstruct.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
usart_init(uart4, &usart_initstruct);
/* enable the usartx interrupt */
#if 1
// usart_itconfig(usart2, usart_it_txe, enable);
usart_itconfig(uart4, usart_it_rxne, enable);
nvic_initstruct.nvic_irqchannel = uart4_irqn;
nvic_initstruct.nvic_irqchannelpreemptionpriority = 0;
nvic_initstruct.nvic_irqchannelsubpriority = 0;
nvic_initstruct.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstruct);
#endif
usart_cmd(uart4, enable);
串口5初始化
usart_inittypedef usart_initstruct;
gpio_inittypedef gpio_initstruct;
nvic_inittypedef nvic_initstruct;
rcc_apb1periphclockcmd( rcc_apb1periph_uart5, enable );
gpio_initstruct.gpio_speed = gpio_speed_50mhz;
/* configure usart1 tx (pc10) as alternate function push-pull */
gpio_initstruct.gpio_pin = pin_uart5_txd;
gpio_initstruct.gpio_mode = gpio_mode_af_pp;
gpio_init( port_uart5_txd, &gpio_initstruct );
/* configure usart1 rx (pc11) as input floating */
gpio_initstruct.gpio_pin = pin_uart5_rxd;
gpio_initstruct.gpio_mode = gpio_mode_in_floating;
gpio_init( port_uart5_rxd, &gpio_initstruct );
usart_structinit(&usart_initstruct);
usart_initstruct.usart_baudrate = 115200;
usart_initstruct.usart_wordlength = usart_wordlength_8b;
usart_initstruct.usart_stopbits = usart_stopbits_1;
usart_initstruct.usart_parity = usart_parity_no ;
usart_initstruct.usart_mode = usart_mode_rx | usart_mode_tx;
usart_initstruct.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none;
usart_init(uart5, &usart_initstruct);
/* enable the usartx interrupt */
#if 1
usart_itconfig(uart5, usart_it_rxne, enable);
nvic_initstruct.nvic_irqchannel = uart5_irqn;
nvic_initstruct.nvic_irqchannelpreemptionpriority = 0;
nvic_initstruct.nvic_irqchannelsubpriority = 0;
nvic_initstruct.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstruct);
#endif
usart_cmd(uart5, enable);
中断处理
void usart_irq_function(uart_struct *uart,usart_typedef *uartdef)
{
//接收到数据usart_ getitstatus
while (usart_getitstatus(uartdef, usart_it_rxne))
{
uchar temp;
usart_clearflag(uartdef, usart_flag_rxne | usart_flag_ore);
temp = usart_receivedata(uartdef);
if (((uart->rxhead 1) % uart_rxbufferlen) != uart->rxtail)
{
uart->rxbuf[uart->rxhead] = temp;
uart->rxhead = (uart->rxhead 1) % uart_rxbufferlen;
uart->rxtimeout = uart->rxtimeout_base;
}
}
//发送数据
if (usart_getitstatus(uartdef,usart_it_txe))
{
// usart_clearflag(uartdef, usart_flag_txe);
if (uart->txhead == uart->txtail)
{
uart->txempty = true;
usart_itconfig(uartdef, usart_it_txe, disable);
}
else
{
usart_senddata(uartdef, uart->txbuf[uart->txtail]);
uart->txtail = (uart->txtail 1) & (uart_txbufferlen - 1);
uart->txidletimeout = uart->txidletimeout_base;
}
}
}
extern void usart1_irqhandler(void)
{
usart_irq_function(&uart1,usart1);
}
extern void usart2_irqhandler(void)
{
usart_irq_function(&uart2,usart2);
}
extern void usart3_irqhandler(void)
{
#ifdef include_uartport3
usart_irq_function(&uart3,usart3);
#endif
}
extern void uart4_irqhandler(void)
{
#ifdef include_uartport4
usart_irq_function(&uart4,uart4);
#endif
}
extern void uart5_irqhandler(void)
{
#ifdef include_uartport5
usart_irq_function(&uart5,uart5);
#endif
}
超时检查
//函 数:检查是否有收到数据包,1ms调用一次
//参 数无
//返 回:无
extern void checkuartrxtimeout()
{
if (uart1.rxtimeout)
{
if (--uart1.rxtimeout == 0)
{
pushevent(evcom1,uart1.rxhead);
}
}
if (uart2.rxtimeout)
{
if (--uart2.rxtimeout == 0)
{
pushevent(evcom2,uart2.rxhead);
}
}
if (uart3.rxtimeout)
{
if (--uart3.rxtimeout == 0)
{
pushevent(evcom3,uart3.rxhead);
}
}
if (uart4.rxtimeout)
{
if (--uart4.rxtimeout == 0)
{
pushevent(evcom4,uart4.rxhead);
}
}
if (uart5.rxtimeout)
{
if (--uart5.rxtimeout == 0)
{
pushevent(evcom5,uart5.rxhead);
}
}
if (uart1.txidletimeout) uart1.txidletimeout--;
if (uart2.txidletimeout) uart2.txidletimeout--;
#ifdef include_uartport3
if (uart3.txidletimeout) uart3.txidletimeout--;
#endif
#ifdef include_uartport4
if (uart4.txidletimeout) uart4.txidletimeout--;
#endif
#ifdef include_uartport5
if (uart5.txidletimeout) uart5.txidletimeout--;
#endif
}
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』