SlideShare a Scribd company logo
1 of 128
Download to read offline
STマイクロエレクトロニクス
STM32マイコン初心者向け体験セミナー
Updated: 041018
目的 セミナー目的・概要、使用機材説明
ソフトウェア開発実習 共通部
実習1:I/O
実習2:UART
実習3:I2C&Timer
実習4:ADC
目次
内容
2
1.目的
セミナー目的 4
本セミナーの目的は、いままでSTM32マイコンを使用したことのないソ
フトウェアエンジニア向けに実施します。
STM32マイコンを実際に使用していただき、STM32マイコンへの理解
を深めていただくことが目的となります。
STM32マイコンを用いてマイコンが持っている各種ペリフェラルをそれ
ぞれ動作させてみます。
セミナー概要 5
本セミナーでは以下の内容を実施します。
 STM32評価ボードを用いたソフトウェア実装体験
 関連ツールの使い方
 STM32CubeMX
 EWARM
 ライブラリの使用方法
 STM32CubeL4
 ペリフェラル
 I/O
 UART
 I2C&Timer
 SPI
 ADC
使用機材説明 6
本セミナーで使用する機材/ツール類は以下となります。
 ハードウェア
 B-L475E-IOT01A1
https://www.st.com/content/st_com/en/products/evaluation-
tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-
tools/stm32-mcu-discovery-kits/b-l475e-iot01a.html
 可変抵抗ボード
 ソフトウェア
 STM32CubeMX
STM32用初期化コード生成ツール
 STM32CubeL4
STM32L4用ライブラリ
 EWARM
統合開発環境(IARシステムズ)
STM32L4 IoT kit ドキュメント 7
https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/b1/b8/7a/f2/
f7/8d/4b/6b/DM00347848/files/DM00347848.pdf/jcr:content/translations/en.DM00347848.pdf
使用機材説明 8
 STM32CubeMX
 STマイクロエレクトロニクス社のホームページから入手
https://www.stmcu.jp/design/sw_dev/pc_soft/52798/
 STM32CubeL4
 STマイクロエレクトロニクス社のホームページから入手
https://www.stmcu.jp/design/sw_dev/firmware/52726/
 これらのソフトウェアの入手には、ユーザ登録が必要です。
B-L475E-IOT01A1
CubeMX – Initialization for STM32L4 10
CubeMX – Initialization for STM32L4 11
CubeMX – Initialization for STM32L4 12
CubeMX – Initialization for STM32L4 13
CubeMX – Initialization for STM32L4 14
2.ソフトウェア開発実習
ソフトウェア開発実践 16
 ここから実際に実機を用いてソフトウェアを動作させてみます。
 システムでよく使用されるであろうペリフェラルを動作させます。
 動かしてみるのは、I/O、UART、I2C&Timer、SPI、ADCです。
 手順としては以下に沿って実施します。
 STM32CubeMXにて初期化コードを生成
 必要なコードをソースコードに追記
 EWARMでビルド
 実機にてデバッグと動作確認
 STM32CubeMXで生成したプロジェクトは最適化が「高」設定になっています。デバッ
グ時に注意してください。
 STM32CubeMXでは規則に従えば追記したユーザコードは保護されます
I/O実践
I/O実践 18
USERスイッチ
LEDs
• どのようなことを実践するか?
• 本項目では以下の機能を使用してI/Oの動作を確認します。
 GPIOを用いてSW入力判定(割込みを使用)
 GPIOでLEDの点灯制御
• 使用する機材は?
• B-L475E-IOT01A1を用います。
• ボード上に実装されている「USER」スイッチと「LD2」のLEDを使用します
I/O実践 19
以下のピン設定を行います。設定はマイコンイメージのピン部分をク
リックすることで設定可能です。
PC13:UserSwitch GPIO_EXTI13
PB14:LED_GREEN(LED2) GPIO_Output
設定されたピンは色が変わります。
I/O実践 20
ピン設定の詳細を設定します。「Configuration」タブを開きます。
I/O実践 21
「System」のGPIOボタンを押下します。「Pin Configuration」ダイア
ログが開きます。ここで各Pinの詳細設定を行います。
I/O実践 22
リストの各ピンを選択し詳細設定を行います。
PB14およびPC13の設定を以下のように設定します。
Highに設定 External Interrupt Mode with Falling edge
trigger detection に設定
I/O実践 23
次に割込みの設定を行います。
「System」のNVICボタンを押下します。「NVIC Configuration」ダイ
アログが開きます。ここで各割込みの詳細設定を行います。
I/O実践 24
割込み設定を行います。
リストから、「EXTI line
[15:10] interrupt」を選択し、
Enabledにチェックをつけま
す。
Preemption Priorityを1に設
定します。
これは、HALドライバ内の割
込みでSystickを呼び出してい
るため他の割り込みの優先度
を下げる設定が必要です。
I/O実践 25
ここまででSTM32CubeMX上での設定は
完了です。
プロジェクトを保存します。
ProjectメニューからSettingsを選択しま
す。
以下のように「Project Settings」ダイ
アログが開きます。
Note: STM32L4 HAL library が入っていない場合は、
STM32CubeMXからインターネット経由でダウンロードで
きます。
I/O実践 26
「Project」タブにてプロジェクトの設定を行います。設定が完了した
らOKボタンを押下してください。
プロジェクトの名称を入
力します。
プロジェクトの保存先を
入力します。
I/O実践 27
設定したコードを生成します。
「Project」メニューから「Generate Code」を選択します。
コード生成が完了すると以下のダイアログが開きます。
「Open Project」ボタンを押下することでEWARMが開きます。
I/O実践 28
EWARMが起動したら、ビルドが通ることを確認します。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
I/O実践 29
I/O実践で実装するプログラムは、Userスイッチの押下を割込みで監視
し、押下されたときにLEDの点灯状態を変更します。(トグル)
フローは以下となります。メイン関数の処理と割込み処理があります。
開始
初期化等
Pushed変数
に0代入
Pushed
==0?
GPIOトグル
スイッチ押下状態変数を0クリアします
スイッチ押下状態が変更されるまでループします
スイッチ押下されたらLEDのGPIOをトグルさせLED
の点灯状態を変更します。変更後、メインループを
継続します。
起動後、main関数の処理が実行されます。
【Main関数処理】
I/O実践 30
開始
対象?
Pushed
に1を代入
コールバックされた割込みが対象の
GPIOか判定します。
対象のGPIOの場合、スイッチ押下判定変数に1を
代入します。
割込みコールバック処理が開始されます
【割込み処理】
終了
I/O実践 31
ここから、I/Oを使用する場合のユーザ処理を追加していきます。
STM32CubeMXで生成したコードには、
/* USER CODE BEGIN XXX */ と /* USER CODE END XXX */と
の記載があり、このコメントの範囲内にユーザコードを追加していき
ます。
ここで追記したユーザーコードは、再度CubeMXにてコード生成した
場合でも保護されます。
今回追記する箇所は、3か所となります。
※配布されたファイル類のIO実践フォルダ内のmain.cに今回追加分のソースコードが格納
されています。こちらから追記部分をコピーください。
I/O実践 32
追記箇所①
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
変数を追記します。割込み入力の判定に使用する変数となります。
/* USER CODE BEGIN 0 */
__IO uint8_t Pushed;
/* USER CODE END 0 */
追記箇所②
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループ処理を追加します。スイッチ押下の割込みを待ち、スイッチ入
力時にGPIOをトグルします。
/* USER CODE BEGIN 3 */
Pushed = 0;
while (Pushed == 0)
{
;
}
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
}
/* USER CODE END 3 */
I/O実践 33
追記箇所③
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
割込みのコールバック関数を追記します。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_13)
{
Pushed = 1;
}
}
I/O実践 34
追記が終わりましたらビルドします。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
I/O実践 35
B-L475E-IOT01A1 とPCをUSBケーブルで接続します。USBケーブル
は、micro-USBタイプのケーブルを用います。
次に、ダウンロードを行います。
「プロジェクト(P)」メニューから「ダウンロードしてデバッグ
(D)」を選択し、ダウンロードを開始します。
I/O実践 36
ダウンロードが完了したらデバッグモードの表示に切り替わります。
F5キーを押下してプログラムを実行します。
もしくは、「デバッグ(D)」メニューから「実行(F5)」を選択でも実
行できます。
I/O実践 37
USERスイッチを押下するごとにLD2のLEDが点灯/消灯を繰り返します。
LED点灯LED消灯
Note: Also other LED are ON because in default configuration of B-L475E-IOT01A1
CubeMX project they are set as HIGH.
I/O実践 38
今回のコードでは、STM32CubeMXにて生成したHALドライバを使用
しています。
使用しているGPIOのHALドライバは以下です。
HAL_GPIO_TogglePin
GPIOの指定されたピンを呼出し毎に反転します。
void HAL_GPIO_TogglePin( GPIO_TypeDef* GPIOx, :GPIOポート
uint16_t GPIO_Pin) :GPIOピン番号
また、スイッチの割込みコールバック関数を設定しています。
void void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) :割込みコールバック
I/O実践 39
STM32CubeMXで生成したHALドライバは、
「¥Drivers¥STM32L4xx_HAL_Driver」フォルダに格納されています。
https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-
software/stm32-embedded-software/stm32cube-mcu-packages/stm32cubel4.html
HALドライバは、「¥Drivers¥STM32L4xx_HAL_Driver」フォルダに
格納されています。ドライバの使用方法に関しては、該当ソースコー
ドのヘッダ、または、以下のドキュメントに記載があります。
UM1884: Description of STM32L4/L4+ HAL and Low-layer drivers
UART実践
UART実践 41
• どのようなことを実践するか?
• 本項目ではUART通信の動作を確認します。
 PCから入力されたデータをループバックして送信します。
• 使用する機材は?
• B-L475E-IOT01A1を用います。
• 対向機はPCとします。
• ST-Linkの機能を用いて、UARTのTX/RXをターミナルソフトで
送受信します。
※PC側のターミナルソフトはTeraTermを使用します。
42UART実践
UART実践 43
ペリフェラルの設定を行います。左側のツリーから「USART1」をプル
ダウンし、Modeを「Asynchronous」に設定します。
• 設定すると、マイコンイメージの該当するピンの色が緑に変わります。
また、 PB14:LED_GREEN(LED2)と、PC13:USERSwitchも設定済
みとなります。
P.S. – The USART1 is connected to the STLINKV2 present on board, seen by the PC as a VCOM.
UART実践 44
今回はボード設定を行いましたので、LED2および、USERスイッチ、ク
ロックは設定済みとなります。
「Configuration」タブにて各ペリフェラルの設定を行います。
UART実践 45
まずは、「USART1」の設定を行います。「Connectivity」から
「USART1」ボタンを押下します。「USART1 Configuration」ダイア
ログが開きます。
UART実践 46
今回は設定変更は行いませんが、「USART1 Configuration」の
「Parameter Settings」タブでUARTの通信速度等の設定が可能です。
デフォルトの通信レー
トは115200Bits/sと
なっておりますので変
更される場合はこちら
で設定ください。
UART実践 47
「USART1 Configuration」の「NVIC Settings」タブを選択します。
「USART1 global interrupt」のEnabledにチェックをつけます。
その他の設定はデフォ
ルトのままで変更はあ
りません。
UART実践 48
次に割込みの設定を行います。「System」から「NVIC」ボタンを押下
して、「NVIC Configuration」ダイアログを開きます。
UART実践 49
「NVIC Configuration」ダイアログから割込みの設定を行います。
ここでは、USART1の割込みの
設定します。
(他の割込みは未使用)
「USART1 global interrupt」
にはすでにEnabledにチェック
が入っているので、
「Sub Priority」を1に設定し
ます。
Note: デフォルトでは「4 bits for pre-emption priority 0
bits for subpriority」なっていますが、
「 0 bits for pre-emption priority 4 bits for subpriority 」に
変更します。
UART実践 50
ここまででSTM32CubeMX上での設定は完了です。
プロジェクトを保存します。
ProjectメニューからSettingsを選択します。
以下のように「Project Settings」ダイアログが開きます。
UART実践 51
「Project」タブにてプロジェクトの設定を行います。
設定が完了したらOKボタンを押下してください。
プロジェクトの名称を入
力します。
プロジェクトの保存先を
入力します。
UART実践 52
設定したコードを生成します。
「Project」メニューから「Generate Code」を選択します。
コード生成が完了すると以下のダイアログが開きます。
「Open Project」ボタンを押下することでEWARMが開きます。
UART実践 53
EWARMでビルドできることを確認します。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
UART実践 54
UART実践で実装するプログラムは、PCとB-L475E-IOT01A1を接続し
てUART通信を確認します。
B-L475E-IOT01A1側は、UARTで受信したデータをそのまま送信する
ループバックプログラムとし、PC側はTeraTarm(ターミナルソフト)
を用いてB-L475E-IOT01A1へデータ送信し折り返しデータを受信しま
す。
次ページからプログラムフローを示します。
メイン関数の処理と、受信割込み処理、送信割込み処理があります。
UART実践 55
開始
初期化等
uart_status変数
に0代入
uart_st
atus ?
UART処理状態変数を0クリアします
UART受信処理を開始します
UART受信処理状態変数の値により、分岐します。
0:受信待ち。処理なし
1:受信完了。UART送信開始
2:送信中。処理なし
3:送信完了。初期状態へ戻る
起動後、main関数の処理が実行されます。
【Main関数処理】
UART受信開始
uart_status変数
に2代入
UART送信開始
uart_status =
0,2
uart_status = 1
uart_status = 3
UART実践 56
開始
対象?
uart_statusに1を
代入
コールバックされた割込みが対象の
UARTチャネルか判定します。
対象のUART受信の場合、UART受信状態変数を1に
更新します。
受信が完了したことを示します。
割込みコールバック処理が開始されます
【受信割込み処理】
終了
UART実践 57
開始
対象?
uart_statusに3を
代入
コールバックされた割込みが対象の
UARTチャネルか判定します。
対象のUART送信の場合、UART受信状態変数を3に
更新します。
送信が完了したことを示します。
割込みコールバック処理が開始されます
【送信割込み処理】
終了
UART実践 58
ここから、UARTを使用する場合のユーザ処理を追加していきます。
STM32CubeMXで生成したコードには、
/* USER CODE BEGIN XXX */ と /* USER CODE END XXX */と
の記載があり、このコメントの範囲内にユーザコードを追加していき
ます。
ここで追記したユーザーコードは、再度CubeMXにてコード生成した
場合でも保護されます。
今回追記する箇所は、3か所となります。
※配布されたファイル類のUART実践フォルダ内のmain.cに今回追加分のソースコードが
格納されています。こちらから追記部分をコピーください。
UART実践 59
追記箇所①
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
変数を追記します。
送受信状態フラグと送受信のバッファを定義します。
/* USER CODE BEGIN 0 */
uint8_t uart_status;
uint8_t uartbuff[8];
/* USER CODE END 0 */
UART実践 60
追記箇所②
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループ処理を追加します。
/* USER CODE BEGIN 3 */
uart_status = 0;
memset( uartbuff, 0x00, sizeof(uartbuff) );
if( HAL_UART_Receive_IT( &huart1, uartbuff, 1 ) == HAL_OK ) {
/* wait */
while( uart_status != 3 ) {
switch( uart_status ) {
case 0:break;/* recive complete wait */
case 1:
/* recive complete.*/
uart_status = 2;
HAL_UART_Transmit_IT( &huart1, uartbuff, strlen(uartbuff) );
break;
case 2:break;/* transmit complete wait */
case 3:break;/* end */
}
}
}
}
/* USER CODE END 3 */
UART実践 61
追記箇所③
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
UARTの受信割込みと送信完了割込みのコールバック関数を追記します。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if( &huart1 == huart )
{
uart_status = 1;
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if( &huart1 == huart )
{
uart_status = 3;
}
}
UART実践 62
追記が終わりましたらビルドします。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
UART実践 63
ビルドが完了しましたら、 B-L475E-IOT01A1 とPCをUSBケーブルで
接続します。USBケーブルは、micro-Bタイプのケーブルを用います。
UART実践 64
次にデバッガの接続設定を確認します。
「プロジェクト(P)」メニューから「オプション(O)」を選択し、
オプションダイアログを開きます。
「カテゴリ」:デバッ
ガを選択し、
設定タブの「ドライバ
(D)」に「ST-
LINK」が設定されてる
ことを確認します。
(設定されていない場
合は、選択し設定を
行ってください。
UART実践 65
次に、ダウンロードを行います。
「プロジェクト(P)」メニューから「ダウンロードしてデバッグ(D)」
を選択し、ダウンロードを開始します。
UART実践 66
ダウンロードが完了したらデバッグモードの表示に切り替わります。
F5キーを押下してプログラムを実行します。
もしくは、「デバッグ(D)」メニューから「実行(F5)」を選択でも実
行できます。
UART実践 67
ここからプログラムの動作確認を行います。
B-L475E-IOT01A1では先ほどプログラムを動作させましたので、PC側
の準備を行います。
TeraTermを起動して以下の設定を行います。
新しい接続を選択して、以下を設定します。
シリアルを選択、ポートを
「STMicroelectronics STLink Virtual COM
Port」を選択します。
シリアルポート設定を選択し、「ボー・
レート」を「115200」に設定します。
UART実践 68
設定が終わりましたらTeraTerm上で文字を打ち込みます。ただしく動
作していれば入力文字がループバックされ表示されます。
入力文字が2重に表示される場合、TeraTermの端末設定でローカルエコー設定がなされていな
いことを確認してください
UART実践 69
今回のコードでは、STM32CubeMXにて生成したHALドライバを使用
しています。
使用しているUSARTのHALドライバは以下です。
HAL_UART_Transmit_IT
割込みを使用してUART送信を行います。
HAL_StatusTypeDef HAL_UART_Transmit_IT(
UART_HandleTypeDef *huart, :UARTハンドル
uint8_t *pData, :送信データバッファ
uint16_t Size) :送信サイズ
HAL_UART_Receive_IT
割込みを使用してUART受信を行います。
HAL_StatusTypeDef HAL_UART_Receive_IT(
UART_HandleTypeDef *huart, :UARTハンドル
uint8_t *pData, :受信データバッファ
uint16_t Size) :受信データサイズ
非同期で動作しますので各APIにコールバック関数が設定されます。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart):受信コールバック
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart):送信コールバック
UART実践 70
HALドライバは、
「¥Drivers¥STM32FLxx_HAL_Driver」フォルダに格納されています。
https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-
software/stm32-embedded-software/stm32cube-mcu-packages/stm32cubel4.html
UARTのHALドライバは、「stm32l4xx_hal_uart.c」。
ドライバの使用方法に関しては、該当ソースコードのヘッダ、
または、以下のドキュメントに記載があります。
I2C&Timer実践
I2C&Timer実践 72
• どのようなことを実践するか?
• 本項目では以下の機能を使用してセンサからデータを取得します。
 STM32のI2Cバス
 STM32のタイマ
• 使用する機材は?
• B-L475E-IOT01A1で、I2Cセンサデバイスが搭載されている拡
張ボードを接続し通信を行います。
• このうち温湿度センサの「HTS221」を動作させ、温度情報を取
得します。
B-L475E-IOT01A1 上のセンサはSTM32
とI2Cで接続されています。
I2C&Timer実践 73
STM32CubeMXを起動し、NewProjectをクリックします。
I2C&Timer実践 74
 接続
 B-L475E-IOT01A1
 I2C2 SCL → PB10
 I2C2 SDA → PB11
 HTS221_DRDY → (EXTI15) PD15
 PB14:LED_GREEN(LED2) GPIO_Output
(今回のサンプルでは使用しません)
I2C&Timer実践 75
ピンの設定後、ペリフェラルの使用設定を行います。左側のツリーから
I2C1 を展開し、I2Cに設定します。
設定するとピンの色が緑に変わります。
I2C&Timer実践 76
次にタイマの設定を行います。タイマは、TIM2を使用します。
ツリーからTIM2をプルダウンして、「Clock Source」をInternal
Clockにします。
I2C&Timer実践 77
次にクロックの設定を行います。
「Clock Configuration」のタブを開きます。
I2C&Timer実践 78
ピン設定の詳細を設定します。「Configuration」タブを開きます。
I2C&Timer実践 79
「System」のGPIOボタンを押下します。「Pin Configuration」ダイア
ログが開きます。ここで各Pinの詳細設定を行います。
80
I2C&Timer実践 81
リストの各ピンを選択し詳細設定を行います。
ここでは、PB14の設定を以下のように設定します。
※I2C、PB10の設定は行いません
Highに設定
I2C&Timer実践 82
次にタイマの設定を行います。
ControlのTIM2ボタンを押下します。「TIM2 Configuration」ダイアロ
グが開きます。ここでタイマの設定を行います。
I2C&Timer実践 83
TIM ConfigurationダイアログのNVIC Settingタブが開きます。
ここでタイマ割込みの設定を行います。TIM2 global interruptの
Enabledにチェックをつけます。
I2C&Timer実践 84
次にTIM ConfigurationダイアログのParameter Settingsタブを開きます。
ここでタイマのインターバル時間の設定を実施します。
Prescaler/CounterM
ode/Internal Clock
Divisionの設定を行い
ます。
クロック元は、
Internal Clockを選択
しているので、
80MHzが入力クロッ
クとなります。
1秒間に1回の割込
みを発生させたいの
で、
次ページの設定を行
います。
I2C&Timer実践 85
TIMに設定する値の計算は、以下となります。
・クロック元はInternalClockを選択しているので84MHzが入力クロック。
・1秒間に1回の割込みを発生させる場合とします。
・TIM2の設定値を下記で入力します。
Internal Clock Division : No Division
Prescaler :40000-1=39999
Counter Period :2000-1=1999
80MHz/40000 = 2KHz → Prescalerで1/40000
2KHz/2000 = 1Hz → CunterPeriodで1/2000
結果、1Hz周期でタイマ割込みが発生します。
I2C&Timer実践 86
ここまででSTM32CubeMX上での設定は完了です。
プロジェクトを保存します。
ProjectメニューからSettingsを選択します。
以下のように「Project Settings」ダイアログが開きます。
I2C&Timer実践 87
「Project」タブにてプロジェクトの設定を行います。設定が完了した
らOKボタンを押下してください。
プロジェクトの名称を入
力します。
プロジェクトの保存先を
入力します。
I2C&Timer実践 88
設定したコードを生成します。
「Project」メニューから「Generate Code」を選択します。
コード生成が完了すると以下のダイアログが開きます。
「Open Project」ボタンを押下することでEWARMが開きます。
I2C&Timer実践 89
EWARMでビルドできることを確認します。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
I2C&Timer実践 90
I2C&Timer実践で実装するプログラムは、B-L475E-IOT01A1
に拡張基板を接続しそこに搭載されている温度センサーからI2Cバスを
用いて温度データを取得します。またタイマをもちいて1秒周期で温度
データを取得するように実装します。
次ページからプログラムフローを示します。
メイン関数の処理と、タイマ割込み処理があります。
I2C&Timer実践 91
開始
タイマ初期化等
タイマ変数=0
タイマ変
数=1?
タイマ等を初期化します。
タイマアップ判定変数を0クリアします。
起動後、main関数の処理が実行されます。
【Main関数処理】
LEDトグル
センサデータ取得
タイマアップするまで待機します。
LED点灯状態を反転します。
センサデータを取得します。
I2C&Timer実践 92
開始
対象?
Tim2Expireに1を
代入
コールバックされた割込みが対象のタイ
マチャネルか判定します。
対象のタイマの場合、タイマアップ変数を1に更新
します。
タイマアップしたことを示します。
割込みコールバック処理が開始されます
【タイマ割込み処理】
終了
I2C&Timer実践 93
ここから、I2Cとタイマを使用してセンサの値を取得するユーザ処理を
追加していきます。
STM32CubeMXで生成したコードには、
/* USER CODE BEGIN XXX */ と /* USER CODE END XXX */と
の記載があり、このコメントの範囲内にユーザコードを追加していき
ます。
ここで追記したユーザーコードは、再度CubeMXにてコード生成した
場合でも保護されます。
今回追記する箇所は、5か所となります。
※配布されたファイル類のI2CTimer実践フォルダ内のmain.cに今回追加分のソースコー
ドが格納されています。こちらから追記部分をコピーください。
I2C&Timer実践 94
追記箇所①
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
変数を追記します。
/* USER CODE BEGIN 0 */
extern void TestHTS221( I2C_HandleTypeDef *hi2c, int16_t *Temperature );
__IO uint8_t Tim2Expire;
__IO int16_t Temperature;
/* USER CODE END 0 */
追記箇所②
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
タイマの起動を行います。
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */
I2C&Timer実践 95
追記箇所③
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループ処理を追加します。1秒に1回、温度情報を取得します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Tim2Expire= 0;
while (Tim2Expire== 0)
{
;
}
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
TestHTS221(&hi2c2, (int16_t *)&Temperature);
}
/* USER CODE END 3 */
I2C&Timer実践 96
追記箇所④
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
割込みのコールバック関数を追記します。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim2.Instance)
{
Tim2Expire = 1;
}
}
I2C&Timer実践 97
ファイル追加
温度センサとの疎通確認と、温度情報の取得と演算をする関数の記載されているファイルを
追加します。
関数詳細は、配布されたUSBメモリのCソースを確認ください。
温度データ取得は引数の変数に温度情報を格納するようになっております。
I2C&Timer実践 98
追記が終わりましたらビルドします。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
I2C&Timer実践 99
ビルドが完了しましたら、 B-L475E-IOT01A1 とPCをUSBケーブルで
接続します。USBケーブルは、micro-Bタイプのケーブルを用います。
I2C&Timer実践 100
次に、ダウンロードを行います。
「プロジェクト(P)」メニューから「ダウンロードしてデバッグ(D)」
を選択し、ダウンロードを開始します。
I2C&Timer実践 101
ダウンロードが完了したらデバッグモードの表示に切り替わります。
I2C&Timer実践 102
温度保存用変数の変化をライブウォッチにて参照できるようにします。
ライブウォッチ機能はデバッガにて実行中に一定周期で変数の内容を
参照できる機能となります。
「表示(V)」メニューから「ライブウォッチ
(V)」を選択しライブウォッチウィンドウを
開きます。
ライブウォッチウィンドウの式のリストをク
リックし、ウォッチする変数名を入力します。
ここでは、 「Temperature」と入力してく
ださい。
また、参照したい変数を右クリックしていた
だき、「ウォッチへ追加(L)」を選択する
ことでも登録できます。
I2C&Timer実践 103
F5キーを押下してプログラムを実行します。
もしくは、「デバッグ(D)」メニューから「実行(F5)」を選択でも実
行できます。
LD2のLEDが点滅します。
点滅毎に温度センサから温度を取得してます。
I2C&Timer実践 104
ライブウォッチに追加した「Temperature」の値が温度センサから取
得した温度となります。変化した場合には文字が赤字に変化します。
この温度はセンサからの直値ではなく、HTS221_Get_Temperature
関数にて温度へ変換した値となります。(温度×10℃)
 、 B-L475E-IOT01A1ボードのU6のICを触れることで体温により温
度値が上昇しますのでお試しください。
I2C&Timer実践 105
今回のコードでは、STM32CubeMXにて生成したコードとHALドライ
バを使用しています。
使用しているI2CのHALドライバは以下です。
HAL_I2C_Mem_Read
I2Cデバイスからアドレス指定してデータを読み込みます。
HAL_I2C_Mem_Write
I2Cデバイスへアドレス指定でデータを書き込みます。
HAL_StatusTypeDef HAL_I2C_Mem_Read(
I2C_HandleTypeDef *hi2c : I2Cハンドル
uint16_t DevAddress : デバイスアドレス
uint16_t MemAddress : レジスタアドレス
uint16_t MemAddSize : レジスタアドレスサイズ
uint8_t *pData : データバッファ
uint16_t Size : 読込サイズ
uint32_t Timeout) : タイムアウト値
HAL_StatusTypeDef HAL_I2C_Mem_Write(
I2C_HandleTypeDef *hi2c, :I2Cハンドル
uint16_t DevAddress, :デバイスアドレス
uint16_t MemAddress, :レジスタアドレス
uint16_t MemAddSize, :レジスタアドレスサイズ
uint8_t *pData, :データバッファ
uint16_t Size, :書込みデータサイズ
uint32_t Timeout); :タイムアウト値
I2C&Timer実践 106
HALドライバは、
「¥Drivers¥STM32FLxx_HAL_Driver」フォルダに格納されています。
I2CのHALドライバは、「stm32l4xx_hal_i2c.c」。
ドライバの使用方法に関しては、該当ソースコードのヘッダ、
または、以下のドキュメントに記載があります。
UM1884: Description of STM32L4/L4+ HAL and Low-layer drivers
ADC実践
ADC実践 108
• どのようなことを実践するか?
• 本項目ではA/Dコンバータ動作を確認します。
 外部に可変抵抗を取り付けた基板と接続し抵抗値の可変状態
を参照します。
• 使用する機材は?
• B-L475E-IOT01A1を用います。
• 可変抵抗を取り付けた基板を使用します。
ADC実践 109
 接続
 B-L475E-IOT01A1と可変抵抗ボードとの接続
 B-L475E-IOT01A1側
 CN4コネクタ 1ピン(PC5)
 CN2コネクタ 4ピン(+3V3)、6ピン(GND)
 図のようにつなげます
ADC実践 110
以下のピン設定を行います。設定はマイコンイメージのピン部分をク
リックすることで設定可能です。
PC5: ADC1_IN14
設定されたピンは色が変わります。
PC5:ADC1_IN14
ADC実践 111
ADC1 IN14 を IN14 Single-endedに変更します。
ADC実践 112
ここまででSTM32CubeMX上での設定は完了です。
プロジェクトを保存します。
ProjectメニューからSettingsを選択します。
以下のように「Project Settings」ダイアログが開きます。
ADC実践 113
「Project」タブにてプロジェクトの設定を行います。設定が完了した
らOKボタンを押下してください。
プロジェクトの名称を入力
します。
プロジェクトの保存先を入
力します。
ADC実践 114
設定したコードを生成します。
「Project」メニューから「Generate Code」を選択します。
コード生成が完了すると以下のダイアログが開きます。
「Open Project」ボタンを押下することでEWARMが開きます。
ADC実践 115
EWARM上でビルドができることを確認します。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
ADC実践 116
ADC実践で実装するプログラムは、 B-L475E-IOT01A1に接続した可変
抵抗ボードの抵抗値を周期的に読込み変数に格納します。
次ページよりプログラムフローを示します。
メイン関数の処理のみでアナログ値を取得します。
ADC実践 117
開始
初期化等
ADC開始
変換成
功?
ADC等を初期化します。
ADCを開始します
起動後、main関数の処理が実行されます。
【Main関数処理】
変換成功したらアナログ値を取得します。
ADC変換 アナログ値を変換します
アナログ値取得
ADC実践 118
ここから、ADCを使用して可変抵抗のアナログ値を取得する処理を追
加していきます。
STM32CubeMXで生成したコードには、
/* USER CODE BEGIN XXX */ と /* USER CODE END XXX */と
の記載があり、このコメントの範囲内にユーザコードを追加していき
ます。
ここで追記したユーザーコードは、再度CubeMXにてコード生成した
場合でも保護されます。
今回追記する箇所は、2か所となります。
※配布されたファイル類のADC実践フォルダ内のmain.cに今回追加分のソースコードが格
納されています。こちらから追記部分をコピーください。
ADC実践 119
追記箇所①
/* USER CODE BEGIN PV */
/* USER CODE END PV */
A/D変換値を格納する変数を定義します。
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint32_t analogValue;
/* USER CODE END PV */
ADC実践 120
追記箇所②
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループにAD取得処理を追加します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
if( HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK )
{
analogValue = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
}
/* USER CODE END 3 */
ADC実践 121
追記が終わりましたらビルドします。
「プロジェクト(P)」メニューから「すべてを再ビルド(B)」を実
行します。
ADC実践 122
ビルドが完了しましたら、 NUCLEO-F401RE とPCをUSBケーブルで
接続します。USBケーブルは、mini-Bタイプのケーブルを用います。
ADC実践 123
次に、ダウンロードを行います。
「プロジェクト(P)」メニューから「ダウンロードしてデバッグ(D)」
を選択し、ダウンロードを開始します。
ADC実践 124
ダウンロードが完了したらデバッグモードの表示に切り替わります。
ADC実践 125
アナログ値保存変数の変化をライブウォッチにて参照できるようにし
ます。ライブウォッチ機能はデバッガにて実行中に定周期で変数の内
容を参照できる機能となります。
「表示(V)」メニューから「ライブ
ウォッチ(V)」を選択しライブウォッチ
ウィンドウを開きます。
ライブウォッチウィンドウの式のリスト
をクリックし、ウォッチする変数名を入
力します。
ここでは、 「 analogValue 」と入力し
てください。
ADC実践 126
ライブウォッチへの変数登録ができたらF5キーなどで実行します。
実行中に、可変抵抗を回すことでライブウォッチに登録した変数の値
が変化することを確認できます。
ADC実践 127
今回のコードでは、STM32CubeMXにて生成したコードとHALドライ
バを使用しています。使用しているADCのHALドライバは以下です。
(以下の4つのAPIが1サイクルの取得となります。)
HAL_ADC_Start
ADCの変換を開始します。
HAL_StatusTypeDef HAL_ADC_Start( ADC_HandleTypeDef* hadc ) :ADCハンドル
HAL_ADC_PollForConversion
変換完了待ち。
HAL_StatusTypeDef HAL_ADC_PollForConversion(
ADC_HandleTypeDef* hadc, :ADCハンドル
uint32_t Timeout) :待ちタイムアウト
HAL_ADC_GetValue
ADC変換データを取得します。
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc) :ADCハンドル
:リターン値がA/D値
HAL_ADC_Stop
ADCの変換を停止します。
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc) :ADCハンドル
ADC実践 128
HALドライバは、
「¥Drivers¥STM32L4xx_HAL_Driver」フォルダに格納されています。
ADCのHALドライバは、「stm32l4xx_hal_adc.c」。
ドライバの使用方法に関しては、該当ソースコードのヘッダ、
または、以下のドキュメントに記載があります。
UM1884: Description of STM32L4/L4+ HAL and Low-layer drivers

More Related Content

Similar to Miniseminar stm32 l4-iot-kit-updated-101018

NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)
NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)
NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)Takuya Azumi
 
ロボットシステム学2015第3回
ロボットシステム学2015第3回ロボットシステム学2015第3回
ロボットシステム学2015第3回Ryuichi Ueda
 
20130329 rtm2
20130329 rtm220130329 rtm2
20130329 rtm2openrtm
 
131106 01 i-rex2013
131106 01 i-rex2013131106 01 i-rex2013
131106 01 i-rex2013openrtm
 
東京工業大学「ロボット技術・ロボットミドルウェア」
東京工業大学「ロボット技術・ロボットミドルウェア」東京工業大学「ロボット技術・ロボットミドルウェア」
東京工業大学「ロボット技術・ロボットミドルウェア」NoriakiAndo
 
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015CODE BLUE
 
AWS IoT EduKit ワークショップのご紹介
AWS IoT EduKit ワークショップのご紹介AWS IoT EduKit ワークショップのご紹介
AWS IoT EduKit ワークショップのご紹介Yukinobu Mine
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター) プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)Ryota Nakamura
 
1.コース概要
1.コース概要1.コース概要
1.コース概要openrtm
 
20171206 Sony Neural Network Console 活用テクニック
20171206 Sony Neural Network Console 活用テクニック20171206 Sony Neural Network Console 活用テクニック
20171206 Sony Neural Network Console 活用テクニックSony Network Communications Inc.
 
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜Yusuke Naka
 
コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料futada
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会Hitoshi Sato
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアプログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアRyota Nakamura
 
ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414
ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414
ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414Interop Tokyo ShowNet NOC Team
 
iREX2015 RTM講習会
iREX2015 RTM講習会iREX2015 RTM講習会
iREX2015 RTM講習会openrtm
 
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアルCRI Japan, Inc.
 

Similar to Miniseminar stm32 l4-iot-kit-updated-101018 (20)

NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)
NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)
NXT走行体サンプルプログラム(ETロボコン向けTOPPERS活用セミナー3)
 
ロボットシステム学2015第3回
ロボットシステム学2015第3回ロボットシステム学2015第3回
ロボットシステム学2015第3回
 
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
 
20130329 rtm2
20130329 rtm220130329 rtm2
20130329 rtm2
 
131106 01 i-rex2013
131106 01 i-rex2013131106 01 i-rex2013
131106 01 i-rex2013
 
godo m
godo mgodo m
godo m
 
東京工業大学「ロボット技術・ロボットミドルウェア」
東京工業大学「ロボット技術・ロボットミドルウェア」東京工業大学「ロボット技術・ロボットミドルウェア」
東京工業大学「ロボット技術・ロボットミドルウェア」
 
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
ワイヤレス技術をアタックで検証 by 堀合啓一 - CODE BLUE 2015
 
AWS IoT EduKit ワークショップのご紹介
AWS IoT EduKit ワークショップのご紹介AWS IoT EduKit ワークショップのご紹介
AWS IoT EduKit ワークショップのご紹介
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター) プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 
1.コース概要
1.コース概要1.コース概要
1.コース概要
 
KOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WSKOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WS
 
20171206 Sony Neural Network Console 活用テクニック
20171206 Sony Neural Network Console 活用テクニック20171206 Sony Neural Network Console 活用テクニック
20171206 Sony Neural Network Console 活用テクニック
 
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
 
コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料コンピュータの構成と設計 第3版 第1章 勉強会資料
コンピュータの構成と設計 第3版 第1章 勉強会資料
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアプログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
 
ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414
ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414
ゼロトラストモデルによる次世代セキュリティアーキテクチャ_ShowNet2021 studio 20210414
 
iREX2015 RTM講習会
iREX2015 RTM講習会iREX2015 RTM講習会
iREX2015 RTM講習会
 
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
汎用LoRaWANセンサノード LSN50 -V2日本語マニュアル
 

Miniseminar stm32 l4-iot-kit-updated-101018