Skip to content

ロボコン用 STM32F446RE 講習資料

注意事項

開発には System Workbench for STM32 (SW4STM32) を使用してください。

sken_libraryについて

本講習で使用するsken_libraryは、以下の環境を想定しています。 - マイコン:STM32F446RE - 開発環境:SW4STM32
※CAN通信にはLegacyモードを使用します。


環境構築

SW4STM32のインストール方法

  1. インストーラを起動し、指示に従って進めるだけでインストールできます。
  2. プロジェクト作成時にHALライブラリのダウンロードが発生するので、プロキシのないネット環境で行ってください。
  3. インストーラのダウンロードにはアカウント登録が必要なため、共有リンクを用意しました。
  4. 👉 SW4STM32 インストーラ共有リンク

導入方法

1. 文字コード設定(UTF-8に変更)

  • WindowPreferencesGeneralWorkspace
  • 下部「Text file encoding」で「Other: UTF-8」を選択する。

2. プロジェクト作成

  1. FileNewC++ Project
  2. Project nameを設定
  3. Ac6 STM32 MCU Project を選び「Next」
  4. そのまま「Next」
  5. Series: STM32F4Board: NUCLEO-F446RE を選び「Next」
    (⚠️ ここで Finishを押さない
  6. Hardware Abstraction Layer (HAL) を選択して「Finish」
  7. ※動作確認済みHALバージョン: 1.24.0

3. C++対応設定

  1. srcフォルダ内の main.cmain.cpp にリネーム
  2. incフォルダを右クリック → PropertiesC/C++ Build
    「Exclude resource from build」のチェックを外す
  3. ビルド(トンカチマーク)を一度実行
  4. 書き込みは Run(再生マーク) で行えるようになります。

4. sken_libraryの導入

  1. WindowShow ViewOutline を表示
  2. Outlineから以下ファイルを順に開く
    stm32f4xx.hstm32f4xx_hal.hstm32f4xx_hal_conf.h
  3. // #define HAL_CAN_MODULE_ENABLED
    #define HAL_CAN_LEGACY_MODULE_ENABLED
    
    のように、HAL_CAN_MODULE_ENABLEDをコメントアウトし、HAL_CAN_LEGACY_MODULE_ENABLEDのコメントアウトを外す

  4. プロジェクトのincフォルダに sken_library をコピー

  5. (※Gitのサブモジュール機能を使うとさらに便利)
  6. main.cppの冒頭に以下を追加
    #include "sken_library/include.h"
    
  7. 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