[STM32F1]

一直发不出数据

[复制链接]
1005|21
手机看帖
扫描二维码
随时随地手机跟帖
chuxh|  楼主 | 2021-8-6 20:54 | 显示全部楼层 |阅读模式
usart 单线半双工, 一直发不出数据,不知是何原因

使用特权

评论回复
tian111| | 2021-8-6 20:59 | 显示全部楼层

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
chuxh|  楼主 | 2021-8-6 21:04 | 显示全部楼层
配置为开漏输出 但一直抓不到数据
  float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分         
    mantissa<<=4;
        mantissa+=fraction;
        RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
        RCC->APB2ENR|=1<<14;  //使能串口时钟
        GPIOA->CRH&=0XFFFFFF0F;//PA9开楼输出
        GPIOA->CRH|=0X000000F0;//PA9开楼输出
//            GPIOA->CRH&=0XFFFFF00F;//IO状态设置
//          GPIOA->CRH|=0X000008B0;//IO状态设置
        RCC->APB2RSTR|=1<<14;   //复位串口1
        RCC->APB2RSTR&=~(1<<14);//停止复位                     
        //波特率设置
        USART1->BRR=mantissa; // 波特率设置         
        USART1->CR1|=0X200C;  //1位停止,无校验位.  禁止RX接收0X2008 使能RX接收0X200C
            USART1->CR3|=1<<3;//HDSEL = 1,选择半双工
            USART1->CR2&=~(1<<14);//LINEN = 0
            USART1->CR2&=~(1<<11);//CLKEN = 0
            USART1->CR3&=~(1<<5);//SCEN = 0
            USART1->CR3&=~(1<<1);//IREN = 0
   
        //使能接收中断
        USART1->CR1|=1<<8;    //PE中断使能
        USART1->CR1|=1<<5;    //接收缓冲区非空中断使能

使用特权

评论回复
chuxh|  楼主 | 2021-8-6 21:06 | 显示全部楼层
上面没有加入 RCC->APB2ENR|=1<<0;  //使能AF时钟
目前已经加入时钟 但数据会产生异常

使用特权

评论回复
renyaq| | 2021-8-6 21:10 | 显示全部楼层
既然是开漏输出, 那么确认一下外部上拉是否可靠呢?

使用特权

评论回复
chuxh|  楼主 | 2021-8-6 21:12 | 显示全部楼层
你好 发现只有复用的推挽才能发送数据,通用的推挽 开漏,还有 复用开漏 都无法发送数据成功,但官方例程是吧 数据配制成 复用开漏的
  /* Configure USARTy Tx as alternate function open-drain */
  GPIO_InitStructure.GPIO_Pin = USARTy_TxPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  不能发送数据
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

不知道为何

使用特权

评论回复
chuxh|  楼主 | 2021-8-6 21:15 | 显示全部楼层
是否因为若设置成 开漏模式,但我外部没有配置上啦电阻,导致无输出数据

使用特权

评论回复
huangchui| | 2021-8-6 21:17 | 显示全部楼层
很 可能,  可以配置内部上拉来输出高电平, 但是内部上拉的能力太弱, 频率稍高, 稳定性就不好.

使用特权

评论回复
zhenykun| | 2021-8-6 21:19 | 显示全部楼层
建议使用外部上拉电阻.

使用特权

评论回复
chuxh|  楼主 | 2021-8-6 21:21 | 显示全部楼层
嗯,已经确认是 内部上啦不够强的问题

使用特权

评论回复
juventus9554| | 2021-8-6 21:23 | 显示全部楼层
串口输出不是要配置为 复用推挽输出么?

使用特权

评论回复
dingy| | 2021-8-6 21:27 | 显示全部楼层
官方例程里不会把USART-TX配置成“开漏”吧?

使用特权

评论回复
huanghuac| | 2021-8-6 21:33 | 显示全部楼层
看了几个例程都是配置成推挽

使用特权

评论回复
happy_10| | 2021-8-6 21:38 | 显示全部楼层
软件上要做好滤波处理,用滑动平均处理

使用特权

评论回复
dengdc| | 2021-8-6 21:40 | 显示全部楼层
另外,对于STM32F1的各个外设模块应该如何配置对应GPIO引脚,请大家去看参考手册9.1.11章节

使用特权

评论回复
chuxh|  楼主 | 2021-8-6 21:42 | 显示全部楼层
1479610d3c45b0af9.png

使用特权

评论回复
zhenykun| | 2021-8-6 21:44 | 显示全部楼层
66446610d3cca1ba07.png

使用特权

评论回复
jlyuan| | 2021-8-6 21:47 | 显示全部楼层
但是手册在串口对应的章节讲到单线半双工模式下确实要配置成开漏或者推挽输出。

使用特权

评论回复
juventus9554| | 2021-8-6 21:49 | 显示全部楼层
单线半双工模式,只使用TX引脚,GPIO配置为复用推挽或者复用开漏都是可以的

使用特权

评论回复
chenjunt| | 2021-8-6 21:53 | 显示全部楼层
但是,一定要记得加上拉电阻

使用特权

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

本版积分规则

936

主题

11296

帖子

2

粉丝