ロボコン用 STM32F446RE 講習資料
注意事項
開発には System Workbench for STM32 (SW4STM32) を使用してください。
sken_libraryについて
本講習で使用するsken_library
は、以下の環境を想定しています。
- マイコン:STM32F446RE
- 開発環境:SW4STM32
※CAN通信にはLegacyモードを使用します。
環境構築
SW4STM32のインストール方法
- インストーラを起動し、指示に従って進めるだけでインストールできます。
- プロジェクト作成時にHALライブラリのダウンロードが発生するので、プロキシのないネット環境で行ってください。
- インストーラのダウンロードにはアカウント登録が必要なため、共有リンクを用意しました。
- 👉 SW4STM32 インストーラ共有リンク
導入方法
1. 文字コード設定(UTF-8に変更)
Window
→Preferences
→General
→Workspace
- 下部「Text file encoding」で「Other: UTF-8」を選択する。
2. プロジェクト作成
File
→New
→C++ Project
- Project nameを設定
- Ac6 STM32 MCU Project を選び「Next」
- そのまま「Next」
Series: STM32F4
、Board: NUCLEO-F446RE
を選び「Next」
(⚠️ ここで Finishを押さない)- Hardware Abstraction Layer (HAL) を選択して「Finish」
- ※動作確認済みHALバージョン: 1.24.0
3. C++対応設定
src
フォルダ内の main.c を main.cpp にリネームinc
フォルダを右クリック →Properties
→C/C++ Build
「Exclude resource from build」のチェックを外す- ビルド(トンカチマーク)を一度実行
- 書き込みは Run(再生マーク) で行えるようになります。
4. sken_libraryの導入
Window
→Show View
→Outline
を表示Outline
から以下ファイルを順に開く
stm32f4xx.h
→stm32f4xx_hal.h
→stm32f4xx_hal_conf.h
-
のように、HAL_CAN_MODULE_ENABLEDをコメントアウトし、HAL_CAN_LEGACY_MODULE_ENABLEDのコメントアウトを外す
// #define HAL_CAN_MODULE_ENABLED #define HAL_CAN_LEGACY_MODULE_ENABLED
-
プロジェクトの
inc
フォルダに sken_library をコピー - (※Gitのサブモジュール機能を使うとさらに便利)
main.cpp
の冒頭に以下を追加#include "sken_library/include.h"
main()
関数の最初に、次を追加sken_system.init();
デバッグツール紹介
STM32でのデバッグにはSTM Studioがおすすめです。
C++ 基礎まとめ
基本的にマイコンの開発はC++を使用する. 言語自体は自身で学習することが望ましいが,大まかな使い方を以下に紹介する
変数
データを保存するための箱のようなもの。
int a; // 整数型の変数aを宣言
a = 10; // 変数aに10を代入
double b = 3.14; // 小数型の変数bを宣言と同時に初期化
主な型
型 | 説明 | 例 |
---|---|---|
int |
整数 | 1, 100, -5 |
double |
小数 | 3.14, -0.5 |
char |
1文字 | 'A', 'b' |
bool |
真偽(true/false) | true, false |
代入
変数に値を入れること。
int x;
x = 5; // xに5を代入
演算子
計算に使う記号。
int a = 3 + 2; // 加算: a = 5
int b = 5 - 1; // 減算: b = 4
int c = 2 * 3; // 乗算: c = 6
int d = 10 / 2; // 除算: d = 5
int e = 7 % 3; // 剰余(余り): e = 1
比較
条件を比べる。
a == b // aとbが等しい
a != b // aとbが異なる
a > b // aがbより大きい
a < b // aがbより小さい
a >= b // aがb以上
a <= b // aがb以下
if文(条件分岐)
条件によって処理を変える。
int score = 80;
if (score >= 60) {
// 条件が真(true)のとき実行
cout << "合格" << endl;
} else {
// 条件が偽(false)のとき実行
cout << "不合格" << endl;
}
for文(回数の繰り返し)
一定回数だけ繰り返す。
for (int i = 0; i < 5; i++) {
cout << i << endl; // 0,1,2,3,4と出力
}
while文(条件が真の間繰り返す)
条件を満たす間、繰り返す。
int i = 0;
while (i < 5) {
cout << i << endl;
i++;
}
自作関数
自分で処理のまとまりを作る。
// 関数の宣言
int add(int a, int b) {
return a + b; // aとbを足して返す
}
int main() {
int result = add(3, 4); // add関数を呼び出す
cout << result << endl; // 7を出力
}
構造体(struct)
複数の変数をまとめたもの。
struct Point {
int x;
int y;
};
int main() {
Point p;
p.x = 3;
p.y = 5;
cout << p.x << ", " << p.y << endl; // 3, 5と出力
}
クラス(class)
データ(変数)と処理(関数)をまとめたもの。
class Motor {
public:
int speed;
void move() {
cout << "モーターが" << speed << "の速さで回転します。" << endl;
}
};
int main() {
Motor motor1;
motor1.speed = 100; // メンバ変数に値をセット
motor1.move(); // メンバ関数を呼び出す
}
Note
著者:Shion Noguchi