接続確認
CS+により新規プロジェクトを作成し、CPUボードとエミュレータ間の通信を確認します。
CS+のメニュー「ファイル」→「新規作成」→「新しいプロジェクト作成」→マイコン選択(R5F523E6AxFL)→プロジェクト名入力→作成ボタン によりファイルを作成します。
デバックツールがデフォルトでは「RX シュミレータ」となっています。これをE2-Liteに変更します。
「RX シュミレータ」の部分を「右クリック」→使用するデバックツール→RX E2 Lite(E)選択
「クロック」を設定します。
E2 Lite(デバック・ツール)を右クリック→プロパティ
「接続設定」タブ で、クロックのメイン・クロックソース=HOCO、メイン・クロック周波数[MHz]=32
「デバック情報」も変更します。
「ダウンロードファイル設定」タブで、デバック情報の「CPUリセット後に指定シンボル位置まで実行する」=「いいえ」
この設定でリセット直後のコードを表示します。(資料2*2 の69ページ参照。)
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 電源立ち上げ時起動時間短縮ビット)で選択します。
(参考:
・ルネサス 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)の場合、リセットベクタのアドレスを読み出しスタートアッププログラムが開始されます。
(参考: ・資料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)を宣言しています。
・リンクオプションでRESETVECTを、FFFF FFFCh番地に割り付けています。
CC-RX(ビルド・ツール)を右クリック→プロパティ選択→リンク・オプション→セクション セクション開始アドレスを編集
3.2)スタックポインタの設定
・stacksct.h で、ユーザスタック(USP)と割り込みスタック(ISP)のサイズを定義しています。
・リンクオプションのセクション開始アドレス指定で、SU,SIの配置アドレスを指定しています。
・スタックポインタのコード出力
stacksct.hは、resetprg.cにインルードされています。resetprg.cには、PowerON_Reset_PCがentry関数宣言されています。
entry 関数の前で、 #pragma stacksize 宣言があると、スタックポインタのコードが出力される仕様となっています。
(資料5 (6) エントリ関数指定 p379)
3.3)例外ベクタテーブルと割り込みベクタテーブルの設定
・resetprg.cで行います。
__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) フロー図
スタートアッププログラムの修正
ルネサス提供のスタートアッププログラムの一部を修正、追加しました。修正点は、以下の通りです。
・ユーザスタックは使用せず、割り込みスタックを0x200(=512バイト)確保。 常時スーパバイザモードで動作。(資料 4. 「2.3 プロセッサモード」)
・クロックの設定。(資料 4. 「9 クロック発生回路」)
また、リンク・オプションでセクションの配置アドレスを変更しました。(スタック用の領域をアドレス0の方へ移動。プログラムの領域を0xFFFC0100 から開始。)
・ファイル一覧
_h_c_lib.h とmachine.hはCS+をインストールしたフォルダにあります。
・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)に、「高速動作モード」とする設定を追加しました。