• 締切済み

H8S/2378内蔵FlashROMへの書き込み

ルネサスエレクトロニクスのCPU H8S/2378を使用してプログラムを組んでおります。 AD変換を使用して測定したデータを、このCPUの内部FlashROM (例 アドレス0x001030など)にデータを書き込むようなことを行いたいのですが、FlashROM内部へデータを書き込む方法が分かりません。 #define Data(*(volatile unsigned int *)(0x001030)) ヘッダーファイルにて、上記のように定義を行い、 Data = AD.ADDRF; このように定義した"Data"にAD変換の結果(ADデータレジスタFの値)を書き込んで、 確認してみたのですが、データは変わっておりません。 内蔵FlashROMへデータ書き込みは、特別な作業が必要だと思うのですが、 どなたか、アドバイスお願い致します。 初歩的な事を質問するようで大変申し訳ありません。 宜しくお願い致します。

みんなの回答

  • Visar
  • ベストアンサー率19% (17/87)
回答No.1

ルネサスのアプリケーションノートは参考になりませんか? H8S/2400 シリーズ ユーザプログラムモードによるフラッシュメモリ書き換え (EW0 モード) ドキュメントNo. R01AN0770JJ0102 Rev.1.02 2011.09.07

関連するQ&A

  • H8S/2552Fにおけるプログラミング

    現在イエローソフト社のH8S/2552F USB-IF CPUボードを用いて,I/Oポートから32bitトルグスイッチの状態を出力しようとしています。それらのデータをシフトしつつ外部SRAMに送り、さらに32bitのデータとしてPCに取り込みたいと考えているのですが、その方法がわかりません。 以下に現状のプログラムを載せさせて頂きました。(間違いがあるのは十分承知です…) どなたか教えて下さい。よろしくお願い致します。 #define PORT4 (*((volatile unsigned char *)0xFFFFB3)) #define PORT9 (*((volatile unsigned char *)0xFFFFB8)) #define PORTH (*((volatile unsigned char *)0xFFFA14)) #define PORTJ (*((volatile unsigned char *)0xFFFA15)) unsigned long in_switch(void) {     return (PORTJ <<24);     return (PORTH <<16);     return (PORT9 <<8 );     return (PORTJ | PORTH | PORT9 | PORT4) ; } void main() {    puts("トグルスイッチテストプログラム");    while (1) {          unsigned long data;          printf("リターンキーで現在のスイッチ状態を表示します。");          fgetc(stdin); //リターンキー入力待ち          data = in_switch();//スイッチの状態を入力          printf("現在のスイッチ状態=%d(H'%02X)\n", data, data); //スイッチ状態表示 } }

  • H8 外部バスのデータアクセス

    H8 外部バスのデータアクセス ルネサスのH8マイコン初心者です。(C言語も初心者です) 外部バスのCS1(0x200000)に512KBのSRAMが繋がっているのですが、 HEWのセクションを変更せず、直接SRAMに対して読み書きしたいと思っています。 バスコントローラは設定済みという前提で以下の(A)~(C)のように 宣言すればデータの読み書きは出来ると思うのですが、 (A)~(C)を配列や構造体として扱いたい場合、どのように宣言すれば 良いのでしょうか? (A) #define SRAM1 (*(volatile unsigned int*)(0x200000)) (B) #define SRAM2 (*(volatile unsigned int*)(0x200002)) (C) #define SRAM3 (*(volatile unsigned int*)(0x200004)) (D) SRAM1 = 1; (E) SRAM2 = 2; (F) SRAM2 = 3; よろしくお願いします。

  • Micom Car Rally に向けて製作をしているのですがI/Oレジスタ定義が理解できません。

    /************************************************************************/ /* H8/3048F-ONE 内蔵周辺機能 初期化 */ /************************************************************************/ void init( void ) { /* I/Oポートの入出力設定 */ PADDR = 0x5e; /* EEP-ROM,エンコーダ */ h8_3048.h /****************************************************************************/ /* H8/3048F-ONE用内蔵周辺機能のI/Oレジスタ定義 Ver1.03 */ /* 2006.04 マイコンカーラリー実行委員会 */ /****************************************************************************/ #define PADDR (*(volatile unsigned char*)0xfffd1) #define PADR (*(volatile unsigned char*)0xfffd3) (*(volatile unsigned char*)0xfffd1)はどういう意味なのでしょうか? PADRがなんなのかも分かりません。 どなたか、どうかご教授お願いします。

  • マイコンH8-3664 走行カー C言語プログラム改良

    SW0がONで3秒間前進して停止 SW0がOFFの後、再度ONで3秒間前進して停止  するプログラムです! これを、 3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ!というのですが? /**************************************************************/ #include <stdio.h> #include <sysio.h> /*タイマーA*/ #define TMA (*((volatile unsigned char *)0xFFA6) /*割り込み*/ #define IENR1 (*((volatile unsigned char *)0xFFF4)) #define IRR1 (*((volatile unsigned char *)0xFFF6)) #define PDR8 (*((volatile unsigned char *)0xFFDB)) #define PCR8 (*((volatile unsigned char *)0xFFEB)) long count = 0; long x = 0; void interrupt timer( ) { IRR1 &= ~0x40 ; if( count == 300 ) { x = 1 ; count = 0 ; } else { count++; } } void main( ) { unsigned char a; TMA = 0x03 ; IENR1 |= 0x40 ; PCR8 = 0x0f ; while(1){ a = PDR8 >> 4 ; if( x == 0 && a == 0x0e ) { PDR8 = 0x0a ; _ei( ) ; } else if( x == 1 ) [ PDR8 = 0x00; _di( ) : if (( PDR8 >> 4) == 0x0f) { x = 0 ; } } } } /**************************************************************/ 尚、SW はプルアップされている!

  • 現在H8/3694Fのマイコンを使っていてKXM52-1050という加

    現在H8/3694Fのマイコンを使っていてKXM52-1050という加速度センサから 加速度の電圧値を読み取ろうとしているんですがどうしてもX、Y、Z軸の値が 正常に出ません誰か助けてください。製作環境Gccで製作しています。 ソースはメインプログラムだけですが載せておきます。 void main(void) // メインルーチン { int sw; // swの状態を格納するための変数定義 long k; // A/D変換の変数定義 long ad,sei,syou; // A/D変換の値(整数部,小数部)を格納する変数の定義 long ad1,sei1,syou1; long ad2,sei2,syou2; unsigned long ad_data[3]; // A/D変換結果を格納する配列変数を定義 sw = 0; // swの初期化 set_adc(); // H8 A/Dコンバータを設定する init_lcd(); // LCDをイニシャライズする AD.ADCSR.BIT.ADST = 1; // A/D変換開始 //タクトスイッチが押されるまで、待機 while(1){ while(!AD.ADCSR.BIT.ADF); // 変換終了待ち ad_data[0] = (unsigned long)AD.ADDRA >> 6; // AN0 A/D変換結果を変数(ad_data[0])に格納 ad_data[1] = (unsigned long)AD.ADDRB >> 6; // AN1 A/D変換結果を変数(ad_data[1])に格納 ad_data[2] = (unsigned long)AD.ADDRC >> 6; // AN2 A/D変換結果を変数(ad_data[2])に格納 AD.ADCSR.BIT.ADF = 0; // 変換終了フラグをクリア for( k=0; k<=1; k++){ sw = IO.PDRB.BIT.B7; // swにsw14の状態を格納する ad = (unsigned long) ad_data[0]; // 0~5[V]=0~1023でA/D変換値を取得 sei = ad * 5 / 1023; // 電圧値の整数部1桁 syou = (ad * 5 - sei * 1023) * 100L / 1023; // 電圧値の小数部2桁 for( k=1; k<=2; k++){ ad1 = (unsigned long) ad_data[1]; // 0~5[V]=0~1023でA/D変換値を取得 sei1 = ad1 * 5 / 1023; // 電圧値の整数部1桁 syou1 = (ad1 * 5 - sei1 * 1023) * 100L / 1023; // 電圧値の小数部2桁 for( k=2; k<=3; k++){ ad2 = (unsigned long) ad_data[2]; // 0~5[V]=0~1023でA/D変換値を取得 sei2 = ad2 * 5

  • secが・・確認お願いできませんか?

    秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }

  • 16ビット空間でのフラッシュメモリへの書き込みの仕方

    ルネサスのSH2/7145と富士通半導体デバイスのMBM29LV160BEを使っています。 CPUの領域はCS0で200000H~3FFFFFHで取られ16ビットのアクセス空間になっいます。 CPUのアドレスA1~A21がフラッシュのA0~A20に入っています。 MBM29LV160BEのマニュアルに有る様、以下の様にプログラムしました。 #define FLASH_MSK 0x00200000L #define CMD1 0x00000555L #define CMD2 0x000002aaL void flash_write( unsigned long add, unsigned short dat) { unsigned short *pc1, *pc2, *pd; pc1 = (unsigned short *)( FLASH_MSK | CMD1 ); pc2 = (unsigned short *)( FLASH_MSK | CMD2 ); pd = (unsigned short *)( FLASH_MSK + add ); *(pc1) = 0xaa; *(pc2) = 0x55; *(pc1) = 0xa0; *(pd) = dat; while( *(pd) != dat ); } この他にも *(pc1) = 0xaaaa; *(pc2) = 0x5555; *(pc1) = 0xa0a0; や *(pc1) = 0x00aa; *(pc2) = 0x5500; *(pc1) = 0x00a0; など、考えられる事は試してみたのですがダメでした。 書いてませんがwhileは20mSで抜ける様に実際には書いてあります。 何か御存じの方が居ましたら御教授頂ければと思います。 宜しく御願いします。 *:アドレス、データ、信号線は動作しているかオシロで確認してます。   また、16ビットアクセスのS-RAM(400000H)は問題なく読み書きできます。

  • Aki-h8/3052マイコンについて

    今Aki-h8/3052マイコンを勉強しているのですが、初心者のためうまくいかず質問をしました。知識がないと思われるような質問をしてしまいますが、よろしくお願いします。 次のようなプログラムを書き込んで、LEDを点滅させたいのですが点滅しません。原因がわからないので、教えていただける方がいたらよろしくお願いします。 #define P5DDR (*(volatile unsigned char*)0xffffc8) #define P5DR (*(volatile unsigned char*)0xffffca) void wait (long loop){ while(loop--); } int main(void){ P5DDR = 0xff; while(1){ P5DR = 0xff; wait(200000); P5DR = 0; wait(200000); } } ポートBを使用した場合うまくいくのですが、ポート5を使用するとうまくいきません。 コンパイラにはGDLを、書き込みにはH8Write Turboを使用しています。

  • ルネサスエレクトロニクスRX610ポート設定

    ルネサスエレクトロニクスRX610の使用方法について教えて下さい。 RU610 「P27/PO7/(TIOCA5)/TIOCB5/SCK1」 のポートを、 I/Oポート(出力)として使用したいのですが、 シリアルコントロールレジスタ 0x0008824A  を 0x00 に設定。 データディレクションレジスタ  0x0008C002 を 0x80 に設定(※P27 出力) を設定してデータレジスタ 0x0008C022 の値を切り替えても(0x80 ⇔ 0x00) ポートの出力の論理(H/L)が切り替わりません。 ハードウェアマニュアルには、 TPU、SCI、PPG のレジスタの設定、およびP2.DDR.B7 ビットの設定で切り替わると記載されており、 TPU、PPG のレジスタの設定が不足しているのではないかと考え、色々確認しているのですが、 上手く行かず行き詰り状況です。 どのレジスタ(アドレス)をどのような値に設定すれば良いのかが、 お分かりの方がいらっしゃいましたらご回答頂けますか? 初歩的な内容であり、大変失礼致します。 知識不足の為恐れ入りますがどなたかご回答お願いします。

  • フローチャートについて

    H8マイコンでスイッチS1(PORT4-4)が押された場合は、LED1(PORT5-0)、スイッチS2(PORT4-5)が押された場合は、LED2(PORT5-1)、スイッチS3(PORT4-6)が押された場合は、LED3(PORT5-2)、スイッチS4(PORT4-7)が押された場合は、LED4(PORT5-3)が、それぞれ点灯するようなプログラムをつくりました。 #define P4DDR (* (volatile unsigned char *) 0xfffc5) #define P4DR (* (volatile unsigned char *) 0xfffc7) #define P4PCR (* (volatile unsigned char *) 0xfffda) #define P5DDR (* (volatile unsigned char *) 0xfffc8) #define P5DR (* (volatile unsigned char *) 0xfffca) int main(void) { unsigned char sw,ssw; P4DDR = 0x00; /* P4全ビットを入力に設定 */ P4PCR = 0xff; /* P4 MOSプルアップをONにする */ P5DDR = 0xff; /* P5全ビットを出力に設定 */ while (1) { sw = ~P4DR; /* 入力を反転 */ ssw = sw >> 4; /* swを4ビット右にシフトしたものをsswに代入 */ P5DR = ssw; /* sswをP5に出力 */ } return 0; } というプログラムを作ったのですが、フローチャートがどのようになるのかがわからないです。またプログラムが間違っていたら教えてください。