- 12/02 Information!!
- 07/07 【グラブル】バハムートを最終上限解放
- 07/06 【グラブル】光有利の古戦場
- 06/14 【動物園】愛媛県立とべ動物園
- 05/31 【グラブル】開放したシスとエッセルの使用感
This is new entry
USART通信の3回目です。
1回目ではEWARMのプロジェクト作り
2回目ではLチカをやってみました。
3回めからはUSART通信を進めていきます。
まず、USART通信の基本的な動作をさせましょう。
マイコン起動時に通信テストを兼ねて
マイコンからパソコンに「A」と1文字だけ送ってみましょう。
(複数文字は次回やります)
まずUSARTについてですが
データシートを見ると
PA2 USART2_TX
PA3 USART2_RX
となっています。
とりあえずココを使いましょう。
USARTを使うにしてもまずはRCCとGPIOの設定は必須です。
データシートP.12のブロック図をみると
USART2はAPB1のバスにつながっています。
よってクロックの供給は
stm32L1xx_rcc.cの1145行目の
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
を使います。
実際にはこの前のRCCを設定した関数
void RCC_configuration(void)のなかに
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
という記述を足します。
そして次にGPIOの設定です。
USARTで使う場合には
データシートを見ますと
USART機能は「Alternate Functions」(AF)に分類されます。
また、stm32l1xx_usart.cの冒頭に手順が書いてあります。
簡単に書きますと
1.USART2の場合はRCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE)でクロックを供給しなさい
2.GPIOの設定はRCC_AHBPeriphClockCmd()の関数を使いなさい
3.AFのコンフィグはGPIO_PinAFConfig()の関数を使いなさい。そしてGPIOのモードはAFを選びなさい。OTypeや速度を設定しなさい。初期化はGPIO_Init()関数を使いなさい。
4.ボーレート、ワード長、ストップビット、~各種シリアルの設定をしなさい。
(今回は関係ないので中略)
7.USARTの開始はUSART_Cmd()関数を使いなさい。
ということでコレに従っていきます。
ちなみに・・・(読み飛ばし推奨)
GPIO_PinAFConfig()はほかのSTM32のチップではあまり使っていない関数です。他だとmain_function/Alternate Function/Remapというふうに分けているので、AF機能を選ぶだけで自動的に機能が決まるようになっています。しかし、このSTM32LのチップはRemapがなくて本来であればRemapに配置されるものをAFに入れています。つまり、AFの中に複数の機能が入っています。よって、単にAF機能を選ぶだけでは使いたい機能が選択されません。よってGPIO_PinAFConfig()でAFの中からさらに使いたい機能を選択する必要があります。要はRemapと同じことなんですけどね・・・。コレに気づかずに「AF選んでるのになんで動かネーんだよ!!」と3日位もがきました。ほかのチップを参考にしたのが逆に固定観念作って仇となったカタチですね。低消費電力モードがあるL系列のチップだからだそうです。L系のチップはただでさえ癖のあるARMのなかでもとりわけクセが強いそうです。そんなもの選ぶんじゃなかったと若干後悔中ですよ。テストボード自体はディスプレイもタッチパネルもあって面白いんですけどね・・・。
(ここまで)
なのでまずAFの選択を先にします。
GPIO_PinAFConfig()を見に行くと
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
というのが出てきます。
GPIO_TypeDef* GPIOx は今回はGPIOAです。
uint16_t GPIO_PinSource はstm32l1xx_gpio.hの195行目あたりに書いてあります。今回はこれの2と3を選びます。
uint8_t GPIO_AF はこの関数のすぐ上(stm32l1xx_gpio.c477行目あたり)に書いてあります。これのUSART2を選びます。
というわけで、
GPIOのconfigの関数の冒頭に
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
という記述を入れます。
このあとにGPIOの設定を前回と同様に入れていきます。(GPIOの設定後にPinAFconfigをやるとノイズが出るので間違えないように)
Txでは、
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);
と記述し、
Rxでは、
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
と記述します。
実際は共通する場所は繰り返す必要はないので、
前回のLチカの続きに書くならば
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
で、設定ができます。
ちなみに、USARTで使うときは設定をこうしなさい(AFのPPや入力のフローティング)というのがリファレンスマニュアルに書いてあるはずなのですが・・・今回のリファレンスでは見つかりませんでした・・・。まぁ一般的なSTM32のチップなら大体決まった設定なのでそれでいきます。
これで、基本の設定が終わりました。
1回目ではEWARMのプロジェクト作り
2回目ではLチカをやってみました。
3回めからはUSART通信を進めていきます。
まず、USART通信の基本的な動作をさせましょう。
マイコン起動時に通信テストを兼ねて
マイコンからパソコンに「A」と1文字だけ送ってみましょう。
(複数文字は次回やります)
まずUSARTについてですが
データシートを見ると
PA2 USART2_TX
PA3 USART2_RX
となっています。
とりあえずココを使いましょう。
USARTを使うにしてもまずはRCCとGPIOの設定は必須です。
データシートP.12のブロック図をみると
USART2はAPB1のバスにつながっています。
よってクロックの供給は
stm32L1xx_rcc.cの1145行目の
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
を使います。
実際にはこの前のRCCを設定した関数
void RCC_configuration(void)のなかに
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
という記述を足します。
そして次にGPIOの設定です。
USARTで使う場合には
データシートを見ますと
USART機能は「Alternate Functions」(AF)に分類されます。
また、stm32l1xx_usart.cの冒頭に手順が書いてあります。
簡単に書きますと
1.USART2の場合はRCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE)でクロックを供給しなさい
2.GPIOの設定はRCC_AHBPeriphClockCmd()の関数を使いなさい
3.AFのコンフィグはGPIO_PinAFConfig()の関数を使いなさい。そしてGPIOのモードはAFを選びなさい。OTypeや速度を設定しなさい。初期化はGPIO_Init()関数を使いなさい。
4.ボーレート、ワード長、ストップビット、~各種シリアルの設定をしなさい。
(今回は関係ないので中略)
7.USARTの開始はUSART_Cmd()関数を使いなさい。
ということでコレに従っていきます。
ちなみに・・・(読み飛ばし推奨)
GPIO_PinAFConfig()はほかのSTM32のチップではあまり使っていない関数です。他だとmain_function/Alternate Function/Remapというふうに分けているので、AF機能を選ぶだけで自動的に機能が決まるようになっています。しかし、このSTM32LのチップはRemapがなくて本来であればRemapに配置されるものをAFに入れています。つまり、AFの中に複数の機能が入っています。よって、単にAF機能を選ぶだけでは使いたい機能が選択されません。よってGPIO_PinAFConfig()でAFの中からさらに使いたい機能を選択する必要があります。要はRemapと同じことなんですけどね・・・。コレに気づかずに「AF選んでるのになんで動かネーんだよ!!」と3日位もがきました。ほかのチップを参考にしたのが逆に固定観念作って仇となったカタチですね。低消費電力モードがあるL系列のチップだからだそうです。L系のチップはただでさえ癖のあるARMのなかでもとりわけクセが強いそうです。そんなもの選ぶんじゃなかったと若干後悔中ですよ。テストボード自体はディスプレイもタッチパネルもあって面白いんですけどね・・・。
(ここまで)
なのでまずAFの選択を先にします。
GPIO_PinAFConfig()を見に行くと
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
というのが出てきます。
GPIO_TypeDef* GPIOx は今回はGPIOAです。
uint16_t GPIO_PinSource はstm32l1xx_gpio.hの195行目あたりに書いてあります。今回はこれの2と3を選びます。
uint8_t GPIO_AF はこの関数のすぐ上(stm32l1xx_gpio.c477行目あたり)に書いてあります。これのUSART2を選びます。
というわけで、
GPIOのconfigの関数の冒頭に
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
という記述を入れます。
このあとにGPIOの設定を前回と同様に入れていきます。(GPIOの設定後にPinAFconfigをやるとノイズが出るので間違えないように)
Txでは、
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);
と記述し、
Rxでは、
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
と記述します。
実際は共通する場所は繰り返す必要はないので、
前回のLチカの続きに書くならば
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
で、設定ができます。
ちなみに、USARTで使うときは設定をこうしなさい(AFのPPや入力のフローティング)というのがリファレンスマニュアルに書いてあるはずなのですが・・・今回のリファレンスでは見つかりませんでした・・・。まぁ一般的なSTM32のチップなら大体決まった設定なのでそれでいきます。
これで、基本の設定が終わりました。
で、ここからはUSART特有の設定をします。
今までと同様に関数
USART_configuration();
をメイン関数に作って外に飛ばしましょう。
その際main.hにもextern宣言しておくことを忘れずに。
stm32l1xx_usart.hを見るとすぐに分かりますが
USARTを使うには
BaudRate
WordLength
StopBits
Parity
Mode
HardwareFlowControl
の6項目の設定があります。
GPIOの時と一緒で構造体に設定を先に書き込んでから
stm32l1xx_usart.cの208行目にある
USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
で一気に設定を流し込みます。
こんなかんじですね
void USART_configuration(void){
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_BaudRate = 19200;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
}
USARTのモードについてはいずれかだけ使うってことありえますが、両方使うときはOR演算をします。
最後のUSART_Cmd(USART2, ENABLE);はUSARTの電源スイッチをONにするコマンドです。
これで、USARTを使うことができるようになりました。
では通信をしてみましょう
ここでシリアル通信をPCとやるためにUSBのシリアルコンバータが必要になります。
例えばこういうやつですね
http://strawberry-linux.com/catalog/items?code=50030
PC側もソフトが必要です。
Win7には通信のアプリがないので(XPなら通信アプリであるハイパーターミナルがデフォで入ってましたが)
teratermとかRs232cToolとかが必要です。
でもって
シリアルコンバータのRxをdiscoveryのTx
シリアルコンバータのTxをdiscoveryのRx
シリアルコンバータのGNDをdiscoveryのGND
に接続します。
主体が表示されているものから見てとなっているのですが、
ようなお互い違うのを繋げば通信できます。
PA2にコンバータのRx
PA3にコンバータのTx
ですね。
差し込んだら通信ソフトを立ち上げて・・・
設定をします。
自分で書いた
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_BaudRate = 19200;
これらの設定ができると思いますのでPC側も合わせてください。
じゃないとうまく受信できません。
USARTでマイコンから「A」と送るには
stm32l1xx_usart.cの515行目に関数があります。
コレを使うので、main.cのメイン関数の中に
USART_SendData(USART2, 0x41);
と記述を入れましょう。
0x41はアスキーコードで「A」にあたります。
動かし方は前回を参考に。
これで通信ソフトに「A」というのが送られてきたかと思います。
次回は文字列の送信とPCからの受信とかの予定です。
PR
COMMENT
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
主にROとTERAとラノベと雑多なkomyuの日記帳です。
TERAキャラ紹介
シュクレール(バサ)
syuzo(エレ)
サケマス(アチャ)
その他サブ
ウリエルキゥィス(スレLv54)
Vermillion(サラLv56)
パズドラ
157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
12 | 2025/01 | 02 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
最新記事
(12/02)
(07/07)
(07/06)
(06/14)
(05/31)
ブログ内検索
最新コメント