打印

请教大牛关于STM32 USART 硬件流控的问题

[复制链接]
14538|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
adofu2008|  楼主 | 2012-11-30 16:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在STM32 的数据手册中看到对USART的硬件流控有这样的描述:贴子太大,已做附件上传。

我在串口配置中已经把
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;   //PA12 RTS
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART1 CTS as input floating PA11 CTS*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
但是在发送数据时,用示波器观察PA12管脚并没有发现这种高电平脉冲。请教一下大牛们,是不是我哪儿配置出问题了?串口收发数据正常。RTS管脚一直是低电平。谢谢!

cts.JPG (65.57 KB )

cts.JPG
沙发
adofu2008|  楼主 | 2012-12-3 10:45 | 只看该作者
自已顶!

使用特权

评论回复
板凳
airwill| | 2012-12-3 14:58 | 只看该作者
没有用过这个功能.
不过, 我想除了GPIO, USART 里也应该做设置吧.

使用特权

评论回复
地板
IJK| | 2012-12-3 17:45 | 只看该作者
印象里STM32有使用RTS、CTS流控的例子, 建议用用看,问题就清楚了。

我用过RTS、CTS流控,记得RTS、CTS 信号都变过。

使用特权

评论回复
5
windzyf| | 2013-1-16 20:48 | 只看该作者
这个按照例子 测试 无法测试到接收的RTS低有效信号

使用特权

评论回复
6
xuzhiya64423951| | 2013-5-4 14:42 | 只看该作者
问题解决没?

使用特权

评论回复
7
hawksabre| | 2013-5-4 17:48 | 只看该作者
楼主   问题解决了吗   应该问题不大    呵呵   帮你顶一个

使用特权

评论回复
8
jun503380| | 2013-10-30 16:33 | 只看该作者
你的问题解决了没?我也遇到了同样的问题,一起讨论啊

使用特权

评论回复
9
steeven_lee| | 2015-5-9 23:35 | 只看该作者
成功!我是用的stm32f411re和mbed, 步骤如下:
1. serial_api.c中init_uart:
UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_RTS_CTS;
2. 初始化UART1的CTS/RTS引脚:
        PinMap rts =  {PA_12,  UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)};
        PinMap cts =  {PA_11,  UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)};
    pin_function(rts.pin, rts.function);
    pin_function(cts.pin, cts.function);
    pin_mode(rts.pin, PullNone); //output, uart request peer to send
    pin_mode(cts.pin, PullUp); // input, peer send 0 to allow uart send
以上代码写好后, 只有把PA_11也就是CTS拉低才能往uart写数据。下面是测试代码:

#include "mbed_stm_demo.h"
#include "BreathLed/BreathLed.h"
#include "PeripheralPins.h"

using namespace steeven;

BreathLed led1(LED1);

Serial pc(USBTX, USBRX);
Serial uart1(PA_9, PA_10);

int main() {
        char ch;
        int i = 0;
        int j = 0;
        led1.loop(0.5, 0.2);
        pc.baud(115200);
        PinMap rts =  {PA_12,  UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)};
        PinMap cts =  {PA_11,  UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)};
    pin_function(rts.pin, rts.function);
    pin_function(cts.pin, cts.function);
    pin_mode(rts.pin, PullNone); //output, uart request peer to send
    pin_mode(cts.pin, PullUp); // input, peer send 0 to allow uart send

        uart1.baud(115200);

        pc.printf("hello world!\n");
        while (1) {
                if (pc.readable()) {
                        i++;
                        ch = pc.getc();
                        if (uart1.writeable()) {
                                uart1.putc(ch);
                        } else {
                                pc.printf("%d/%d ", i,j); //if
                        }
                        if (i%50 == 49){
                                pc.printf("\r\n%d lost: %d \r\n", i,i-j);
                        }
                }
                if (uart1.readable()) {
                        ch = uart1.getc();
                        j++;
                }
        }
}

用串口调试工具不停地定时发送数据,可以看到:
  如果cts悬空, 不停地打印 x/y, 表示数据丢失
  如果cts接地,只有满50才打印一次,没丢

使用特权

评论回复
10
kingpxl| | 2015-6-29 18:22 | 只看该作者
@steeven_lee
我刚好在调试串口RTS/CTS,遇到些问题。
steeven_lee,不写调试程序的话,直接用串口调试工具可以测试RTS/CTS吗?

使用特权

评论回复
11
lefeng| | 2015-6-29 18:51 | 只看该作者
只有把PA_11也就是CTS拉低才能往uart写数据,楼主是不是忽视了这个呢

使用特权

评论回复
12
kingpxl| | 2015-6-30 09:55 | 只看该作者
@lefeng
我现在是用PC和模块进行串口通信,用串口工具来测试。如何测试模块是否支持硬流控RTS/CTS?
以下是我的理解,用串口工具如何测试?
当PC的RTS为低时,模块的CTS则为低,此时模块向PC发送数据,PC接收数据。
当模块的RTS为低时,PC的CTS则为低,此时PC向模块发送数据,模块接收数据。

谢谢

使用特权

评论回复
13
豆腐块| | 2015-6-30 11:31 | 只看该作者
9楼的大师能把大概的电路传上来吗

使用特权

评论回复
14
kingpxl| | 2015-7-1 09:40 | 只看该作者
大师呢?

使用特权

评论回复
15
steeven_lee| | 2015-8-11 16:45 | 只看该作者
要看你的工具是否支持cts/rts测试了.... 多找几个板子试试, 看看波形电压比较容易找到原因.

使用特权

评论回复
16
Mrjiang88178| | 2015-8-14 13:39 | 只看该作者
留名

使用特权

评论回复
17
jsh560| | 2019-1-14 12:44 | 只看该作者
你好,你用的硬件流程序还在吗?能否给我借鉴下。谢谢

使用特权

评论回复
18
hyhjhnhg| | 2019-1-14 14:17 | 只看该作者
没用过硬件流控制,进来学习下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

142

帖子

1

粉丝