見出し画像

マイコンプログラミング その1


はじめに

過去にLEDキューブ製作などでマイコンを使用して、プログラミングしてきました。ただ良く分からずにプログラミングしていた部分もあったので、もう少し調べながらソフトを作ってみたいと思います。

電源ONをするとポート出力でLEDを点灯するプログラムを作成します。

  • 使用マイコン:RX210マイコンボード(秋月AE-RX210)

  • 開発環境:High-perfomance Embedded Workshop V4.09

秋月AE-RX210

電源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に配置するように指示します。

固定ベクタテーブルは上記メモリマップより内蔵ROMにある事が分かります。
シングルチップモードで動かすことが前提です。

リセット割り込み受付後

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点灯します。

この記事が気に入ったらサポートをしてみませんか?