首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >串口到串口网桥STM32

串口到串口网桥STM32
EN

Stack Overflow用户
提问于 2019-06-21 05:20:37
回答 3查看 2.4K关注 0票数 0

有没有一种简单的方法可以通过软件“桥接”2U(S)艺术线(STM32F107上的USART1& UART5 )?

我需要将USART1传入的数据转发到UART5,然后反向转发。

当前微控制器为STM32F107VCT7

我想这样做的主要原因是要通过连接到我的MCU的UART更新设备。单片机与PC机相连。

PC - STM32 -其他设备

EN

回答 3

Stack Overflow用户

发布于 2019-06-21 06:53:28

你能把数据写到适当的usart寄存器吗?也就是说,如果usart1线路上有一个字节,且该字节存储在usart1数据寄存器中,则读取该字节并将其写入usart5数据寄存器,然后设置该位,让芯片知道它已准备好传输该字节。对usart5到usart1网桥执行相同的操作。

如果您担心读/写多个字节,请考虑添加发送和接收缓冲区来处理此问题。

如果我们要做一个轮询方法,代码应该是这样的(注意:我主要处理AVR,所以我可能不使用我的寄存器名称,但方法应该是这样的):

代码语言:javascript
运行
复制
// Check to see if data has been written to usart1 and transfer it usart5.
if(USART1_CR1&(1 << USART1_SR_RXNE))
{
    // May want to avoid race conditions, so disable interrupts.
    // Write the data in usart1 to usart5
    USART5_DR = USART1_DR;

    // Set the data ready bit on the usart5 control register.
    USART5_CR1 |= (1 << USART_SR_RXNE);
    // Enable interrupts.
}

我在STM32语言中使用了this tutorial。不是关于禁用中断的问题。您可能还想写入缓冲区。

票数 1
EN

Stack Overflow用户

发布于 2019-06-22 17:03:55

简单地将字节从一个复制到另一个UART是行不通的。

如果发送端(PC串行适配器)仅比MCU快0.1%,它将在第1000个字节之后开始丢弃字节。在数据表中,STM32F107内部时钟的频率精度在室温下为-1.1%到+1.8%,因此它可能发生得更早,其他两个参与者可能也不完全准确。

在固件更新过程中将字节丢弃到原本无法访问的部分并不是一件有趣的事情。

两种方式都需要循环()缓冲区

缓冲区的大小由数据分组的大小和参与设备中的频率误差之和确定。例如,如果一个块中有64个kB数据,并且两个设备都具有+/- 2%的频率精度,那么您将至少需要65536*0.04 ~ 2622字节的缓冲区。

在一个无限的循环中这样做,

检查USART1->SR

  • if集合中的RXNE,从USART1->DR中读取数据并将其放在缓冲区的开头(如果缓冲区已满,则大声抱怨)

  • 检查UART5->SR`

  • if集合中的TXE,并且缓冲区不为空,将缓冲区尾部的字节写入UART5->DR

  • do,另一个方向的

也是如此

票数 0
EN

Stack Overflow用户

发布于 2019-06-22 20:34:36

简单的双向通信方法,假设两个UART的速度相同。

代码语言:javascript
运行
复制
volatile uint8_t data[2];

void USART1_IRQHandler(void)
{
    if(USART1 -> SR & USART_SR_RXNE)
    {
        data[0] = USART1 -> DR;
        USART5 -> CR1 |= USART_CR1_TXEIE;
    }

    if( (USART1 -> CR1 & USART_CR_TXEIE) && (USART1 -> SR & USART_SR_TXE))
    {
        USART1 -> CR1 &= ~USART_CR1_TXEIE;
        USART1 -> DR = data[1];
    }
}

void USART5_IRQHandler(void)
{
    if(USART5 -> SR & USART_SR_RXNE)
    {
        data[1] = USART5 -> DR;
        USART1 -> CR1 |= USART_CR1_TXEIE;
    }

    if( (USART5 -> CR1 & USART_CR_TXEIE) && (USART5 -> SR & USART_SR_TXE))
    {
        USART5 -> CR1 &= ~USART_CR1_TXEIE;
        USART5 -> DR = data[0];
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56694018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档