STM32F7、L4、H7シリーズではUART通信をする際に非常に便利な拡張機能があります。今回はUART拡張機能について紹介します。例えばUARTを利用する際に基板のTXとRXを間違えて逆転させてしまったり(回路上でTXとRXをクロスさせることを忘れていた)、フォトカプラを接続するので論理を逆転させたい(通常は論理反転のバッファICやトランジスタ等で追加ハードウェアで論理反転させる)、DMA受信時のエラー処理を無効にしたい(デフォルトではSTM32のUART受信でフレームエラー等が発生するとクリアするまで受信できない)といったことが多々あると思います。そのような場合にUART拡張機能を利用することでハードウェア追加や修正なしにソフトウェア側の設定変更のみで切り替えることが可能です。
UART拡張機能は下記の通りです。
名称 | 機能 |
UART_ADVFEATURE_TXINVERT | TX論理反転 |
UART_ADVFEATURE_RXINVERT | RX論理反転 |
UART_ADVFEATURE_DATAINVERT | データビット論理反転 |
UART_ADVFEATURE_SWAP | TX、RX入れ替え |
UART_ADVFEATURE_RXOVERRUNDISABLE | 受信エラー無効 |
UART_ADVFEATURE_DMADISABLEONERROR | DMA受信エラー無効 |
UART_ADVFEATURE_AUTOBAUDRATE | オートボーレート有効 |
UART_ADVFEATURE_MSBFIRST | MSB有効 |
UART拡張機能の定義はstm32XX_hal_uart.hで下記のように定義されています。
/*!< No advanced feature initialization */
#define UART_ADVFEATURE_NO_INIT 0x00000000U
/*!< TX pin active level inversion */
#define UART_ADVFEATURE_TXINVERT_INIT 0x00000001U
#define UART_ADVFEATURE_TXINVERT_INIT 0x00000001U
/*!< RX pin active level inversion */
#define UART_ADVFEATURE_RXINVERT_INIT 0x00000002U
#define UART_ADVFEATURE_RXINVERT_INIT 0x00000002U
/*!< Binary data inversion */
#define UART_ADVFEATURE_DATAINVERT_INIT 0x00000004U
#define UART_ADVFEATURE_DATAINVERT_INIT 0x00000004U
/*!< TX/RX pins swap */
#define UART_ADVFEATURE_SWAP_INIT 0x00000008U
#define UART_ADVFEATURE_SWAP_INIT 0x00000008U
/*!< RX overrun disable */
#define UART_ADVFEATURE_RXOVERRUNDISABLE_INIT 0x00000010U
#define UART_ADVFEATURE_RXOVERRUNDISABLE_INIT 0x00000010U
/*!< DMA disable on Reception Error */
#define UART_ADVFEATURE_DMADISABLEONERROR_INIT 0x00000020U
#define UART_ADVFEATURE_DMADISABLEONERROR_INIT 0x00000020U
/*!< Auto Baud rate detection initialization */
#define UART_ADVFEATURE_AUTOBAUDRATE_INIT 0x00000040U
#define UART_ADVFEATURE_AUTOBAUDRATE_INIT 0x00000040U
/*!< Most significant bit sent/received first */
#define UART_ADVFEATURE_MSBFIRST_INIT 0x00000080U
#define UART_ADVFEATURE_MSBFIRST_INIT 0x00000080U
実際に使用する場合はCubeMXで設定するか、下記のコードをUART初期化関数MX_USARTX_UART_Initに追記して使用します。CubeMXで設定する場合は下記のようにUARTの設定項目のAdvanced Featuresから有効/無効を設定します。
コード上から修正する場合はデフォルトでUART_ADVFEATURE_NO_INITとなっているため、必要な項目を追加して各項目を有効化して使用します。
デフォルト
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
追加例
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT | UART_ADVFEATURE_SWAP_INIT;
huart1.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
huart1.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
huart1.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
huart1.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
STM32F7、L4、H7シリーズのみ対応しているのが残念ですが、UART拡張機能の中でもTXとRXの入れ替え機能は非常に便利だと思いました。TXとRXをクロスさせて回路設計することを忘れていたり、クロスさせたはずが回路上で間違えていたり、クロスケーブルがなく、ストレートケーブルしか準備できていなかったり、UARTのTX、RX絡みでよくあるトラブルがソフトウェア上で解決できるのは非常に便利です。