ルモーリン

NXP LPC17xxシリーズのマニュアル

投稿:2013-02-15、更新:2013-05-26

マニュアルの間違いとか「なぜこの事をそこに書く?」というネタ
公式サイトからPDFファイル「LPC175x/6x ユーザーマニュアル(PDF)」をダウンロードしてください。
LPCZone:NXP LPCマイコン情報: ドキュメント/技術情報 一覧

直接リンクはこちら
UM10360.pdf
GPIOのBITBANDに対してGPDMAを使うと失敗しますがページ5に
70 (100 pin package) or 52 (80-pin package) General Purpose I/O (GPIO) pins with configurable pull-up/down resistors, open drain mode, and repeater mode. All GPIOs are located on an AHB bus for fast access, and support Cortex-M3 bit-banding. GPIOs can be accessed by the General Purpose DMA Controller. Any pin of ports 0 and 2 can be used to generate an interrupt.
上手く行きましたらツイッターアカウント@lemorin_jpまでご一報ください(人任せ)。
GPIO(ページ120~140)に割り込みハンドラを書いていない。 ページ74の表50Connection of interrupt sources to the Vectored Interrupt ControllerのInterrupt IDの21に
Note: EINT3 channel is shared with GPIO interrupts
ページ139の「9.5.6.11 GPIO Interrupt Clear register for port 0 (IO2IntClr - 0x4002 80AC)」はport 2
I2C(ページ428~472)にI2C1のピンが2組ある事を書いてない。 ページ95表73Pin descriptionのピン47、48にSDA1、SCL1とあるのでI2C1です。 ページ96表73Pin descriptionのピン59、ページ97表73のピン58にSDA1、SCL1とあるので、こちらも同じくI2C1というワケ。
ページ511図119PWM block diagramでLOAD ENABLE REGISTERの直上の接続点に黒丸「・」があったりなかったり。 単に表記が異なるだけで現物に違いがないか未確認です。
2013.05.26 CCALENビットを追加しました。 CCALENビット(ページ563、表509 CCR)は、「1で無効」です。 ビットの名前は1にした場合の動作からとるけれど、このビットに限り0にした場合の動作で命名しています。 つまり「0で有効」なのでマニュアルはよ~く読みましょう。 CCALENビット
ページ633~636表589~597IAP Prepare sector(s) for write operation command~Re-invoke ISPのコマンドコードが4桁だけど本当は上2桁だけ。 下2桁の「10」は十進数表記の意図で文字装飾付け忘れと予想、こんな感じ。
誤:5010
正:5010
ページ632表588IAP Command Summaryは正しい表記です。
ページ636表597Re-invoke ISPのコマンド名がCompare、もちろん本当はReinvoke ISPですね。
MOVWの仕様が書いてない。
命令一覧のページ648表612Cortex-M3 instructions …continuedにMOVW命令がある。 右端のアンカーをクリックするとページ687Seection 34.2.5.6へジャンプする。 ところがジャンプ先はページ687「34.2.5.6 MOV and MVN」でMOVWがない。
MOV{cond} Rd, #imm16
そしてページの下にこんな記述が…
Remark: The MOVW instruction provides the same function as MOV, but is restricted to using the imm16 operand.
訳が分からず頭から煙が出るレベル(涙目)。
LPC17xxシリーズはCortex-M3で、Thumb2命令セットを使ってます。 この命令ではMOVの16ビットイミディエイト値を12ビットにエンコードしていて、 エンコードできるイミディエイト値に制限があります(なんてこったい)。 だから、エンコードできないイミディエイト値をコーディングするとアセンブルエラーになります(経験者談)。 エンコードできるイミディエイト値はページ651「34.2.3.3.1 Constant」にあってこんな感じ。
  • 8ビット値をシフトしてできる32ビット値
  • 0x00XY00XYのパターン(XとYは4ビット値)
  • 0xXY00XY00のパターン(XとYは4ビット値)
  • 0xXYXYXYXYのパターン(XとYは4ビット値)
これはMOVの仕様なのでMOVWはどうなっているのだろうと色々と実験すると、
MOVW{cond} Rd, #imm16
この#imm16は任意の16ビットを指定できるので前述の条件が不要です。
更にややこしい話があって、アセンブラによってはイミディエイト値を見てオブジェクトに吐く命令を変えている可能性があります。 たとえばエンコードできるイミディエイト値であればMOV命令、そうでなければMOVW命令とか。 私の使っているRed Suite3(NXP版)はソースの通りにオブジェクトを吐こうとするので MOV命令の時はエンコードに失敗するとアセンブルエラーになります。 こんなケース。
MOV R0,#0xFFFF
そしてMOVWであれば問題ナッシング。
MOVW R0,#0xFFFF
このページ全部が鉄ゲタというかハマった記録です(ぐすん)。