STM32 HAL ST-LINKの接続からLチカ(GPIO-OUTPUT)
基本のLチカをしてデジタルアウトプットのやり方をHALで
STM32F103 C8 T6
STM32F103 C8 T6 という型番の後ろの方の意味:
C: 48pins、8: 64kbytes Flash、T: LQFP パッケージ、6: -40〜85°C
amaonの検索窓に、STM32F103と入れるとたくさん出てくる。国内からの発送で600~700円程度。
https://www.st.com/resource/en/datasheet/stm32f103c8.pdf
中華ST-LINK2
amazonの検索窓にST-LINK2と入れるとたくさん検索されてくる。国内で即納したければ1000円程度で、中華からの発送で日付がかかってもよいなら300円から。
接続方法
文字が読める状態で下の列、。4つ並びで偶数ピン②SWCLK④SWDIO⑥GND⑧3.3Vにジャンパーピンを接続
STM32F103の方は、SWOにST-LINK2の④SWIOを、SWCLKは同じ③SWCLK、それぞれ後3.3VとGNDを接続する。STM32のLチカ(GPIO)のプログラム
STM32Cubeのインストールがされているものとして・・・・(ココとかココ)
File-New-STM32Projectの順に選択
Selectorが立ち上がってくるので使っている開発ボードを指定する。中華STM32は当然載っていないので、MPUを直接指定する。使っているのはSTM32F103C8なので探し出して指定しNEXTを押す。Project名を設定するウインドウが開くので適当な名前をつける。ここではBLINK-TESTとした。その他はデフォルトのままFinishを押す。しばらくすると、MPUのピンのアサイン画面が現れる。ここではPC13を左クリックしてGPIO_Outputを選択、
続いて、右クリックして、Enter User Labelを選択してユーザでこのピンの名前を設定する。LEDを点灯させるので、LEDとする。
ここまでできたらCtrl+Sを押して保存する。
コードを自動生成するか?と聞かれるので、Yesを押す。しばらくするとmain.cが開いて、一部のコードが自動で生成されてくる。
/* Infinite loop */という記載の所を探して、 /* USER CODE BEGIN 3 */の後に
この時、場合によってはST-LINKとIDEのバージョンが対応していないとメッセージが出てくるかもしれない。その場合はYesを押すrとダイアログが開いてくる。
Refresh device listを押すと ST-LINKのIDと現在書き込まれているFirmwareのバージョンが表示される。Updateを押して更新する。更新後は一度USBポートからST-LINKを抜いて再度コンピューターに認識させる。
RUNのボタンを押し、問題なければ書き込みが終了する。ジャンパーピンを0側に戻し、。RESETボタンを押す。書き込みしたプログラムがマイコン上で動作する事が確認できる。
周期が1秒、つまり0.5秒間点灯して、0.5秒消灯する点滅が確認できる。
解説
STM32マイコンのピンは、同じピンでも用途に応じて使い方を定義できる。Arduino UNOなんかはアナログピンと、デジタルピンのアサインが決まっていてある程度は複数用途で使えるとしても決まっている。その点、STM32マイコンはある程度ユーザ側でもう少し自由度をもって決められる(むろん、ADCに使えるピン、SPI、I2Cに割り当て可能なピンというのは決まっている)
その中でもっともポピュラーなのがGPIO。General Purpose Input/Outputの略で日本語では汎用入出力の事。Arduino でいうdigitalWriteとdigitalReadをしたい時にはSTM32ではGPIOに割り当てる。
デジタルの状態のHIGH, LOWを指定する関するが、
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
第一引数のLED_GPIO_Port:
LED_GPIO_Portとしてあるが、STM32はピンが群になっていて、A、B、C・・と群をまず指定する。
第二引数は群の中で何番目か?を示していている。例えば、bule pillのオンボードのLEDは、PC13(C群の13番)につながっているので、第一引数は、本来”GPIOC”と記載する事になる。またLED_Pinは本来”GPIO_PIN_13”と記載する。
第三引数は、GPIO_PIN_SETは1の事で指定したピンをHIGH状態(3.3V出力)にし、GPIO_PIN_RESETで0、つまりLOW状態にする。とはいってもGPIO_PIN_SETは1と置き換えても動かない。
試しに、HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);を
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
と置き換えて焼き付けてみると同じ動作をする。
Coreフォルダの中のIncフォルダの中にmain.hが生成されている。これを開いてみる。
Device Configuration Toolを開いて、CategoriesのGPIOを選択し、PC13のGPIO modeを見るとPush Pullになっている。デフォルトではPush Pullになる。
そのため、PC13をHIGHにするとLEDが点灯するものだと思っていると逆の動作をする。
コメント
コメントを投稿