笔记之STM32F072CBT6芯片的串口高级功能之反相配置问题(HAL库)

串口的使用,通常都是修改波特率,停止位,校验位等这几个常见的参数,所以这些的配置基本是没有什么问题的,不过今天逛论坛的时候发现有些芯片是支持软件反相功能的,目前我发现F0的大多都有这个功能,F1的没有这个功能,大家可以去看看其他一些芯片。

一、F0芯片手册上寄存器

在串口的控制寄存器 2( USART_CR2)第17位
在这里插入图片描述
注意:这里要配置反相,必须是UE=0的时候才能改写
在F1的手册上,这几个位是保留位

二、进行测试

理论上可以实现的,故我直接在我只有的串口代码上直接加下面代码,直接操作寄存器

USART3->CR1 &=~(1<<0);    // UE=0
USART3->CR2 |=1<<18;
USART3->CR2 |=1<<17;//  TX 有效电平反向
USART3->CR1 |=1<<0;     // UE=1

下面是我在线调试采集的现象
在这里插入图片描述
可以看到我只是在下面增加这几行代码,寄存器对应的值发生了变化(这样的话可以在硬件上节省几毛钱),可以直接软件控制反相,不需要硬件上增加反相器。

同时我想HAL库的话,应该也是可以直接控制的。
之后对工程进行了搜索TXINV关键字,发现在这下面的配置中有支持TX反相的功能配置
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;//高级功能初始化
然后我将上面的配置改为下面配置
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;//TX 反相
按照这个配置,照理调试的时候也是可以将寄存器的值进行改变的,但是调试时TXINV的值是不变的
在这里插入图片描述

可以看到调试时,寄存器值根本没变,奇怪,我直接控制寄存器都可以控制,为啥使用HAL反而还不能控制了?
之后再HAL的串口初始化函数中找了许久,没找到问题,实在找不到了,我打开CUBEMX查看了下这个芯片,发现他也是支持反相的
在这里插入图片描述
于是我重新创建了一份只有串口初始化的工程,发现问题了

huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;
huart3.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;

他选择了TXINV配置后,还对TXINV进行了使能…
于是我将这行代码复制我之前测试的上面去,哎,成功了…
在这里插入图片描述

三、总结及现象

对于一个不太熟悉的库,首先参考他的例程配置,可以减少很多不必要的麻烦
另外这个串口的高级功能,要先配置,再使能,同样这里的高级功能还有其他的一些如自动检测波特率功能,到时也可以试试。
图1是串口3输出软件不反相
图1
图2是串口3输出软件反相
在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值