Project

General

Profile

UsingUart » History » Version 5

mole lord, 10/24/2020 05:13 PM

1 1 mole lord
# UsingUart
2
3
{{>toc}}
4
5
NUCLEOボードでは、STM32に搭載されたU(S)ARTのうちひとつが、ST-Link部分経由でPCから仮想UARTとして見えるようになっています。
6
STM32側のソフトで、それを使用できるようにします。
7
8
## まずSTM32CubeMX上でピン設定する
9
10
NUCLEO-F429ZIでST-Linkに接続されているのはUSART3です。
11
どのUSARTなのか特定するためにはマニュアルで調べるのが正しいやり方ですが、STM32CubeMXの画面上でSTLK_TX,STLK_RXのピンをマウスオーバーすればわかるので、それでもよいでしょう。
12
13 3 mole lord
CubeMX画面上で以下の設定を行います。(とりあえずDMAでなく割り込みを使う設定です)
14 1 mole lord
15
* Connectivity - USART3 に関して
16
 * Modeを Disable→Asynchonous
17
 * Baud Rate を 9600bps
18
 * NVIC Settings の USART3 global interrupt をチェック
19
 * GPIO Settings の USART3_TXピン のMaximum output speedを Very High→Low
20
* System Core - NVIC に関して
21
 * USART3 global interrupt の Preemption Priority を 0→2
22
 * Time base: TIM6 ~ の Preemption Priority を 0→1
23
* Project Managerタブ に関して
24
 * Advanced Settingsを選択し、USART3を HAL→LL(Low Layer)
25
26
補足
27
USART3_TXはクロス接続なのでSTLK_RXに結線されています。
28
USARTのドライバをHALからLLに直すのは、HALドライバだといちいち割り込みを許可/禁止する不自然なプログラムになるためです。
29 2 mole lord
30 5 mole lord
## 送受信を割り込みを使って行う
31
32 4 mole lord
ソースの変更点は 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) とを「リビジョンの比較」するとわかります。
33 5 mole lord
34
## 送受信をDMAを使って行う
35
36
※作り終えてから知ったのですが、考え方は既出でした→ https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx
37
38
送信は ダブルバッファリング+DMA+FreeRTOSタイマによるタイムアウトで行い、
39
受信は circular DMA+受信信号線のIDLE検出で行います。
40
41
ソースの変更点は 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) とを「リビジョンの比較」するとわかります。
42
43
タイムアウトが必要な理由は、送信バッファの中に溜まるだけで相手に伝わらない、という状態を避けるためです。
44
IDLE検出が必要な理由は、相手が何バイト送ってくるかわからない状況の中で、受信待ち状態のタスクを叩き起こすためです。
45
46
### 注意点
47
48
CubeMX上でuartのDMAを有効にした直後は、割り込みの優先度が0になっています。 CubeMXから組み込めるFreeRTOSでなく外付けのAmazon FreeRTOSを使う場合は、手動でDMA割り込みの優先度を5または5より大きな値に変える必要があります。