概要
Cortex-M3のベクタテーブルは0番地から始まります。テーブル内には、例外ハンドラとISR(割り込みサービスルーチン)のアドレス(ベクタ)を記述します。Arm7等の他のArmプロセッサでは、命令を記述し、その命令を実行して飛び先アドレスにジャンプする方式ですが、Cortex-M3では命令を記述する必要は無く、飛び先アドレスを記述すればハンドラが自動的に、そのアドレスに飛ばしてくれます。
テーブルサイズ(ワード)= IRQ入力数+16。最小サイズ(1 IRQの場合)は17ワード、最大サイズ(240 IRQの場合)は256ワードになります。
一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。その為、ソフトウェアの初期ルーチンでSP_mainの初期化を行う必要はありません。マイコンのリセット後にSP_mainの値が自動的にR13(SP)に格納されます。
0x00から0x3CまではCortex-M3用のベクタになり、0x40以降は、マイコンの周辺機能または、外部からの割り込みに割り当てられています。
アドレス | ベクタ |
---|---|
0x00 | SP_mainの初期値 |
0x04 | リセット |
0x08 | NMI |
0x0C | ハードフォールト |
0x10 | メモリ管理 |
0x14 | バスフォールト |
0x18 | 用法フォールト |
0x1C-0x28 | Reserved |
0x2C | SVCall |
0x30 | デバッグモニター |
0x34 | Reserved |
0x38 | PendSV |
0x3C | Systick |
0x40 | IRQ0 |
… | ~ IRQs |
ベクタテーブルの移動
メモリマップ上で、コードエリアとデータエリアが分離されているマイコンもありますが、 Cortex-M3では、メモリマップ上のどこにコードを記述しても実行できます。すなわち、RAMエリアにプログラムを記述しても実行が可能です。
Cortex-M3を搭載したマイコンでFlashを停止させて消費電力を低減する機能が付いている場合、Flashを停止しRAMやその他のメモリ(EEPROM等)上のコードを実行させることができます。しかし、この場合、ベクタアドレスがFlash上にあると、割り込みが実行できません。そこで、Cortex-M3のベクタテーブルは移動できるようになっています。
ベクタテーブルを移動するには、ベクタテーブル オフセットレジスタを使います。ベクタテーブル オフセットレジスタは、ベクタテーブルの位置がコード領域またはSRAM領域のどこにあるかを示しています。
リセット後のデフォルト値は0(コード領域)です。レジスタの中のTBLBASEがベクタテーブルがコード領域にあるか RAM領域にあるかを示し、TBLOFFがSRAM領域またはコード領域の最下位部分からのオフセットを示します。
ベクタテーブルの位置を設定するとき、例外の数を考慮して、設定する必要があります。つまり、16個までの割り込みが使える最小のアライメントは32ワードになります。割り込みの数がより多い場合は、次の2のべき乗まで切り上げて、考慮する必要があります。例えば、21個の割り込みが必要な場合、テーブルサイズが37ワードになり、次の2のべき乗は64なので、アライメントは64ワード境界の必要があります。
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
NVICレジスタ
NVIC(統合ネスト型ベクタ割り込みコントローラ)が持っている制御用レジスタを説明します。SysTick関係のレジスタもNVICレジスタに含まれますが、それらはSysTickの章で詳しく説明します。