历史上的今天
返回首页

历史上的今天

今天是:2025年08月13日(星期三)

正在发生

2018年08月13日 | STM32F103 5个串口同时使用

2018-08-13 来源:eefocus

硬件平台: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

}


推荐阅读

史海拾趣

BEKA Associates Ltd公司的发展小趣事

BCD Semi(Diodes)在电子行业中以其卓越的技术实力和持续的产品创新而闻名。近年来,公司成功研发出一系列高性能的模拟半导体产品,这些产品在市场上取得了显著的成功。通过不断优化生产工艺和设计理念,BCD Semi成功提升了产品的性能和可靠性,赢得了客户的广泛认可。同时,公司还积极开拓新的应用领域,将产品应用于汽车、通信、工业控制等多个领域,进一步扩大了市场份额。

Coiltronics公司的发展小趣事

随着市场的不断扩大,Coiltronics公司意识到单凭自身的力量难以满足日益增长的市场需求。于是,公司开始积极寻求与其他企业的战略合作。通过与知名电子设备制造商建立合作关系,Coiltronics成功将其线圈技术应用于更广泛的领域,进一步提升了市场份额。同时,这种合作也带来了双方在技术研发、市场推广等方面的深入交流,为公司的长远发展奠定了坚实基础。

Dialog公司的发展小趣事

到了1981年,Dialog公司从洛克希德导弹航空公司中独立出来,成为了一个子公司,并开始独立经营。在独立发展的初期,Dialog公司继续专注于通信技术的研发,并逐渐将业务范围拓展到了个人便携式应用、低功耗短程无线应用以及LED固态照明、显示和汽车应用等领域。

ADI Electronics Inc公司的发展小趣事

在ADI的发展过程中,并购重组成为其实现规模扩张和增强竞争力的重要手段。其中,2017年对凌力尔特(Linear Technology)的收购是ADI历史上最具影响力的一次并购。这次收购使ADI快速进入电源管理芯片市场,并一跃成为全球第二大模拟芯片厂商。通过并购,ADI不仅扩大了自身的产品线,也提高了其在全球市场的份额和影响力。

Gem Asia Enterprise Co Ltd公司的发展小趣事

Gem Asia Enterprise最初是一家专注于电子元件生产的小型制造商。面对激烈的市场竞争,公司决定加大研发投入,专注于开发新型半导体材料。经过数年努力,Gem Asia成功研发出一种高效能、低功耗的半导体材料,并成功应用于智能手机和可穿戴设备中。这一创新不仅显著提升了产品的市场竞争力,还吸引了多家国际知名电子品牌的合作,使Gem Asia迅速在电子行业中崭露头角。

达方(DARFON)公司的发展小趣事

达方电子股份有限公司于1997年在台北市创立,初始阶段主要致力于IT周边组件的研发与生产。创始人凭借对市场趋势的敏锐洞察,决定专注于笔记本键盘的生产,并逐步在行业中崭露头角。通过不断的技术创新和产品优化,达方电子的笔记本键盘逐渐获得了市场的认可,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

菜鸟求教简单的问题

刚学99SE,不知道若运放,双联电位器怎么设置才能够是一个元件,就是电路土和PCB中一致…

查看全部问答>

MSP430单片

msp430 单片机学习啊!…

查看全部问答>

在win ce中如何 结束进程

在win ce中如何结束进程 要求在一个进程中结束另一个进程…

查看全部问答>

VS2005下如何把WM5的项目转WM2003编译?

我在VS2005下已做好WM5的项目,可转WM2003编译供WM2003的PDA使用,但找不到选项更改?! 我想到的笨办法是要另建一个WM2003的同名项目,再把WM5的项目中的同名文件覆盖过来,然后在项目不添加后加的文件,但工作量好象不小。 特此请教!…

查看全部问答>

求购光电转换装置

求购光电转换装置:要求该装置能输出与光通量成比例的电压(或电流)信号.此信号能被普通单片机识别. 大虾们推荐推荐.…

查看全部问答>

一个热爱电子的学子提问:关于三角波的测量

我想设计一个电路用来测量三角波的幅度,频率,以及斜率,我觉得对幅度来说可以用数模转换,在不同的幅度输出不同的值;在频率方面,用时钟电路来做计时,在一个波完时再对时钟中断;而在斜率方面,就不太清楚了,也不知道对不对,请给个方向吧!但 ...…

查看全部问答>

半导体的集成程度怎么区分

请问大家.半导体集成,它的集成程度分为小规模集成,中规模集成,大规模集成,超大规模集成,特大规模集成,巨大规模集成.请问是如何区分的.请举个具体型号的例子.谢谢 [ 本帖最后由 jirongchang 于 2010-8-26 13:15 编辑 ]…

查看全部问答>

ARM.RealView.Development.Suite.v4.0 不能在win7下使用么?

发现安装都不能进行,不知道有没有人在Windows7下安装成功呢?…

查看全部问答>

可以连接到目标板,但进不了调试模式

各位大哥,帮忙解释下撒 Start Debugging后找不到调试的黄色小箭头…

查看全部问答>