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]だと分かります。
PortAのベースアドレスと中身を調べる
STM32LのデータシートからPortAのベースアドレスが0x4002_0000と分かります。
PortAが割り当てられた領域のレジスタ割り当ては、以前STM32F7のときと変わらないと思ったのでそのときに判明したことを参考にしました(細かいことはソースコード参照)。
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; }
参考
- NucleoのUser Manual (pdf): http://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf
- STM32Lのデータシート (pdf): http://www.st.com/content/ccc/resource/technical/document/datasheet/66/71/4b/23/94/c3/42/c8/CD00277537.pdf/files/CD00277537.pdf/jcr:content/translations/en.CD00277537.pdf