mathjax

2018年4月29日日曜日

LPC81x User manualを参照する。

挿すだけ! ARM32ビット・マイコンのはじめ方」に従い、コードを写経(掲載されているコードを自分で入力)し、いくつかのプログラムを動かしたけれど、マイコンプログラミングについて分かってきた気がしない。気配りの利いた丁寧な解説をつまみ食いだけで済ませて動けばOKとしているのも理由の一つだが、デバイスを理解した感覚が無いのがその理由ではないかと思う。

GPIO

ということで、最初のプログラム「LED点滅プログラム」から、関係するレジスタなどをユーザー・マニュアルを参照しながら確認することとする。

GPIOの制御は、LPC81x User manual (UM10601.pdf) のChapter 7: LPC81x GPIO portに記載がある。

ユーザー・マニュアルの記載だけを頼りに読むのは、英語であるということも相まってなかなか辛いけれど、「挿すだけ! ARM32ビット・マイコンのはじめ方」の解説と合わせて読むと、読みやすい。

Table 81. Register overview: GPIO port (base address 0xA000 0000)にGPIOに関連するレジスタが一覧になっている。DIR0、NOT0。プログラムの中で使われていて、入出力を設定するレジスタ、該当ポートを反転するレジスタとの説明があるけれど、概念的なもので実在するものではない感覚があった。(約束事としてそう使うもののような感じ。)しかし、それらのレジスタはbase address 0xA000 0000から存在しているのだ。2.2.1 Memory mappingのLPC81x Memory mappingにメモリマップの記載があり、レジスタの所在もここで見ることができる。

GPIOはデフォルトはInput。GPIO port toggle registers (NOT0) レジスタは、1を書くと出力を反転させる。

ユーザー・マニュアルにはRecommended practicesという記載があり、使う人がこのマイコンに慣れる為に、お勧めの使い方が記載されている。確かに、レジスタの説明が羅列されていても、実際にはどれを使えばいいのかというのは分かりにくい。「挿すだけ! ARM32ビット・マイコンのはじめ方」はその実践版という形だ。

また、これらのレジスタはおそらくCoretex-M0+共通のレジスタで、これを知っておくと他のマイコンを使うときにも有用なのだろうと思う。

SysTick

次に「SysTickを用いたLED点灯プログラム」を見る。SysTickなので読むべきは、LPC81x User manual (UM10601.pdf) のChapter 14: LPC81x ARM Cortex SysTick Timer (SysTick)なのだろう。


ブロック図はあるけれど、雰囲気はここからはあまり掴めない。やはり、レジスタ説明を読まないと。

Chapter 1: LPC81x Introductory informationに
• Clock generation:
– 12 MHz internal RC oscillator trimmed to 1 % accuracy that can optionally be used as a system clock.
との記載があるので、外付けの発振器を付けない場合、LPC810は内蔵のRC発信回路で12MHzで動作し、これがsystem clockとなる。

Table 166. Register overview: SysTick timer (base address 0xE000 E000)に記載されたレジスタは僅かに4つ。CMSIS_CORE_OPC8xxプロジェクト→inc→core_cm0plus.hにその定義がある。
/** \brief  Structure type to access the System Timer (SysTick).
 */
typedef struct
{
  __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
  __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
  __IO uint32_t VAL;  /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
  __I  uint32_t CALIB;/*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
} SysTick_Type;
こちらも章の最後にレジスタの使い方の例が記載されていた。

Pin interrupts

「ピン入力割り込みの実験用コード」ではピン割込みが使われる。それなのでLPC81x User manual (UM10601.pdf) のChapter 8: LPC81x Pin interrupts/pattern match engineを読む。ピンは割込みに使うほかに、パターンマッチにも使えるとの記載があるが、今はピンの割り込みの所のみ読むこととする。

割り込みに使いたいピンを、まずはSwitch Matrixでアサインする。
-Switch Matrixの説明もChapter 9: LPC81x Switch matrixにあるけれど、現時点では LPC Initialization Tool が設定してくれるので詳細には踏み込まない。

ピン割込み関連のレジスタは、Table 92. Register overview: Pin interrupts and pattern match engine (base address: 0xA000 4000)となっていて、定義は、CMSIS_CORE_OPC8xxプロジェクト→inc→LPC8xx.hにあった。レジスタ名とコード上の定義は同じ名前だった。

typedef struct {                            /*!< (@ 0xA0004000) PIN_INT Structure */
  __IO uint32_t ISEL;                       /*!< (@ 0xA0004000) Pin Interrupt Mode register */
  __IO uint32_t IENR;                       /*!< (@ 0xA0004004) Pin Interrupt Enable (Rising) register */
  __IO uint32_t SIENR;                      /*!< (@ 0xA0004008) Set Pin Interrupt Enable (Rising) register */
  __IO uint32_t CIENR;                      /*!< (@ 0xA000400C) Clear Pin Interrupt Enable (Rising) register */
  __IO uint32_t IENF;                       /*!< (@ 0xA0004010) Pin Interrupt Enable Falling Edge / Active Level register */
  __IO uint32_t SIENF;                      /*!< (@ 0xA0004014) Set Pin Interrupt Enable Falling Edge / Active Level register */
  __IO uint32_t CIENF;                      /*!< (@ 0xA0004018) Clear Pin Interrupt Enable Falling Edge / Active Level address */
  __IO uint32_t RISE;                       /*!< (@ 0xA000401C) Pin Interrupt Rising Edge register */
  __IO uint32_t FALL;                       /*!< (@ 0xA0004020) Pin Interrupt Falling Edge register */
  __IO uint32_t IST;                        /*!< (@ 0xA0004024) Pin Interrupt Status register */
  __IO uint32_t PMCTRL;                     /*!< (@ 0xA0004028) GPIO pattern match interrupt control register          */
  __IO uint32_t PMSRC;                      /*!< (@ 0xA000402C) GPIO pattern match interrupt bit-slice source register */
  __IO uint32_t PMCFG;                      /*!< (@ 0xA0004030) GPIO pattern match interrupt bit slice configuration register */
} LPC_PIN_INT_TypeDef;






0 件のコメント:

コメントを投稿