串口的使用,通常都是修改波特率,停止位,校驗位等這幾個常見的引數,所以這些的配置基本是沒有什么問題的,不過今天逛論壇的時候發現有些芯片是支持軟體反相功能的,目前我發現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輸出軟體反相

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248156.html
標籤:其他
