introduction
Nucleoボード用のソフトをCrossWorksで開発する時の手順を示す。
前提条件
開発環境 CrossWorks for ARM
マイコンボード Nucleo-F411RE(STM32F411RE)
オンボードICEをJLINK化している。
手順はここを参照
お題
<LED点滅>
制御対象 Nucleoボード上のLD2(マイコン A5ポート)
周期 1秒毎ON/OFF切替
時間計測 SysTickによる割り込み(1msec周期)
ソースコード他 成果物
1秒毎のチカチカを確認済み。
github
手順など
最初の画面からProjects区画より[Create a new project]をクリック
[An executable for~]を選択し、保存場所とプロジェクト名を設定
マイコンを選択。今回はSTM32F411RE。
Import all files and package filesのチェックをつけてNextをクリック。
SystickTimerを使うのに、system_stm32f4xx.cの中身をいじる必要があるので、ここはチェックを外してはいけない。
Nextをクリック
動かしてみる(デバッガ経由で)
Targets区画から[SEGGER J-Link]で右クリックして、[Connect~]を選択
問題なければConnected表示されるはず。
接続が終わればソースコード表示の上あたりにあるStartExecution(再生ボタン)を押せばデバッグが開始される。
デバッグの初期画面。main関数の入口でブレークポイントがかかって、停止した状態になる。
このあと、Continue Executionをクリック(再生ボタンと一時停止を組み合わせたっぽいヤツ)すると、コードが動き出す。
ブレークポイント仕掛けたり、変数読んだり、レジスタいじったり、一通りの機能は備わっている。
Nucleo−F411REにあわせて改変したところ。
<HSEクロックの初期値とSysTickの初期化>
NucleoボードはオンボードICEの部分から8MHzが供給される(HSEクロック)。
今回のサンプルコードではHSEクロックを使って、Systickを動かすため、設定変更が必要。
プロジェクトの初期値では25MHzになっているので8MHzにする。
system_stm32f411.cのHSE_VALUEを定義を8Mにする。
これをやらないとmain.cでクロックの初期化を実行したあとにシステムクロック更新の関数(SystemCoreClockUpdate())を実行する必要があるが、値がとんでもない値になる。
下記はデバッガでシステムクロック更新後のシステムクロックの値を取得している。
Watch1区画で、SystemCoreClockの値が80M(Hz)になっているはず。
なんで80MHzが期待値になっているかは、clock.cの中身を見よう。
SystemCoreClock = 8MHz(外部クロック)/ 8(PLLM) * 480(PLLN) / 6(PLLP) こうなっている。
SystemCoreClockに期待通りの値がセットされたのちに、SysTick_Config(SystemCoreClock/1000)を実行することで、SysTickが1msec周期のタイマーとして初期化される。
あとは割り込みハンドラ(SysTick_Handler())の関数を作ってあげればよい。
<LEDポートの位置>
マイコンのA5ポートがLEDのポート。
なので、led.cは下記のように設定する。
特に難しいことはない。
冒頭でstm32f4xx.hをインクルードしているが、これがペリフェラルを操作する関係のヘッダファイル。
SysTickって何
まず前提として、STM32F411というのは、ARM社が設計したCortex-M4と呼ばれるコアに、STMicro社が周辺回路を作った物である。
このCortex-M4コアに元々備わっているシステム用タイマーがSysTickと呼ばれる物である。
なので、Cortex-Mxというコアを搭載しているARM系マイコンと呼ばれている物なら大概SysTickはついているし、呼び出す関数名も同じである。
(もとはARM社の供給なのだからライブラリが同じ。)
本来はリアルタイムOSとかの時間制御に使うことが多い。
STM32F411の場合はTIM1,2,3,4,5,9,10,11と7個のタイマーがついている。これを使っても同じ事が出来る。
が、時間計測ごときにTIMを使うのはもったいない。TIMはPWMを作ったりとか、いろいろ用途が広いので、出来ればそっちに使ってあげるべきである。