串口的使用,通常都是修改波特率,停止位,校验位等这几个常见的参数,所以这些的配置基本是没有什么问题的,不过今天逛论坛的时候发现有些芯片是支持软件反相功能的,目前我发现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输出软件不反相
图2是串口3输出软件反相