stm32f103 5个串口同时使用-u球体育app下载

×
单片机 > 单片机程序设计 > 详情

stm32f103 5个串口同时使用

发布时间:2024-08-01 发布时间:
|

硬件平台: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下载的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32问题记录:这回keil编译器背锅
网站地图