スライド 1

Similar documents
スライド 1

スライド 1

スライド 1

スライド 1

スライド 1

スライド 1

スライド 1

スライド 1

スライド 1

RX600 & RX200シリーズ アプリケーションノート RX用仮想EEPROM

スライド 1

Microsoft PowerPoint - RX62N動画マニュアルDMAC.ppt [互換モード]

RX210 グループ FIT を用いたフラッシュメモリの書き換え 要旨 本サンプルコードでは FIT を用いて 特定の内蔵フラッシュメモリ (ROM および E2 デ ータフラッシュ ) のアドレスに特定の値を書き込む方法について説明します 対象デバイス RX210 1 / 50

Notes and Points for TMPR454 Flash memory

RX600 & RX200シリーズ RX用シンプルフラッシュAPI アプリケーションノート

GR-SAKURA-SAのサンプルソフト説明

FLASH USB DIRECT Programmer ユーザーマニュアル 2015 年 3 月 6 日 ソフト版数 :V01L16 Copyright Spansion

Microsoft Word - プログラムをRAM.doc

Microsoft PowerPoint - RL78G14_動画マニュアル_タイマRD.ppt [互換モード]

マクロ(シミュレータコマンド)の使い方

目次 目次... 1 はじめに... 3 マイコンシミュレータのデバッグ機能... 3 スタートアップコマンドファイル... 5 シミュレータコマンド ( マクロ ) 例... 6 I/O 制御等で外的要因待ちをしている場合 ( その1)... 6 I/O 制御等で外的要因待ちをしている場合 ( そ

(Microsoft Word - \216\346\220\340SiTCP-VME-Master\(Rev26\).doc)

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

External Flash Definition Editor (外部フラッシュ定義エディタ) ユーザーズマニュアル

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna/advicelunaⅡのフラッシュメモリ対応 対応範囲と使用方法 はじめに adviceluna/advicelu

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

基本条件 (1Slot 版用 ) 機能 MR-SHPC 端子名 設定内容 備考 CS 空間 -CS CS6 空間 ( キャッシュ無し ) キャッシュ無し空間を使用 (B h) RA25 0 固定 レジスタ空間 RA24 0 固定 RA23 0 固定 B83FFFE 4h~B83FFFF

< D A0>

本資料のご使用につきましては 次の点にご留意願います 本資料の内容については 予告無く変更することがあります 1. 本資料の一部 または全部を弊社に無断で転載 または 複製など他の目的に使用することは堅くお断りいたします 2. 本資料に掲載される応用回路 プログラム 使用方法等はあくまでも参考情報で

joho07-1.ppt

CS+ V 統合開発環境 ユーザーズマニュアル RL78 デバッグ・ツール編

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

Notes and Points for TM4C123Gx Internal Flash memory

Microsoft Word - dg_sataahciip_refdesign_jp.doc

【注意事項】RX Driver Package、 RXファミリ RTC モジュール Firmware Integration Technology

Express5800/R110a-1Hユーザーズガイド

Notes and Points for ADuCM320 Internal Flash memory

アプリケーションノート AS-E402サンプルプログラム

1. LCD LS027B4DH01 について LS027B4DH01 は 400dot x 240dot のグラフィック LCD です 秋月電子通商で購入できます 外形サイズ : 62.8 x x 1.53mm LCD のフレキシブルケーブルの根元の部分はちょっと力を加えただけで表示が

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

RX210 グループ MTU2 を用いた相補 PWM モードの波形出力 要旨 本サンプルコードでは MTU2 を用いて相補 PWM モードの波形を出力する方法について説 明します 対象デバイス RX210 1 / 41

04-process_thread_2.ppt

AN

N Express5800/R320a-E4 N Express5800/R320a-M4 ユーザーズガイド

Express5800/R320a-E4, Express5800/R320b-M4ユーザーズガイド

1 138

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

評価ボード キット 開発ツールご使用上の注意事項 1. 本評価ボード キット 開発ツールは お客様での技術的評価 動作の確認および開発のみに用いられることを想定し設計されています それらの技術評価 開発等の目的以外には使用しないで下さい 本品は 完成品に対する設計品質に適合していません 2. 本評価

Express5800/320Fc-MR

計算機ハードウエア

81 /******************************************************************************/ 82 /* スレーブアドレスの設定 */ 83 /*****************************************

スライド 1

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

Microsoft Word - SfWriter.doc

PowerPoint プレゼンテーション

R1RW0408D シリーズ

SiTCP ユーティリティユーザガイド 2014 年 6 月 18 日 0.73 版 Bee Beans Technologies 1

OAKS16-BoardKit

Nios® II HAL API を使用したソフトウェア・サンプル集 「Modular Scatter-Gather DMA Core」

R1LV1616H-I シリーズ

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

R7G4HML3 6 LC2 取扱説明書 リモート I/O R7G4H シリーズ M E C H A T R O L I N K - Ⅲ 用 モニタ出力付 絶縁 2 点 ねじ端子台ロードセル入力ユニット 形式 R7G4HML3-6 - LC EU CE 許容電圧範囲 消費電流 直流

TFTP serverの実装

untitled

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

MSP430 CCSv5 を使い Flash Memory 内容と version 情報を確認する方法 ( テクニック編 ) Rev: PIC Trout 今回は 下記の2 件について説明します 1) CCSv5 を使用して MSP430 の Flash Memory 内容を

DRAM SRAM SDRAM (Synchronous DRAM) DDR SDRAM (Double Data Rate SDRAM) DRAM 4 C Wikipedia 1.8 SRAM DRAM DRAM SRAM DRAM SRAM (256M 1G bit) (32 64M bit)

スライド 1

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

thesis.dvi

8ビットデータバスでアクセスする場合は、16ビットレジスタを上位バイト、下位バイトに分けてアクセスします

39733a.fm

CubeSuite+版RXシリアルデバッガ取扱説明書

MODBUS ユーザーズマニュアル 페이지 1 / 23

RL78/G13 セルフ・プログラミング(CSI受信データ)


電磁流量計 WZ-C Modbus RTU 通信仕様書 ver.8.225

Microsoft Word - FCTT_CS_Mod( )Jver1.doc

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Microsoft Word - ExtFlashROM.doc

R1RP0416DIシリーズデータシート

10-vm1.ppt

回路図 部品表 部品番号 型番 個数 U PIC6F823 I/ST (TSSOP 4pin) R 00Ω (/0W, 608) R2 - R9 360Ω (/0W, 608) 8 C μf (25V, 608) LED LN56RA CN ロープロファイルピンソケット CN2 ロープロファイルピン

ターゲット項目の設定について

Nios II - PIO を使用した I2C-Bus (2ワイヤ)マスタの実装

tri_s_tg12864_vcp の説明 2014/02/05 飛石伝ひ CPU 基板 の LCD TG12864 の表示プログラムです 漢字表示 (JIS208) を行うことができます USB の VCP ( 仮想 COM ポート ) を使用して非同期シリアル通信により 表示試験を行うことができ


RTX830 取扱説明書

untitled

*.....J.....S.q..2013B_....

Rev.1.1 S1V50300 サンプルプログラムマニュアル

R1RP0416D シリーズ

Transcription:

RX62N 周辺機能紹介データフラッシュ データ格納用フラッシュメモリ ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A

コンテンツ データフラッシュの概要 プログラムサンプル 消去方法 書き込み方法 読み出し方法 FCUのリセット プログラムサンプルのカスタマイズ 2

データフラッシュの概要 3

データフラッシュとは フラッシュメモリ フラッシュメモリは消去後に書き込む 消去 書き込みは専用の手続きが必要 用途はデータの格納 1 万回の書き換えサイクルを保証 4

データフラッシュの仕様

データフラッシュのメモリ構成 アドレス 0010 0000h 0010 7FFFh データマット 32K バイト (2K バイト 16 ブロック ) ブロック DB00 DB01 DB02 DB03 DB04 DB05 DB06 DB07 DB08 DB09 DB10 DB11 DB12 DB13 DB14 DB15 6

データフラッシュの動作概要 利用 コピー 書き込み / 消去 7

データフラッシュのフロー 開始 事前準備 消去 書き込み 読み出し 終了 8

データフラッシュのモード リセット フラッシュ P/E モードエントリレジスタ 書き込み 消去不可読み出し可能 書き込み 消去可能データの読み出し不可 9

フラッシュ P/E モードエントリレジスタ (FENTRYR) FEKEY[7:0]=AAh P/E リードモード =00h =80h 10

プログラムサンプル 11

サンプル プログラム仕様 データフラッシュのプログラム例 DB00 ブロックの先頭の 8 バイトにテストデータを書き込みます その後 読み出してベリファイし success または error の判定をします 仕様 周辺クロック 48MHz アドレス データフラッシュメモリ DB00 ブロック 0x0123 テストデータ ( 内蔵 RAM) 0x0123 0010 0000h 0010 07FFh 0x4567 0x89AB 0xCDEF 読み出し書き込みベリファイ 0x4567 0x89AB 0xCDEF success or error 12

プログラム フローチャート リセットスタート main fld_init_fcu_ram FCU RAM へコピー スタートアップルーチン 事前準備 fld_init_pclk_notification 周辺クロック通知 P/E モード? NO YES P/E モードに変更 fld_blank_check_2kb 対象ブロックのブランクチェック ブランク? NO 消去 YES fld_erase_2kb 対象ブロックの消去 書き込み fld_program_8byte 8 バイトの書き込み fld_enable_read 読み出し許可 読み出し SUCCESS ベリファイ? OK ERROR NG 13

データフラッシュを使用するための事前準備 FCU RAM へ FCU ファームウェア格納領域をコピー FCU に周辺クロックの動作周波数を通知 14

FCU RAM へ FCU ファームウェア格納領域をコピーするフロー コピー開始 リードモード? No yes リードモードに変更 FCU RAM へアクセス許可 FCU RAM へコピー コピー終了 15

FCU RAM イネーブルレジスタ (FCURAME) KEY[7:0] = C4h 16

FCU RAM と FCU ファームウェア格納領域の位置 8K バイト コピー 8K バイト 17

main 関数 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); 事前準備 消去 // set enable to read fld_enable_read(); // verify read = (uint16_t *)top_addr_db00; verify = test_data; for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++){ if( *read++!= *verify++ ){ while(fld_error); while(fld_success); main FCU RAM へコピー 周辺クロック通知 P/Eモード? yes 対象ブロックのブランクチェック ブランク? yes 8 バイトの書き込み N o N o P/E モードに変更 対象ブロックの消去 読み出し 書き込み OK SUCCESS 読み出し許可 ベリファイ? ERROR NG 18

FCU RAM へコピーする関数 void fld_init_fcu_ram(void) { int i; static const int fcu_ram_size = 8*1024; // 8K Byte volatile uint32_t *fcu_ram = (uint32_t *)0x007F8000; const volatile uint32_t *fcu_fw = (uint32_t *)0xFEFFE000; // change to read mode if( FLASH.FENTRYR.WORD & 0x00ff ){ FLASH.FENTRYR.WORD = 0xAA00; // AAh is key // to enable an access to the FCU RAM area FLASH.FCURAME.WORD = 0xC401; // C4h is key // copy to FCU RAM form FCU F/W for( i = 0; i < fcu_ram_size/sizeof(uint32_t); i++ ){ *fcu_ram++ = *fcu_fw++; // Copy to FCU RAM form FCU F/W コピー開始リードモード? yes FCU RAMへアクセス許可 FCU RAMへコピー No リードモードに変更 コピー終了 19

FCU に周辺クロックの動作周波数を通知するフロー 通知開始 P/E モード? No yes P/E モードに変更 周辺クロック通知レジスタの設定 周辺クロック通知コマンド発行 コマンド完了待ち 動作周波数の設定 設定した値を通知 エラーチェック 通知終了 20

周辺クロック通知レジスタ (PCKAR) 周辺クロックが 35.9MHz の場合 PCKA[7:0] = 36 21

周辺クロック通知コマンド コードフラッシュ データフラッシュ共通コマンド アドレスは 4 の倍数 RA EA BA WA WDN データフラッシュの任意のアドレスブロックの任意のアドレス書き込み対象の先頭アドレスワードサイズの書き込みデータ 22

フラッシュステータスレジスタ 0(FSTATR0) 23

main 関数 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); 事前準備 消去 // set enable to read fld_enable_read(); // verify read = (uint16_t *)top_addr_db00; verify = test_data; for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++){ if( *read++!= *verify++ ){ while(fld_error); while(fld_success); main FCU RAM へコピー 周辺クロック通知 P/Eモード? yes 対象ブロックのブランクチェック ブランク? yes 8 バイトの書き込み N o N o P/E モードに変更 対象ブロックの消去 読み出し 書き込み OK SUCCESS 読み出し許可 ベリファイ? ERROR NG 24

周辺クロック通知関数 int32_t fld_init_pclk_notification(void) { // 00100000h is top address of DB00 block volatile uint8_t *addr_b = (uint8_t *)0x00100000; volatile uint16_t *addr_w = (uint16_t *)0x00100000; // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // set peripheral clock FLASH.PCKAR.BIT.PCKA = 48; // PCLK = 48 MHz 通知開始 P/E モード? yes No P/E モードに変更 // execute the peripheral clock notification command *addr_b = 0xE9; *addr_b = 0x03; *addr_w = 0x0F0F; *addr_w = 0x0F0F; *addr_w = 0x0F0F; *addr_b = 0xD0; // wait for tpcka time if( wait_frdy( 120 ) == FLD_TMOUT ){ // timeout is 120us reset_fcu(); // error check if( FLASH.FSTATR0.BIT.ILGLERR == 1 ){ return FLD_ERROR; return FLD_OK; 周辺クロック通知レジスタの設定周辺クロック通知コマンド発行コマンド完了待ちエラーチェック通知終了 25

消去方法 26

データフラッシュ消去のフロー 消去開始 P/E モード? yes No P/E モードに変更 ブランクチェック ブランク 書き込み有り 消去 消去終了 27

ブランクチェックのフロー ブランクチェック開始 ブランクチェック許可 チェックサイズの設定 ブランクチェックコマンド発行 コマンド完了待ち エラーチェック チェック結果の受け取り ブランクチェック終了 28

フラッシュモードレジスタ (FMODR) 29

データフラッシュブランクチェック制御レジスタ (DFLBCCNT) 0 0 0 0 0 0 0 1 0 先頭から数えて 1 つ目の 8 バイト領域のブランクチェックを行いたい BCADR[7:0] 00h 01h ブロック 8 バイト 8 バイト FFh 8 バイト 30

ブランクチェックコマンド データフラッシュ専用コマンド RA EA BA WA WDN データフラッシュの任意のアドレスブロックの任意のアドレス書き込み対象の先頭アドレスワードサイズの書き込みデータ 31

データフラッシュブランクチェックステータスレジスタ (DFLBCSTAT) 32

main 関数 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); 事前準備 消去 // set enable to read fld_enable_read(); // verify read = (uint16_t *)top_addr_db00; verify = test_data; for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++){ if( *read++!= *verify++ ){ while(fld_error); while(fld_success); main FCU RAM へコピー 周辺クロック通知 P/Eモード? yes 対象ブロックのブランクチェック ブランク? yes 8 バイトの書き込み N o N o P/E モードに変更 対象ブロックの消去 読み出し 書き込み OK SUCCESS 読み出し許可 ベリファイ? ERROR NG 33

ブランクチェック関数 int32_t fld_blank_check_2kb( uint32_t addr ) { volatile uint8_t *addr_b = (uint8_t *)addr; // use the blank checking command FLASH.FMODR.BIT.FRDMD = 1; // set the blank check size (2 KB) FLASH.DFLBCCNT.BIT.BCSIZE = 1; // execute the Blank checking command *addr_b = 0x71; *addr_b = 0xD0; // wait for tdbc2k time (timeout is 770us) if( wait_frdy( 700*1.1 ) == FLD_TMOUT ){ reset_fcu(); // error check if( FLASH.FSTATR0.BIT.ILGLERR == 1 ){ return FLD_ERROR; // get result of blank checking command if( FLASH.DFLBCSTAT.BIT.BCST == 0 ){ return FLD_BLANK; return FLD_NOBLANK; ブランクチェック開始ブランクチェック許可チェックサイズの設定ブランクチェックコマンド発行コマンド完了待ちエラーチェックチェック結果の受け取りブランクチェック終了 34

消去のフロー 消去開始 消去プロテクトの解除 ブロック単位の消去許可 ブロックイレーズコマンド発行 コマンド完了待ち エラーチェック 消去終了 35

フラッシュライトイレーズプロテクトレジスタ (FWEPROR) 36

データフラッシュ書き込み / 消去許可レジスタ 1(DFLWE1) KEY[7:0] = E1h 37

ブロックイレーズコマンド コードフラッシュ データフラッシュ共通コマンド RA EA BA WA WDN データフラッシュの任意のアドレスブロックの任意のアドレス書き込み対象の先頭アドレスワードサイズの書き込みデータ 38

フラッシュステータスレジスタ 0(FSTATR0) 39

main 関数 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); 事前準備 消去 // set enable to read fld_enable_read(); // verify read = (uint16_t *)top_addr_db00; verify = test_data; for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++){ if( *read++!= *verify++ ){ while(fld_error); while(fld_success); main FCU RAM へコピー 周辺クロック通知 P/Eモード? yes 対象ブロックのブランクチェック ブランク? yes 8 バイトの書き込み N o N o P/E モードに変更 対象ブロックの消去 読み出し 書き込み OK SUCCESS 読み出し許可 ベリファイ? ERROR NG 40

消去関数 int32_t fld_erase_2kb( uint32_t addr ) { volatile uint8_t *addr_b = (uint8_t *)addr; int32_t ret = FLD_OK; // Unprotect FLASH.FWEPROR.BIT.FLWE = 1; // enable to erase all blocks FLASH.DFLWE0.WORD = 0x1EFF; // 1Eh is Key FLASH.DFLWE1.WORD = 0xE1FF; // E1h is Key // execute the block erase command *addr_b = 0x20; *addr_b = 0xD0; // wait for tde2k time (timeout is 275ms) if( wait_frdy( 250*1000*1.1 ) == FLD_TMOUT ){ reset_fcu(); // Error check if( (FLASH.FSTATR0.BIT.ILGLERR == 1) (FLASH.FSTATR0.BIT.ERSERR == 1) ){ ret = FLD_ERROR; //protect and disable to erase FLASH.FWEPROR.BIT.FLWE = 2; FLASH.DFLWE0.WORD = 0x1E00; FLASH.DFLWE1.WORD = 0xE100; return ret; 消去開始消去プロテクトの解除ブロック単位の消去許可ブロックイレーズコマンド発行コマンド完了待ちエラーチェック消去終了 41

書き込み方法 42

データフラッシュ書き込みのフロー 書き込み開始 P/E モード? yes No P/E モードに変更 書き込みプロテクトの解除 ブロック単位の書き込み許可 プログラムコマンド発行 消去プロテクトの解除と共通 ブロック単位の消去許可と共通 コマンド完了待ち エラーチェック 書き込み終了 43

プログラムコマンド データフラッシュ専用コマンド 書き込みワード数 アドレスは 8 の倍数 アドレスは 128 の倍数 <8 バイト書き込み > <128 バイト書き込み > RA EA 0010 0000h 8バイト 0010 0000h 128バイト 0010 0008h 8バイト 0010 0080h 128バイト 0010 0010h 8バイト 0010 0100h 128バイト BA WA WDN データフラッシュの任意のアドレスブロックの任意のアドレス書き込み対象の先頭アドレスワードサイズの書き込みデータ 8 バイト 128 バイト 44

フラッシュステータスレジスタ 0(FSTATR0) 45

main 関数 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); 事前準備 消去 // set enable to read fld_enable_read(); // verify read = (uint16_t *)top_addr_db00; verify = test_data; for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++){ if( *read++!= *verify++ ){ while(fld_error); while(fld_success); main FCU RAM へコピー 周辺クロック通知 P/Eモード? yes 対象ブロックのブランクチェック ブランク? yes 8 バイトの書き込み N o N o P/E モードに変更 対象ブロックの消去 読み出し 書き込み OK SUCCESS 読み出し許可 ベリファイ? ERROR NG 46

書き込み関数 int32_t fld_program_8byte( uint32_t addr, uint16_t *ram ) { volatile uint8_t *addr_b = (uint8_t *)addr; volatile uint16_t *addr_w = (uint16_t *)addr; int32_t i,ret = FLD_OK; // Unprotect and enable to write all blocks FLASH.FWEPROR.BIT.FLWE = 1; FLASH.DFLWE0.WORD = 0x1EFF; // 1Eh is Key FLASH.DFLWE1.WORD = 0xE1FF; // E1h is Key // execute the 8-byte programming command *addr_b = 0xE8; *addr_b = 0x04; for(i=0; i<4; i++){ // 8-byte is 4 word size *addr_w = *ram++; *addr_b = 0xD0; // wait for tdp8 time (timeout is 2.2ms) if( wait_frdy( 2*1000*1.1 ) == FLD_TMOUT ){ reset_fcu(); // error check if( (FLASH.FSTATR0.BIT.ILGLERR == 1) (FLASH.FSTATR0.BIT.PRGERR == 1) ){ ret = FLD_ERROR; //protect and disable to write FLASH.FWEPROR.BIT.FLWE = 2; FLASH.DFLWE0.WORD = 0x1E00; FLASH.DFLWE1.WORD = 0xE100; return ret; 書き込み開始 No P/Eモード? yes P/Eモードに変更書き込みプロテクトの解除 mainで実施ブロック単位の書き込み許可プログラムコマンド発行コマンド完了待ちエラーチェック書き込み終了 47

読み出し方法 48

データフラッシュ読み出しのフロー 読み出し開始 リードモード? No yes リードモードに変更 読み出し許可 読み出し 読み出し終了 49

データフラッシュ読み出し許可レジスタ 0(DFLRE0) KEY[7:0] = 2Dh 50

main 関数 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); 事前準備 消去 // set enable to read fld_enable_read(); // verify read = (uint16_t *)top_addr_db00; verify = test_data; for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++){ if( *read++!= *verify++ ){ while(fld_error); while(fld_success); main FCU RAM へコピー 周辺クロック通知 P/Eモード? yes 対象ブロックのブランクチェック ブランク? yes 8 バイトの書き込み N o N o P/E モードに変更 対象ブロックの消去 読み出し 書き込み OK SUCCESS 読み出し許可 ベリファイ? ERROR NG 51

読み出し許可関数 int32_t fld_enable_read(void) { // change to read mode if( FLASH.FENTRYR.WORD & 0x00ff ){ FLASH.FENTRYR.WORD = 0xAA00; // AAh is key // enable to read all blocks FLASH.DFLRE0.WORD = 0x2DFF; // 2Dh is Key FLASH.DFLRE1.WORD = 0xD2FF; // D2h is Key 読み出し開始 リードモード? yes No リードモードに変更 return FLD_OK; 読み出し許可 読み出し 読み出し終了 main で実施 52

FCU のリセット 53

コマンド完了待ちのタイムアウトと FCU のリセットのフロー コマンド発行 No コマンド完了? タイムアウト? yes yes No エラーチェック FCU のリセット 終了 54

データフラッシュの電気的特性 55

タイムアウト時間 コマンド タイムアウト時間 ブランクチェックコマンド (8バイト) tdbc8 1.1 ブランクチェックコマンド (2Kバイト) tdbc2k 1.1 ブロックイレーズコマンド tde2k 1.1 プログラムコマンド (8バイト書き込み) tdp8 1.1 プログラムコマンド (128バイト書き込み) tdp128 1.1 周辺クロック通知コマンド tpcka tpcka:pclk=50mhz の場合 60μs PCLK=25MHz の場合 120μs 56

コマンド完了待ちをする関数 ( 例 ) 周辺クロックコマンドのコマンド完了待ち int32_t fld_init_pclk_notification(void) { : // wait for tpcka time if( wait_frdy( 120 ) == FLD_TMOUT ){ // timeout is 120us reset_fcu(); : ( 例 ) プログラムコマンドのコマンド完了待ち int32_t fld_program_8byte( uint32_t addr, uint16_t *ram ) { : // wait for tdp8 time (timeout is 2.2ms) if( wait_frdy( 2*1000*1.1 ) == FLD_TMOUT ){ reset_fcu(); : No コマンド完了? タイムアウト? yes yes エラーチェック FCUのリセット No 終了 57

FCU のリセットのフロー FCU のリセット開始 ソフトウェアリセット wait リセット解除 FCU のリセット終了 58

フラッシュリセットレジスタ (FRESETR) FRKEY[7:0] = CCh 59

制御信号タイミングの電気的特性 60

FCU のリセット関数 static void reset_fcu(void) { volatile int32_t w; // FCU reset FLASH.FRESETR.BIT.FRESET = 1; // wait for tresw2 time (tresw2 is 35us) wait_35usec(); // clear FCU reset FLASH.FRESETR.BIT.FRESET = 0; FCUのリセット開始ソフトウェアリセット wait リセット解除 FCU のリセット終了 61

プログラムサンプルのカスタマイズ 62

ブロックの変更 void main(void) { // 00100000h is top address of DB00 block uint32_t top_addr_db00 = 0x00100000; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db00 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db00 ); // 8byte programming fld_program_8byte( top_addr_db00, test_data ); ( 読み出しは省略 ) void main(void) { // 00100800h is top address of DB01 block uint32_t top_addr_db01 = 0x00100800; volatile uint16_t *read; volatile uint16_t *verify; int i; // copy to FCU RAM from FCU F/W fld_init_fcu_ram(); // peripheral clock notification fld_init_pclk_notification(); // change to P/E mode if( (FLASH.FENTRYR.WORD & 0x00ff)!= 0x0080 ){ FLASH.FENTRYR.WORD = 0xAA80; // AAh is key // blank check (2 KB) if( fld_blank_check_2kb( top_addr_db01 )!= FLD_BLANK ){ // block erase fld_erase_2kb( top_addr_db01 ); // 8byte programming fld_program_8byte( top_addr_db01, test_data ); ( 読み出しは省略 ) 63

ブランクチェックサイズの変更 int32_t fld_blank_check_2kb( uint32_t addr ) { volatile uint8_t *addr_b = (uint8_t *)addr; // use the blank checking command FLASH.FMODR.BIT.FRDMD = 1; // set the blank check size (2 KB) FLASH.DFLBCCNT.BIT.BCSIZE = 1; // execute the Blank checking command *addr_b = 0x71; *addr_b = 0xD0; // wait for tdbc2k time (timeout is 770us) if( wait_frdy( 700*1.1 ) == FLD_TMOUT ){ reset_fcu(); // error check if( FLASH.FSTATR0.BIT.ILGLERR == 1 ){ return FLD_ERROR; // get result of blank checking command if( FLASH.DFLBCSTAT.BIT.BCST == 0 ){ return FLD_BLANK; return FLD_NOBLANK; int32_t fld_blank_check_8b( uint32_t addr, uint8_t offset) { volatile uint8_t *addr_b = (uint8_t *)addr; // use the blank checking command FLASH.FMODR.BIT.FRDMD = 1; // set the blank check size (8B) FLASH.DFLBCCNT.BIT.BCSIZE = 0; FLASH.DFLBCCNT.BIT.BCADR = offset; // execute the Blank checking command *addr_b = 0x71; *addr_b = 0xD0; // wait for tdbc8 time (timeout is 33us) if( wait_frdy( 30*1.1 ) == FLD_TMOUT ){ reset_fcu(); // error check if( FLASH.FSTATR0.BIT.ILGLERR == 1 ){ return FLD_ERROR; // get result of blank checking command if( FLASH.DFLBCSTAT.BIT.BCST == 0 ){ return FLD_BLANK; return FLD_NOBLANK; 64

書き込みサイズの変更 int32_t fld_program_8byte( uint32_t addr, uint16_t *ram ) { volatile uint8_t *addr_b = (uint8_t *)addr; volatile uint16_t *addr_w = (uint16_t *)addr; int32_t i,ret = FLD_OK; // Unprotect and enable to write all blocks FLASH.FWEPROR.BIT.FLWE = 1; FLASH.DFLWE0.WORD = 0x1EFF; // 1Eh is Key FLASH.DFLWE1.WORD = 0xE1FF; // E1h is Key // execute the 8-byte programming command *addr_b = 0xE8; *addr_b = 0x04; for(i=0; i<4; i++){ // 8-byte is 4 word size *addr_w = *ram++; *addr_b = 0xD0; // wait for tdp8 time (timeout is 2.2ms) if( wait_frdy( 2*1000*1.1 ) == FLD_TMOUT ){ reset_fcu(); // error check if( (FLASH.FSTATR0.BIT.ILGLERR == 1) (FLASH.FSTATR0.BIT.PRGERR == 1) ){ ret = FLD_ERROR; //protect and disable to write FLASH.FWEPROR.BIT.FLWE = 2; FLASH.DFLWE0.WORD = 0x1E00; FLASH.DFLWE1.WORD = 0xE100; return ret; int32_t fld_program_128byte( uint32_t addr, uint16_t *ram ) { volatile uint8_t *addr_b = (uint8_t *)addr; volatile uint16_t *addr_w = (uint16_t *)addr; int32_t i,ret = FLD_OK; // Unprotect and enable to write all blocks FLASH.FWEPROR.BIT.FLWE = 1; FLASH.DFLWE0.WORD = 0x1EFF; // 1Eh is Key FLASH.DFLWE1.WORD = 0xE1FF; // E1h is Key // execute the 8-byte programming command *addr_b = 0xE8; *addr_b = 0x40; for(i=0; i<64; i++){ //128-byte is 64 word size *addr_w = *ram++; *addr_b = 0xD0; // wait for tdp128 time (timeout is 5.5ms) if( wait_frdy( 5*1000*1.1 ) == FLD_TMOUT ){ reset_fcu(); // error check if( (FLASH.FSTATR0.BIT.ILGLERR == 1) (FLASH.FSTATR0.BIT.PRGERR == 1) ){ ret = FLD_ERROR; //protect and disable to write FLASH.FWEPROR.BIT.FLWE = 2; FLASH.DFLWE0.WORD = 0x1E00; FLASH.DFLWE1.WORD = 0xE100; return ret; 65

END ルネサスエレクトロニクス株式会社