NUCLEO-F302R8 UART
LEDチカチカの続きです。今回はUARTでPCにデータを送信できるようにします。
リファレンス
マイコンのRM(リファレンスマニュアル)とDS(データシート)を参照します。
DS: https://www.st.com/resource/en/datasheet/stm32f302r6.pdf
構成
UART2
- Bus: APB1
- PA2: TX
- PA3: RX
- PA2,3共にAF7(Alternate functions for Port A 0x7)で使用
初期化
Clock
- RCC_AHBENR: IOPAEN Enable 1b
- USART2でPA2,3を使用するので、GPIOAのクロックを有効にします。
- RCC_APB1ENR: USERT2 Enable 1b
- USERT2のクロックを有効にします。
- RCC_CFGR3: USART2SW PCLK 00b
- クロックを選択できます。デフォルトのPCLK(Peripherals Clock)を使用します。ただし、F320R8ではクロックの選択できないと記載があります。
GPIOA
- GPIOx_MODER
- MODER2: Alternate function mode 10b
- MODER3: Alternate function mode 10b
- GPIOをUARTのような機能として使用する場合はAF(Alternate function) を設定します。
- GPIOx_AFRL
- AFR2: AF7 USART2_TX 0111b
- AFR3: AF7 USART2_RX 0111b
- MODERをAFに設定したポートで使用する機能を選択します。何がそのポートで使えるかは以下のデータシートを参照してください。
Alternate functions
DS: Table 14. Alternate functions for Port A
UART
- USART_CR1
- M1: 1 start bit, 8 data bits, n stop bits 00b
- M0: 1 start bit, 8 data bits, n stop bits 00b
- 1フレームのビット長を設定します。2bitの値ですが、bitがM1とM0に分かれています。
- OVER8: Oversampling by 16 0b
- 1bitの値を判定するためのサンプリング回数を設定します。
- TE: Transmitter is enabled 1b
- 送信を有効にします。
- RE: Receiver is enabled 1b
- 受信を有効にします。
- UE: USART enabled 1b
- UARTが有効になります。
- USART_CR2
- STOP: 1stop bit 00b
- ストップビットの数です。
- STOP: 1stop bit 00b
- USART_BRR
- BRR: 9600[bps] 0341h
- ボーレートを設定します。ただ、ボーレートそのものを設定するのではなく、USARTDIV(1bitの時間幅)を設定します。今回の設定では以下のようにUSARTDIVが計算されます。式の詳細は以下に記載したRMを見てください。
- USARTDIV = fck / ボーレート = 8MHz / 9600 = 833(少数は四捨五入) = 0x0341
- BRR: 9600[bps] 0341h
oversampling
RM: Selecting the clock source and the proper oversampling method
ボーレート
RM: 29.5.4 USART baud rate generation
USARTDIVの算出はExample1と全く同じです。
UART送信
1秒周期で1Byteの文字(asciiコード a,b,c)をPCに送信します。
- USART_TDR: TDR
- 送信データレジスタです。値を書き込むと、送信されます。
- USART_ISR: TXE
- TDRの状態を示すレジスタです。0だと送信中、1だと送信完了になります。今回は1秒周期で1Byte送信するだけなので使っていません。複数Byteを送信する場合、TXEが1になるまで待ってからTDRに書き込みます。
UART受信
メモです。今回のコードで受信処理は実装していません。
- USART_RDR: RDR
- 受信データレジスタです。受信したデータが格納されます。
- USART_ISR: RXNE
- RDRの状態を示すレジスタです。0だとデータが空、1だとデータありで読み出し可能です。RDRを読みだすと、RXNEはHWにより0にセットされます。
テスト
Tera TermでSTM32からデータを受信できるか確認します。
以下のgifのようになります。
ST-LINKで書き込めているなら、ST-LINKのCOMポートがTera Termで選択できると思います。選択できない場合はSTM32のVCPドライバをインストールしてください。