前回と前々回で
GPIOの扱い方を検討しました.
今回はUART通信の扱い方を検討します.
所謂"シリアル通信".
ここではハードウェアフロー制御もクロック線も使用しない.
全二重UART通信
初期化して通信する.簡単だね!
GPIOを初期化する.PA9とPA10をUARTに接続.
UARTを初期化する.ビットレートなどを設定.
クロックの供給を忘れずに.
STM32F103C8T6は,3系統のUSARTペリフェラルをもち,それぞれを同時に,独立に使用することができます.
(比較的)安価なAVRマイコン(例えばAtMega328P,AtMega88V,AtTiny2313などなど)は,一般的にUSARTを1つしか持ちません.そのようなデバイスでは,USARTを用いて複数のデバイスと通信するのは大変困難です.
まぁ何よりもまずは使ってみましょう.
以下に,GPIOとUSARTペリフェラルをUART通信のために初期化(設定)するコードの例を示します.
RCC, GPIO
まずは復習っぽいところから.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
忘れると動きません.きをつけて.もしかすると引数にはRCC_APB2Periph_AFIOも必要かもしれません.
GPIO_InitTypeDef gpioInit;
/* GPIOA PIN9 alternative function Tx */
gpioInit.GPIO_Pin = GPIO_Pin_9;
gpioInit.GPIO_Speed = GPIO_Speed_50MHz;
gpioInit.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &gpioInit);
まずは前回のようにGPIOの初期化をします.ModeにGPIO_Mode_AF_PPを指定することで,PAをUSARTの送信(Tx)ピンとして設定できます.
/* GPIOA PIN10 alternative function Rx */
gpioInit.GPIO_Pin = GPIO_Pin_10;
gpioInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpioInit);
同様に,ModeにGPIO_Mode_IN_FLOATINGを指定してPA10を受信(Rx)ピンとして設定します.GPIO_Mode_AF_PPのAFはAlternate Functionを,PPはPush Pullをそれぞれ表します.
いよいよUSARTを初期化します.とはいえこれの読者はU(S)ARTをまだよく知らないでしょうから,今は理解しようとしなくてもいいです.(もちろん理解しようという意欲があればより好ましいのですが,この段階で色々と無理やり理解しようとして挫折されるのは,筆者としては何としても避けねばなりません:P)
USART_InitTypeDef usartInit;
usartInit.USART_BaudRate = 115200;
usartInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
usartInit.USART_Parity = USART_Parity_No;
usartInit.USART_StopBits = USART_StopBits_1;
usartInit.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &usartInit);
設定項目は多いですが,やることはGPIOのときと同じです:(a)初期化の操作に必要な構造体(XXX_InitTypeDef)を作り,(b)各フィールドに適切な値を指定して,(c)初期化の関数(XXX_Init())を呼び出せば,初期化は完了です.STM32では基本的に全てこのパターンでペリフェラルを初期化してゆきます.
最後に大事な操作です.USARTを含む幾つかのペリフェラルは,初期化した後に有効化をしないと使うことができません.そこで,最後に
USART_Cmd(USART1, ENABLE);
という記述を加えてやります.これでUSARTを使う準備が整いました.
☆(読み飛ばしてよい・ここから)
後述する割り込みを使用する場合にはUSART_ITConfigを呼び出して,USARTペリフェラルが割り込みフラグを設定できるようにします.
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
☆(読み飛ばしてよい・ここまで)
今回はGPIOを設定したのちにUSARTの設定をしましたが,必ずしもこの順番に沿う必要はありません.USARTの設定をしてからGPIOの設定をしても同様に動作することが期待されます.
最終更新:2017年08月17日 21:29