Project

General

Profile

Actions

UsingUart

NUCLEOボードでは、STM32に搭載されたU(S)ARTのうちひとつが、ST-Link部分経由でPCから仮想UARTとして見えるようになっています。
STM32側のソフトで、それを使用できるようにします。

まずSTM32CubeMX上でピン設定する

NUCLEO-F429ZIでST-Linkに接続されているのはUSART3です。
どのUSARTなのか特定するためにはマニュアルで調べるのが正しいやり方ですが、STM32CubeMXの画面上でSTLK_TX,STLK_RXのピンをマウスオーバーすればわかるので、それでもよいでしょう。

CubeMX画面上で以下の設定を行います。(とりあえずDMAでなく割り込みを使う設定です)

  • Connectivity - USART3 に関して
    • Modeを Disable→Asynchonous
    • Baud Rate を 9600bps
    • NVIC Settings の USART3 global interrupt をチェック
    • GPIO Settings の USART3_TXピン のMaximum output speedを Very High→Low
  • System Core - NVIC に関して
    • USART3 global interrupt の Preemption Priority を 0→2
    • Time base: TIM6 ~ の Preemption Priority を 0→1
  • Project Managerタブ に関して
    • Advanced Settingsを選択し、USART3を HAL→LL(Low Layer)

補足
USART3_TXはクロス接続なのでSTLK_RXに結線されています。
USARTのドライバをHALからLLに直すのは、HALドライバだといちいち割り込みを許可/禁止する不自然なプログラムになるためです。

送受信を割り込みを使って行う

ソースの変更点は https://ashidan.myhome.cx/gitbucket/git/molelord/stm32.git をcloneして、 SHA-1: 42f35a0(2020/09/21 22:29:45) と SHA-1: a6138a8(2020/09/23 0:25:46) とを「リビジョンの比較」するとわかります。

送受信をDMAを使って行う

※作り終えてから知ったのですが、考え方は既出でした→ https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx

送信は ダブルバッファリング+DMA+FreeRTOSタイマによるタイムアウトで行い、
受信は circular DMA+受信信号線のIDLE検出で行います。

ソースの変更点は https://ashidan.myhome.cx/gitbucket/git/molelord/stm32.git をcloneして、 SHA-1: b117ca7(2020/10/17 1:39:23) と SHA-1: 167177d(2020/10/24 22:10:12) とを「リビジョンの比較」するとわかります。

タイムアウトが必要な理由は、送信バッファの中に溜まるだけで相手に伝わらない、という状態を避けるためです。
IDLE検出が必要な理由は、相手が何バイト送ってくるかわからない状況の中で、受信待ち状態のタスクを叩き起こすためです。

注意点

CubeMX上でuartのDMAを有効にした直後は、割り込みの優先度が0になっています。 CubeMXから組み込めるFreeRTOSでなく外付けのAmazon FreeRTOSを使う場合は、手動でDMA割り込みの優先度を5または5より大きな値に変える必要があります。


累計表示回数:63

Updated by mole lord about 1 month ago · 5 revisions