読者です 読者をやめる 読者になる 読者になる

ヾノ*>ㅅ<)ノシ帳

技術ブログに見せかけて、ジャンル制限のないふりーだむなブログです。

STM32NucleoでLチカ(mbed/C++)

組み込み

時間がないので手短にまとめます。

必要なもの

  • STM32のNucleo(僕は、NUCLEO-L152REを使用)
  • USB Mini-B ケーブル
  • mbed(僕はARMmbed/mbed-osのmake.pyをビルドツールとして使用)

調査

NucleoのLD2(緑色のユーザー用LED)のポートを調べる

NucleoのUser ManualからPA5、つまりマイコンから見てPortA[5]だと分かります。

f:id:katc:20170115160519p:plain

PortAのベースアドレスと中身を調べる

STM32LのデータシートからPortAのベースアドレスが0x4002_0000と分かります。

f:id:katc:20170115161258p:plain

PortAが割り当てられた領域のレジスタ割り当ては、以前STM32F7のときと変わらないと思ったのでそのときに判明したことを参考にしました(細かいことはソースコード参照)。

katc.hateblo.jp

Lチカコード(main.cpp)

#include "mbed.h"

#define DURATION 0.15

#define PORT_A (0x40020000)
#define MODER (0x0)
#define ODR (0x14)
#define PORT_A_ODR ((volatile int*)(PORT_A + ODR))
#define PORT_A_MODER ((volatile int*)(PORT_A + MODER))


void ld2_on() {
    volatile int* cur = (volatile int *) (PORT_A + ODR);
    *PORT_A_ODR = *cur | 1 << 5;    
}

void ld2_off() {
    volatile int* cur = (volatile int *) (PORT_A + ODR);
    *PORT_A_ODR = *cur & ~(1 << 5);
}

// ↓やらなくても動く。この関数の処理は嘘なのでやってはいけない
void init_ld2() {
    // output mode 
    volatile int* cur = (volatile int *) (PORT_A + MODER);
    *PORT_A_MODER = *cur | 1 << (2 * 5); // PA5
    ld2_off();
}

int main() {
    for(int i = 0; i < 1000; i++) {
        ld2_on();        
        wait(DURATION);
        ld2_off();        
        wait(DURATION);
    }
    ld2_on();
    return 0;
}

参考