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を接続する。
黄色いジャンパーピン2つがそれぞれボード上のUSBポート側になっている事を確認してから、この状態でパソコンのUSBに接続すると、たいていの場合は、緑色のLEDが点滅する。




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 */の後に

      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
      HAL_Delay(500); 
      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
      HAL_Delay(500); 

に追記する。



ハンマーのマークを押して、ビルドする。何事なければコンパイルが無事終了する。


画像で見てBOOT0の印字のある方のジャンパーピンを1側に接続する。そしてその横のRESETボタンを押す。


書き込み
その状態で、RUNのボタンを押す。

確認画面が出てくるが、そのままOKを押し書き込みを行う。



この時、場合によっては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が生成されている。これを開いてみる。
/* Private defines -----------------------------------------------------------*/
#define LED_Pin GPIO_PIN_13
#define LED_GPIO_Port GPIOC
と定義がGUIで変更した内容が記述されている事が確認できる。
LEDなどピンをアサインする際に名前を付けておくと、他のボード(MPU)に移植する際にプログラム全体の名称変更をする必要がなく、アサインする時に変えるだけで済むメリットがある。

ちなみに・・・

Blue Pillの回路図を見てみると、PC13に接続されているLEDは、Vcc-LED-抵抗-PC13と接続されている。GND側にはつながっていない。そのため、PC13のピンがHIGH状態では、Vccと同電位になるので、LEDは点灯しない。PC13がGNDになると、電流が流れて点灯する。

Device Configuration Toolを開いて、CategoriesのGPIOを選択し、PC13のGPIO modeを見るとPush Pullになっている。デフォルトではPush Pullになる。
Push Pullとは、マイコンの内部で、出力ピンがHIGH側とLOW側にスイッチが実は二つあって、それらが入れ替わる動作をする。一方でOpen Source drainを選ぶとこれは、GNDと設置するか?しないか?を選択する動作をするようになる。
  そのため、PC13をHIGHにするとLEDが点灯するものだと思っていると逆の動作をする。

次に、HAL_Delay
役目としては、一定時間待つという命令になる。
STM32F103には、アドバンスコントロールタイマー(TIM1:PWM出力なんかをするタイマー)と、3つの汎用タイマー(TIM2,3,4)と2つのWatch docタイマー(定期的に発動することで、システムが機能し続けていることを確認させるためのタイマー)とSystickといって24ビットのダウンカウンターをもっている。
HAL_Delayはこの中で、Systickを使って時間をカウントして待機してくれます。

HAL_Delay(10);

とすると10msec待ってくれます。

      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
      HAL_Delay(500); 
      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
      HAL_Delay(500); 

の部分は、よってGPIOCの13ピンをPIN_SETでHIHGにして、500msec待ち、そして、GPIO_PIN_RESETとしてLOWの状態にして、その状態をHAL_Delay(500)継続してをwhileで永遠と続けるという記述になります。

あとピン状態を反転する命令というのもあります。

HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_13)

ピンステータスをtoggleする(反転)してくれます。

      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
      HAL_Delay(500); 
      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
      HAL_Delay(500); 
の4行を
 
    HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_13);
    HAL_Delay(250); 

と変更しても同じ動作になります。(250msecとか違う値にしておくと変更した事が確認できる)









コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest

HS101 STM32の自作お手軽オシロスコープ