60歳からの電子工作ノート

生涯学習として取り組んでいます。

ペルチェ制御用ボードの試作(スタートアッププログラム)

概要

ルネサスマイコン開発環境 CS+ *1エミュレータ(E2-Lite)を使用して、マイコン(RX23E-A)のスタートアッププログラムを作成しました。

接続確認

CS+により新規プロジェクトを作成し、CPUボードとエミュレータ間の通信を確認します。
CS+のメニュー「ファイル」→「新規作成」→「新しいプロジェクト作成」→マイコン選択(R5F523E6AxFL)→プロジェクト名入力→作成ボタン によりファイルを作成します。

f:id:vABC:20211213131007p:plain
Fig. 新規プロジェクト作成

デバックツールがデフォルトでは「RX シュミレータ」となっています。これをE2-Liteに変更します。
「RX シュミレータ」の部分を「右クリック」→使用するデバックツール→RX E2 Lite(E)選択

f:id:vABC:20211213163115p:plain
Fig. 使用するエミュレータの選択

「クロック」を設定します。
E2 Lite(デバック・ツール)を右クリック→プロパティ
「接続設定」タブ で、クロックのメイン・クロックソース=HOCO、メイン・クロック周波数[MHz]=32

f:id:vABC:20211214062847p:plain
Fig. クロック設定

「デバック情報」も変更します。
「ダウンロードファイル設定」タブで、デバック情報の「CPUリセット後に指定シンボル位置まで実行する」=「いいえ」
この設定でリセット直後のコードを表示します。(資料2*2 の69ページ参照。)

f:id:vABC:20211214065925p:plain
Fig. デバック情報

CPUボードの電源をいれ、メニューの「デバック」→「デバックツールへの接続」を実行します。
進捗状況の表示がでます。無事に接続できれば、最終アドレスが表示されます。(コードが何も書き込まれていない状態)

f:id:vABC:20211214081538p:plain
Fig. CPUボードへ接続

今回のCPUボードは一度で接続できましたが、うまく接続できない時もありました。多くの場合エミュレータと接続する14ピンコネクタのはんだ付け不良が原因でした。14ピンのコネクタですが実際に使用しているのは、7ピン(MD/FINED),13ピン(RES#),8ピン(VCC),2,12,14ピン(GND)です。資料3*3の 「2.4.5. 14ピンコネクタでのRX200シリーズFINE接続」(28ページ)参照

電源ONからmain()実行までの処理

1)電源ONからリセット解除まで
電源ONから内部リセット信号が解除されるまで、通常起動の場合は約10msec、起動時間短縮時の場合は約2msecかかるようです。通常起動と起動時間短縮は、オプション機能選択レジスタ1 (OFS1)の bit3 (FASTSTUP 電源立ち上げ時起動時間短縮ビット)で選択します。

f:id:vABC:20211216083322p:plain
Fig. 電源ONからのリセット

(参考:
ルネサス FAQ 1006825 : マイコンの電源投入からの動き(https://ja-support.renesas.com/knowledgeBase/17793981)
・資料4 *4の 「39.5 パワーオンリセット回路、電圧検出回路特性」)
・資料4の「7.2.2 オプション機能選択レジスタ1 (OFS1)」

2)リセット解除からスタートアップまで
リセット解除後、モード設定端子(MD)(CPUの11ピン)のH/Lにより、動作モードが設定されます。シングルチップモード(MD=High)の場合、リセットベクタのアドレスを読み出しスタートアッププログラムが開始されます。

f:id:vABC:20211215065047p:plain
Fig. メモリマップ

(参考: ・資料4の「3.動作モード」、「4. アドレス空間」)

3)スタートアッププログラム
「新規プロジェクト作成」のプログラムをそのまま使用してもmain()は実行されます。
(資料5*5の「8.スタートアップ(p.869)」と「A.クイックガイド A.5 スタートアップルーチン(p.1047)」)

処理プログラムを調べて見ました。

3.1)先頭アドレス( PowerON_Reset_PC)のリセットベクタへの登録
・vecttbl.c で PowerON_Reset_PCのセクション(RESETVECT)を宣言しています。 

f:id:vABC:20211215071703p:plain
Fig. セクション宣言 RESETVECT

・リンクオプションでRESETVECTを、FFFF FFFCh番地に割り付けています。
CC-RX(ビルド・ツール)を右クリック→プロパティ選択→リンク・オプション→セクション セクション開始アドレスを編集

f:id:vABC:20211215072425p:plain
Fig. リンク・オプションによるセクション開始アドレスの指定

3.2)スタックポインタの設定
・stacksct.h で、ユーザスタック(USP)と割り込みスタック(ISP)のサイズを定義しています。

f:id:vABC:20211215083210p:plain
Fig. スタックサイズ指定

・リンクオプションのセクション開始アドレス指定で、SU,SIの配置アドレスを指定しています。
・スタックポインタのコード出力
 stacksct.hは、resetprg.cにインルードされています。resetprg.cには、PowerON_Reset_PCがentry関数宣言されています。
entry 関数の前で、 #pragma stacksize 宣言があると、スタックポインタのコードが出力される仕様となっています。
(資料5 (6) エントリ関数指定 p379)

f:id:vABC:20211215091430p:plain
Fig. エントリ関数指定
f:id:vABC:20211215093302p:plain
Fig. スタックポインタの設定

3.3)例外ベクタテーブルと割り込みベクタテーブルの設定
・resetprg.cで行います。

f:id:vABC:20211215102111p:plain
Fig. ベクタテーブルの設定

__sectopは、セクションの先頭アドレスを返します。(資料5 「4.2.7 セクションアドレス演算子 」 p.419 )
set_extbは、組み込み関数で例外テーブルレジスタ(EXTB)にデータをセットします。(資料5 p.412 )
set_intbは、組み込み関数で割り込みテーブルレジスタ(INTB)にデータをセットします。(資料5 p.402 )

・リンクオプションのセクション開始アドレス指定で、EXCEPTVECTとC$VECTの配置アドレスを指定します。

・関係するファイルです。
a)vect.h : 例外処理と割り込み処理にする関数名を pragma interrupt で宣言。(資料5 (3)割り込み関数作成記述 p373)
b)vecttbl.c: オプション設定メモリ(OFSM)、例外ベクタテーブルとリセットベクタ。
c)intprg.c : 例外処理と割り込み処理プログラムの本体。
例外処理プログラムとは、未定義例外やノンマスカラブル割り込みが発生した時に起動される処理です。
割り込み処理プログラムとは、タイマ割り込みや受信割り込み処理です。
( #pragma interrupt 関数名(vect=xx))で宣言した割り込み処理プログラムは、セクション C$VECTへ配置されます。)

3.4)変数の初期化
・ resetprg.c の _INITSCT(); を実行することで、RAMを0クリアしています。(dbsct.cで範囲を 定義しているようです。)
  この関数で初期値を持たないグローバル変数(例えばuisinged int a;) は0で初期化されます。

4) フロー図

f:id:vABC:20211216090727p:plain
Fig. 電源ONからmain()実行までの概略フロー図
スタートアッププログラムの修正

ルネサス提供のスタートアッププログラムの一部を修正、追加しました。修正点は、以下の通りです。

・ユーザスタックは使用せず、割り込みスタックを0x200(=512バイト)確保。 常時スーパバイザモードで動作。(資料 4. 「2.3 プロセッサモード」)
・クロックの設定。(資料 4. 「9 クロック発生回路」)

f:id:vABC:20211216112905p:plain
Fig. クロックの設定

また、リンク・オプションでセクションの配置アドレスを変更しました。(スタック用の領域をアドレス0の方へ移動。プログラムの領域を0xFFFC0100 から開始。)

f:id:vABC:20211216120038p:plain
Fig. 新しい配置アドレス

・ファイル一覧

f:id:vABC:20211217064853p:plain
Fig. スタートアッププログラム

_h_c_lib.h とmachine.hはCS+をインストールしたフォルダにあります。

f:id:vABC:20211216101411p:plain
Fig. 標準インクルードファイル

・resetprg.c

#include	<machine.h>
#include	<_h_c_lib.h>

#include	 "iodefine.h"
#include	 "misratypes.h"


static void operating_frequency_set (void);

#pragma stacksize si=0x200	// 割り込みスタックの定義 (ユーザスタックサイズは使用しない。)
//#pragma stacksize su=0x100
#define PSW_init       0x00010000	// プロセッサステータスワード (割り込み許可)


#pragma section ResetPRG		// output PowerON_Reset to PResetPRG section

#pragma entry PowerON_Reset_PC


void PowerON_Reset_PC(void)
{
	set_extb(__sectop("EXCEPTVECT")); // CPUがRXV2アーキテクチャの場合、例外ベクタテーブルをEXTB(例外テーブルレジスタ)へセット
	set_intb(__sectop("C$VECT"));     // 可変ベクターテーブル(割り込み(タイマー等)の先頭アドレス)を、INTBレジスタにセット

	operating_frequency_set();    // システムクロック 等の設定
	
	_INITSCT();			// 静的変数の初期化 (初期値なしの静的変数=0, 初期値付きの静的変数=初期値)

	
	set_psw(PSW_init);		// 割り込み許可
	
	main();				// メインの起動

	brk();
}



//  クロックの設定
// 設定内容:
//    システムクロック(ICLK) = 32 MHz
//    周辺モジュールクロック(PCLKA) = 32 MHz (MTU2用)
//    周辺モジュールクロック(PCLKB) = 32 MHz (MTU2,S12AD以外の周辺モジュール用)
//    周辺モジュールクロック(PCLKD) = 32 MHz (S12AD A/Dコンバータ用)
//    フラッシュIFクロック(FCLK) = 32 MHz
//

static void operating_frequency_set (void)
{
	
	SYSTEM.PRCR.WORD = 0xA50F;	// クロック発生回路関連レジスタの書き込み許可
	
	SYSTEM.HOCOCR.BIT.HCSTP = 0;	// HOCO動作
	while((SYSTEM.OSCOVFSR.BIT.HCOVF) == 0){	//  高速オンチップオシレータ HOCO発振安定待ち
	}
					// 動作電力制御モード 中速動作モードから高速動作モードに設定
	SYSTEM.OPCCR.BIT.OPCM = 0;	// 高速動作モード
	while( SYSTEM.OPCCR.BIT.OPCMTSF == 1 ){  // 遷移待ち
	}
	 
	SYSTEM.SCKCR.LONG = 0x00000000;	    // システムクロックの設定 (FCLK=32MHz,ICLK=32MHz,  PCLKB=32MHz ,PCLKD=32MHz)					  
	while( SYSTEM.SCKCR.LONG != 0x00000000 ){
	}
	
	
	SYSTEM.SCKCR3.WORD = 0x0100;		// Clock sourceは、HOCO選択
	while( SYSTEM.SCKCR3.WORD != 0x0100){
	}
		
	SYSTEM.PRCR.WORD = 0xA500;	// クロック発生回路関連レジスタへの書き込み禁止
}

・test1n.c

#include	 "iodefine.h"
#include	 "misratypes.h"
void main(void)
{
}

・misratypes.h

typedef          char		char_t;
typedef unsigned char		uint8_t;
typedef unsigned short int  uint16_t;
typedef unsigned long int   uint32_t;
typedef signed   char		int8_t;
typedef signed   short int	int16_t;
typedef signed   long int	int32_t;
typedef          float		float32_t;
typedef          double		float64_t;
機材

 E2 エミュレータ Lite ,  8000円

改1

2022年2月21日:
CPUのリセット後、デフォルトでは「中速動作モード」で動作しています。
中速動作モードでは、ICLK等は12[MHz]まで有効となっていました。
(資料4の 「11. 消費電力低減機能」「表11.3 動作電力制御モードと動作周波数範囲・動作電圧範囲の関係」p.200)
クロックの設定を32MHzとすると32MHzで動作しているようですが適切ではありません。
resetprg.cの operating_frequency_set (void)に、「高速動作モード」とする設定を追加しました。

*1: 【無償評価版】 統合開発環境 CS+ for CC V8.06.00 (一括ダウンロード版)

*2:資料2「CS+ V8.06.00 統合開発環境 ユーザーズマニュアル RX デバッグ・ツール編 (R20UT4977JJ0100 Rev.1.00)」

*3:資料3「E1/E20/E2エミュレータ,E2エミュレータLite ユーザーズマニュアル別冊(RX接続時の注意事項)」 (R20UT0399JJ1400 Rev.14.00)

*4: 資料4 「RX23E-Aグループ ユーザーズマニュアル ハードウェア編 ( R01UH0801JJ0110 Rev.1.10)」

*5:資料5「CC-RX コンパイラ ユーザーズマニュアル (R20UT3248JJ0110 Rev.1.10)」