最弱の 32bit マイコン、LPC810先輩です。もういろいろと他の方によって詳しく丁寧な記事が書かれていますが、個人的にまとめておこうかと思います。
というのも、最近マイコンをいじろうとして、接続方法とかがわからない時にこのブログを検索するんですよねw備忘録になっていますよ本当に。ということでまとめま〜す
本当にただのメモなので、雑ですけれどご了承ください!
書き込みピン接続
いっつも忘れてググるので。
ピン番号 | GPIO名 | 機能 | 備考 |
---|---|---|---|
1 | PIO0_5 | RESET | 内部プルアップあり。DTR# をつなげておくと良いかも |
2 | PIO0_4 | TXD | |
3 | PIO0_3 | SWCLK | |
4 | PIO0_2 | SWDIO | |
5 | PIO0_1 | ISP_Entry | Low にすると ISP モードに。RTS# をつなげておくと良いかも |
6 | Vdd | 3.3V | |
7 | Vss | ||
8 | PIO0_0 | RXD |
内部オシレーターは 12MHz なので、書き込みコマンドはこんな感じ。
$ lpc21isp -bin 810_Register.bin /dev/tty.usbmodem1412 115200 12000
ピン機能設定
癖があります。普通のマイコンみたいに、まず GPIO かそれ以外か決めて〜なんかじゃありません。このマイコンはまず機能があって、それを何番ピンに割り当てるか直で数値を打ち込むという逆の発送になっています。数少ないピンを有効に使うためでしょうね。
使うレジスタは SWM
(switch matrix) というペリフェラルに属するものです。例えば LPC_SWM->PINASSIN0
の 0bit〜7bit は TXD を PIO0_x の内でどのピンに割り当てるか、というものになっています。PIO0_3 にしたかったら、そこを 0x03
にすれば良いんです。それだけ。割り当てたくない場合は 0xFF
。
ROM API
コードサイズを小さくするために、既に 810 内にハードウェアとして設定ルーチンが埋め込まれている。それを利用するもの。
ユーザーマニュアル通りままでいいが、コピペが大変。頑張ろう。あと、マニュアルではなぜか ROM_API_T
のポインタ変数を作ってしまっているのでこれでは省容量化の効果は小さくなってしまう。以下のようにマクロで使用すべし。
#define ROM_DRIVER_BASE (0x1FFF1FF8UL)
#define LPC_I2CD_API ((volatile I2CD_API_T *) ((*(ROM_API_T * *) (ROM_DRIVER_BASE))->pI2CD))
また、基本的に ROM API はペリフェラルの設定をするのみで、ペリフェラルの電源オン、ピン設定は自分でやっておく必要があることにも注意しよう。初期化関数は紛らわしいものが多数あるが、基本的に以下の対応。
xxx_get_mem_size
: バッファを確保するための関数。返り値はバッファのために何バイト必要かという値。xxx_setup
: 基本的な設定をし、そのハンドラを返す。ハンドラは実際のオペレーションに必須。xxx_init
: コンフィグレーション用の構造体を使って具体的な動作を規定する。
USART ROM API
バッファはこんな感じで作る。以下同様。
uint8_t mem[LPC_UART_API->uart_get_mem_size()];
続いて UART_CONFIG_T
でコンフィグレーション構造体のインスタンスを生成。error_en
はエラー検知を有効化するもの?よくわからない。
uart_isr
ってどうやって使うの?多分割り込みハンドラの末尾に書いてフラグ消すとかかな?