[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
PIC32MXフラッシュ読み書き
136
: 15/02/12-18:01
Kuro

PIC32MXのフラッシュメモリの読み書きを試行しているのですが、
単純な読み書きサンプルコードが動作せずに困っています。
以下2点についてご教授いただけないでしょうか。

<各種環境>
マイコン:PIC32MX795F512L 
 (オプティマイズさんのPIC32基板を使用)
プログラマ/デバッガ:ICD3
プログラミング環境:MPLAB X IDE v2.10
コンパイラ:X32
参考書籍:「高速・多機能を実現するPIC32MX活用ガイドブック」
(参考書籍内で使用してるPICは、PIC32MX340FxxxHのようです)

<質問1> アドレス指定は物理アドレス?それとも仮想アドレス?
書き込みにはC言語ライブラリのNVMWriteWord関数を、読み込みにはmemcpy関数を使用したいと思っています。
前述参考書籍のサンプルプログラム内では、
#define NVM_PROGRAM_PAGE 0xbd008000
とした上で、書き込み時は
NVMWriteWord((void*)(NVM_PROGRAM_PAGE), 0x12345678);
としています。
また、読み込み時は
unsigned char bData[8];
unsigned int Offset = 0;
memcpy(bData, (void *)NVM_PROGRAM_PAGE + Offset, 8);
として、バッファbDataに8byte分のデータを読み込んでいるようです。

ここで、NVM_PROGRAM_PAGE = 0xbd008000は値から判断するに、物理アドレスであると思います。
NVMWriteWordに渡すアドレスは物理アドレス、仮想アドレスのどちらを渡すのが正しいでしょか?
を指定してると考えて正しいでしょうか?
参考書籍では物理アドレスを渡す、
http://www.picfun.com/PIC32MX/PIC32Periframe.html
では仮想アドレスを渡すと書いてありますが…

また、memcpy関数に渡すアドレスは物理アドレスと仮想アドレスのどちらを渡すのが正しいのでしょうか?


<質問2> BMXPUPBAレジスタの設定
参考書籍のサンプルプログラムには、BMXPUPBAレジスタを設定している箇所が見つかりませんでした。
事前のBMXPUPBAレジスタへの書き込みせず、NVM_PROGRAM_PAGE = 0xbd008000は使用できるのでしょうか?
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: PIC32MXフラッシュ読み書き
139
: 15/02/17-09:59
Gokan <gokan@picfun.com>

PIC32ではプログラム実行時はすべて仮想アドレスです。

BMXPUPBAレジスタは初期化でデフォルト値の0になります。

詳しい例題が下記XC32のHelpにありますので参考にしてください。

C:\Program Files\Microchip\xc32\v1.33\docs\pic32-lib-help

         以上


> PIC32MXのフラッシュメモリの読み書きを試行しているのですが、
> 単純な読み書きサンプルコードが動作せずに困っています。
> 以下2点についてご教授いただけないでしょうか。
>
> <各種環境>
> マイコン:PIC32MX795F512L 
>  (オプティマイズさんのPIC32基板を使用)
> プログラマ/デバッガ:ICD3
> プログラミング環境:MPLAB X IDE v2.10
> コンパイラ:X32
> 参考書籍:「高速・多機能を実現するPIC32MX活用ガイドブック」
> (参考書籍内で使用してるPICは、PIC32MX340FxxxHのようです)
>
> <質問1> アドレス指定は物理アドレス?それとも仮想アドレス?
> 書き込みにはC言語ライブラリのNVMWriteWord関数を、読み込みにはmemcpy関数を使用したいと思っています。
> 前述参考書籍のサンプルプログラム内では、
> #define NVM_PROGRAM_PAGE 0xbd008000
> とした上で、書き込み時は
> NVMWriteWord((void*)(NVM_PROGRAM_PAGE), 0x12345678);
> としています。
> また、読み込み時は
> unsigned char bData[8];
> unsigned int Offset = 0;
> memcpy(bData, (void *)NVM_PROGRAM_PAGE + Offset, 8);
> として、バッファbDataに8byte分のデータを読み込んでいるようです。
>
> ここで、NVM_PROGRAM_PAGE = 0xbd008000は値から判断するに、物理アドレスであると思います。
> NVMWriteWordに渡すアドレスは物理アドレス、仮想アドレスのどちらを渡すのが正しいでしょか?
> を指定してると考えて正しいでしょうか?
> 参考書籍では物理アドレスを渡す、
> http://www.picfun.com/PIC32MX/PIC32Periframe.html
> では仮想アドレスを渡すと書いてありますが…
>
> また、memcpy関数に渡すアドレスは物理アドレスと仮想アドレスのどちらを渡すのが正しいのでしょうか?
>
>
> <質問2> BMXPUPBAレジスタの設定
> 参考書籍のサンプルプログラムには、BMXPUPBAレジスタを設定している箇所が見つかりませんでした。
> 事前のBMXPUPBAレジスタへの書き込みせず、NVM_PROGRAM_PAGE = 0xbd008000は使用できるのでしょうか?
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: PIC32MXフラッシュ
146
: 15/02/19-17:00
Kuro

ご返信ありがとうございました。

1.アドレスの件
>PIC32ではプログラム実行時はすべて仮想アドレスです。
という事は、
・NVMWriteWordへ渡すアドレス
・memcpyへ渡すアドレス
・NVM_PROGRAM_PAGE = 0xbd008000
は全て仮想アドレスという事ですね。

2.BMXPUPBAレジスタに関しては初期値0が有効になるという事で理解致しました。

3.ヘルプファイルの情報ありがとうございました。
ヘルプ内のサンプルでも、
#define NVM_PROGRAM_PAGE 0xbd008000
と同じアドレスが使われていますね。参考にします。

4.PIC32のリファレンスマニュアルのP5-5ページを読むと、
http://ww1.microchip.com/downloads/jp/DeviceDoc/61121F_JP.pdf
でNVMADDRレジスタの説明で、
「5.2.3 NVMADDR レジスタ
NVM アドレスレジスタでは、フラッシュメモリのプログラミング位置 ( 行書き込みの場合は行
を選択、ワード書き込みの場合はアドレスを指定)または消去するページアドレスを選択します。
Note: NVM アドレスレジスタには、フラッシュメモリの ( 仮想アドレスではなく ) 物理
アドレスを読み込む必要があります。」
とあります。
前述のプログラム実行時は全て仮想アドレスであれば、どうやって物理アドレスをNVMADDRに渡すのでしょうか。。


> PIC32ではプログラム実行時はすべて仮想アドレスです。
>
> BMXPUPBAレジスタは初期化でデフォルト値の0になります。
>
> 詳しい例題が下記XC32のHelpにありますので参考にしてください。
>
> C:\Program Files\Microchip\xc32\v1.33\docs\pic32-lib-help
>
>          以上
>
>
> > PIC32MXのフラッシュメモリの読み書きを試行しているのですが、
> > 単純な読み書きサンプルコードが動作せずに困っています。
> > 以下2点についてご教授いただけないでしょうか。
> >
> > <各種環境>
> > マイコン:PIC32MX795F512L 
> >  (オプティマイズさんのPIC32基板を使用)
> > プログラマ/デバッガ:ICD3
> > プログラミング環境:MPLAB X IDE v2.10
> > コンパイラ:X32
> > 参考書籍:「高速・多機能を実現するPIC32MX活用ガイドブック」
> > (参考書籍内で使用してるPICは、PIC32MX340FxxxHのようです)
> >
> > <質問1> アドレス指定は物理アドレス?それとも仮想アドレス?
> > 書き込みにはC言語ライブラリのNVMWriteWord関数を、読み込みにはmemcpy関数を使用したいと思っています。
> > 前述参考書籍のサンプルプログラム内では、
> > #define NVM_PROGRAM_PAGE 0xbd008000
> > とした上で、書き込み時は
> > NVMWriteWord((void*)(NVM_PROGRAM_PAGE), 0x12345678);
> > としています。
> > また、読み込み時は
> > unsigned char bData[8];
> > unsigned int Offset = 0;
> > memcpy(bData, (void *)NVM_PROGRAM_PAGE + Offset, 8);
> > として、バッファbDataに8byte分のデータを読み込んでいるようです。
> >
> > ここで、NVM_PROGRAM_PAGE = 0xbd008000は値から判断するに、物理アドレスであると思います。
> > NVMWriteWordに渡すアドレスは物理アドレス、仮想アドレスのどちらを渡すのが正しいでしょか?
> > を指定してると考えて正しいでしょうか?
> > 参考書籍では物理アドレスを渡す、
> > http://www.picfun.com/PIC32MX/PIC32Periframe.html
> > では仮想アドレスを渡すと書いてありますが…
> >
> > また、memcpy関数に渡すアドレスは物理アドレスと仮想アドレスのどちらを渡すのが正しいのでしょうか?
> >
> >
> > <質問2> BMXPUPBAレジスタの設定
> > 参考書籍のサンプルプログラムには、BMXPUPBAレジスタを設定している箇所が見つかりませんでした。
> > 事前のBMXPUPBAレジスタへの書き込みせず、NVM_PROGRAM_PAGE = 0xbd008000は使用できるのでしょうか?
▲pagetop

- WebForum -