前回のSTM32G031J6M6マイコンと一緒に
32ビットマイコンが今なら95円。
ということで STM32マイコン STM32L010F4P6 を買ってみた。
これで ストロベリーリナックス I2C低電圧キャラクタ液晶モジュール(16x2行) を動かしてみる。
ピンヘッダをつける
細ピンヘッダとDIP変換基板をはんだ付けする。
データシートを確認する
この辺りは前回と同じなので省略。
STM32とLCDを接続
STM32L010F4P6の
- pin 1 (BOOT0) — GND
- pin 4 (NRST) を I2CLCD のリセットピン(#1)と接続
- pin 5 (VDDA) — VDD(3V3)
- pin 10 (PB9) — 赤色LED(Vf=2V) — 抵抗R(3k) — VDD(3V3)
- pin 15 (VSS) — GND
- pin 16 (VDD) — VDD(3V3)
- pin 17 (I2C1_SDA) を I2CLCD のSDAピン(#3)と接続
- pin 18 (I2C1_SCL) を I2CLCD のSCLピン(#2)と接続
pin 4 (NRST) は GNDとの間にリセット用タクトスイッチを入れて, 抵抗R(3.9k)でプルアップしておく。
pin 17, 18 (SCL, SDA) は抵抗R(3k)でプルアップしておく。
抵抗値に深い意味はない(そこにあったので)。
I2C低電圧キャラクタ液晶モジュール(16x2行)の
- pin 1 (~RST) — STM32L010F4P6 pin#4
- pin 2 (SCL) — STM32L010F4P6 pin#18
- pin 3 (SDA) — STM32L010F4P6 pin#17
- pin 4 (VSS) — GND
- pin 5 (VDD) — VDD(3V3)
ブレッドボードで配線する
ニッケル水素電池(1.2V)を4直列から3端子レギュレータNJU7223F33で3.3V電源を作る。
LCDの下はこうで
これでOK
まだ何も起きない。(あたりまえ)
STM32マイコンにプログラムを書き込まないと。
STM32CubeIDEでプロジェクトを新規作成
File -> New でSTM32 プロジェクトを選択して,
MCU: STM32L010F4を選んで新規作成する。
クロックはHSI RC発振 (16MHz)を4分周して生成した4MHzをSYSCLKにしておきます。
- PA4をGPIO_Output
- I2C1を400kHzで駆動(もちろん100kHzでもいい)
この設定でCubeIDEに生成してもらったmain.cの USER CODE BEGIN ~ END の間をいじる。(それ以外に書いたものは消されるよ)
このままでは前回と同じになるのでC++プロジェクトにします。
なんと, C++14が使えるのを発見したので。
Core/Src/main.c
main.cppがあってもCubeIDEのコード生成が無視するので, エントリポイントはC言語にしておく。
|
|
Core/Src/Application.cpp
C++言語側のエントリポイント。
.cファイルはCコンパイラがコンパイルして作るオブジェクトコード(.o)で
.cppファイルはC++コンパイラがコンパイルして作るオブジェクトコード(.o)で
Cリンケージがどうのこうのとかのリンクエラーがでるのでこのファイルを間に挟むとする。
他にいい方法がわからない。
|
|
Core/Inc/ST7032iLcd.hpp
前回のCソースファイルをC++にしてみた。
|
|
Core/Src/ST7032iLcd.cpp
現代のプログラムはコード効率の悪さを気にせずにutf8を使うもんだろ。
ということでutf-8 -> shift-jis半角カタカナ変換を入れてみた。
utf-8の3バイトエンコード部分
https://orange-factory.com/sample/utf8/code3/ef.html#HalfwidthandFullwidthForms
に入っている半角カナをST7032の半角カナにマッピングする。
これは元々HD44780に入っていた半角カナらしいね。
具体的にU+FF61~U+FF9Fを0b10100001~0b11011111にマッピングする。
ツライ。
|
|
プロジェクトのビルド
Ctrl + B でビルド。
|
|
あああ。真っ赤じゃないですか。
このプログラムはSTM32L010F4P6に搭載されている RAM 2キロバイトのうち 1.77キロバイトを,
さらに FLASHメモリ 16キロバイトのうち 15.13キロバイトを使う。
これだけでぱっつんぱっつんになってしまった。
やっぱりC++言語はフットプリントが増えるな。
でも今回はこれしかしないので問題ない。
Nucleoボード付属のST-Link/V2.1でプログラミング
NucleoボードについてるST-Link/V2.1を使います。
こちらはSTM32L010F4P6のピン
NucleoボードのCN2ジャンパーを外して
STM32L010F4P6の
- pin 4 (NRST) を ST-Link のRSTピン(#5)と接続
- pin 15 (VSS) を ST-Link のGNDピン(#3)と接続
- pin 19 (SWDIO) を ST-Link のSWDIOピン(#4)と接続
- pin 20 (SWCLK) を ST-Link のSWCLKピン(#2)と接続
実行にはプログラマーは不要。
GitHubリポジトリ
https://github.com/ak1211/hello_stm32l0/tree/FirstRelease
https://github.com/ak1211/hello_stm32l0/releases/tag/FirstRelease