0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CrossworksでNucleoボード開発

Last updated at Posted at 2020-04-09

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]をクリック
スクリーンショット 2020-04-09 21.31.09.png
[An executable for~]を選択し、保存場所とプロジェクト名を設定
スクリーンショット 2020-04-09 0.58.27.png
マイコンを選択。今回はSTM32F411RE。
スクリーンショット 2020-04-09 21.28.24.png
Import all files and package filesのチェックをつけてNextをクリック。
SystickTimerを使うのに、system_stm32f4xx.cの中身をいじる必要があるので、ここはチェックを外してはいけない。
スクリーンショット 2020-04-09 0.59.17.png
Nextをクリック
スクリーンショット 2020-04-09 21.29.31.png

Githubから落とした物を開くとこんな感じ。
スクリーンショット 2020-04-09 21.58.17.png

動かしてみる(デバッガ経由で)

Targets区画から[SEGGER J-Link]で右クリックして、[Connect~]を選択
スクリーンショット 2020-04-09 21.59.39.png
問題なければConnected表示されるはず。
スクリーンショット 2020-04-09 22.02.11.png
接続が終わればソースコード表示の上あたりにあるStartExecution(再生ボタン)を押せばデバッグが開始される。
スクリーンショット 2020-04-09 22.03.34.png
デバッグの初期画面。main関数の入口でブレークポイントがかかって、停止した状態になる。
このあと、Continue Executionをクリック(再生ボタンと一時停止を組み合わせたっぽいヤツ)すると、コードが動き出す。
ブレークポイント仕掛けたり、変数読んだり、レジスタいじったり、一通りの機能は備わっている。
スクリーンショット 2020-04-09 22.06.16.png

Nucleo−F411REにあわせて改変したところ。

<HSEクロックの初期値とSysTickの初期化>
NucleoボードはオンボードICEの部分から8MHzが供給される(HSEクロック)。
今回のサンプルコードではHSEクロックを使って、Systickを動かすため、設定変更が必要。
プロジェクトの初期値では25MHzになっているので8MHzにする。

system_stm32f411.cのHSE_VALUEを定義を8Mにする。
スクリーンショット 2020-04-09 22.14.30.png
これをやらないと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())の関数を作ってあげればよい。
スクリーンショット 2020-04-09 22.17.38.png

<LEDポートの位置>
マイコンのA5ポートがLEDのポート。
なので、led.cは下記のように設定する。
特に難しいことはない。
冒頭でstm32f4xx.hをインクルードしているが、これがペリフェラルを操作する関係のヘッダファイル。
スクリーンショット 2020-04-09 22.32.32.png

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を作ったりとか、いろいろ用途が広いので、出来ればそっちに使ってあげるべきである。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?