マイコンプログラミング その1
はじめに
過去にLEDキューブ製作などでマイコンを使用して、プログラミングしてきました。ただ良く分からずにプログラミングしていた部分もあったので、もう少し調べながらソフトを作ってみたいと思います。
電源ONをするとポート出力でLEDを点灯するプログラムを作成します。
使用マイコン:RX210マイコンボード(秋月AE-RX210)
開発環境:High-perfomance Embedded Workshop V4.09
電源ON
電源ONするとリセット(パワーオンリセット)割り込みがマイコン内部で発生します。この割り込みが発生すると、プログラムカウンタにアドレス0xFFFFFFFChがセットされます。アドレス0xFFFFFFFChには固定ベクタテーブルがあり、PowerON_Reset_PC関数が割りついています。
「電源ON→リセット割り込み→プログラムカウンタにアドレス0xFFFFFFFChがセット→アドレス0xFFFFFFFChに置いてあるPowerON_Reset_PC関数が呼ばれる」の流れになります。
#include "vect.h"
#pragma section C FIXEDVECT
void (*const Fixed_Vectors[])(void) = {
//;0xffffffd0 Exception(Supervisor Instruction)
Excep_SuperVisorInst,
//;0xffffffd4 Reserved
Dummy,
//;0xffffffd8 Reserved
Dummy,
//;0xffffffdc Exception(Undefined Instruction)
Excep_UndefinedInst,
//;0xffffffe0 Reserved
Dummy,
//;0xffffffe4 Exception(Floating Point)
Excep_FloatingPoint,
//;0xffffffe8 Reserved
Dummy,
//;0xffffffec Reserved
Dummy,
//;0xfffffff0 Reserved
Dummy,
//;0xfffffff4 Reserved
Dummy,
//;0xfffffff8 NMI
NonMaskableInterrupt,
//;0xfffffffc RESET
//;<<VECTOR DATA START (POWER ON RESET)>>
//;Power On Reset PC
PowerON_Reset_PC
//;<<VECTOR DATA END (POWER ON RESET)>>
};
上記が固定ベクタテーブルで、開発環境が自動生成したソースコードです。「Fixed_Vectors」という名前の関数ポインタテーブルになっており、PowerON_Reset_PC関数が配置されている事が確認できます。
「#pragma section C FIXEDVECT」で内蔵ROM領域の0xFFFFFF80hに配置するように指示します。
リセット割り込み受付後
PowerON_Reset_PC関数は以下になります。
#pragma section ResetPRG // output PowerON_Reset to PResetPRG section
#pragma entry PowerON_Reset_PC
void PowerON_Reset_PC(void)
{
set_intb(__sectop("C$VECT"));
_INITSCT(); // Initialize Sections
// _INIT_IOLIB(); // Use SIM I/O
// errno=0; // Remove the comment when you use errno
// srand((_UINT)1); // Remove the comment when you use rand()
// _s1ptr=NULL; // Remove the comment when you use strtok()
HardwareSetup(); // Use Hardware Setup
nop();
// _CALL_INIT(); // Remove the comment when you use global class object
set_psw(PSW_init); // Set Ubit & Ibit for PSW
// chg_pmusr(); // Remove the comment when you need to change PSW PMbit (SuperVisor->User)
main();
// _CLOSEALL(); // Use SIM I/O
// _CALL_END(); // Remove the comment when you use global class object
brk();
}
上記は開発環境が自動生成したソースコードです。_INITSCT関数はセクションの初期化をしているようですが、よく理解できなかったので割愛します。
次回以降に、HardwareSetup関数でクロック設定、ポート設定や低消費電力機能などを初期化して、main関数を呼び出しポート出力でLED点灯します。
この記事が気に入ったらサポートをしてみませんか?