組込み系システム開発室by藤原技研M

製作中の組込み機器や気になる開発ツールなどを中心に記事を書いています。

PIC24FJ用ブートローダ (boot loader)の作成(1)

ブートローダとは】

マイコンを起動した時に、ある特定の条件(スイッチを押しているなど)で呼び出しするプログラムのことで、今回は、そのプログラムに、USB経由で受信したファームウェアで自分自身を書き換える機能を搭載します。

 

【目的】

①授業でPICマイコンを使用するのですが、PICkit3(約5千円)の人数分の費用がかかります。そこで、PICkit3を用いずにUSB経由でファームウェアを書き換えることでコスト削減を図ります。

②新製品SoundVarioWithGPSのファームウェアのアップデートをユーザーができるようにするためです。

 

【課題】

コンパイラ(XC16)の問題

 マイコン内部のレジスタを制御するにはProバージョンが必要であることが判明しました。そこで、XC16をアンインストールし、再度XC16(Ver1.31)をインストールする時にフリーのPro版を選択しインストールをしました。2ヶ月間はフリーで使えます。

xc16-v1.31-full-install-windows-installer.exe

f:id:fujiharagiken:20181011224245p:plain

 

f:id:fujiharagiken:20181011225028p:plain

 

f:id:fujiharagiken:20181012194821p:plain

 

f:id:fujiharagiken:20181012194846p:plain

このbatを実行するとOKです。

 

※Ver1.31をインストールすると、旧のVer.1.24もPro版になりました。

 

②クロックの問題 

 内部の発振回路でUSB用の96MHzのクロックを作成するのですが、内部発振回路には誤差があるのでキッチリ96MHzにならないという懸念ああります。とりあえず回路図に発振回路を入れておいて、精度が問題になったらこの発振回路を使用することにします。

 

ブートローダ使用時のメモリマッピング

 今回は、プログラムの起動時にブートローダ部を挿入しないといけません。従ってコンパイルして出来たオブジェクトを配置するリンカーの定義が必要です。PICマイコンの場合は、.gldファイルで定義し、開発環境に登録することで可能となります。

→プロジェクトの下 Linker Files を右クリックしてAdd Existing Itemでgldを選びます。

gldファイルは

 C:\Program Files (x86)\Microchip\xc16\v1.31\support\PIC24F\gld\

の下にあります。これを修正し使用します。ただし、__BOOTLOADERの定義参照をしているので以下の設定が必要です。

Project Properties > xc16-ld > Symbols & Macros > Define Linker macros

に__BOOTLOADERを追加します。

f:id:fujiharagiken:20180216113208p:plain

 

 

64KBと128KBのマップは次の通りです。

 

                  【64KB】

(アドレス)(内容)

    0          ----------------------

 

0x400      ----------------------

                 ブートローダ(4KB)

     ※スイッチの条件を判定し真ならプートローダを実行、偽なら0x1400へ飛ぶ

                          ※128KBの時は0x1800へ飛ぶ

                ----------------------

                         空き                                 【128KBの時】

0x1400     ----------------------                           → 0x1800

                 JMP 0x14C0                                → JMP 0x18C0

  

0x14C0     ----------------------                           → 0x18C0

                              ↑

                             |

                 ユーザープログラム

                             |

                              ↓

0xA800     ----------------------        【128KBの時】

0xABF8    ----------------------                           → 0x157F8

      FLASH CONFIG4

0xABFA    ----------------------                           → 0x157FA

      FLASH CONFIG3

0xABFC    ----------------------                           → 0x157FC

      FLASH CONFIG2

0xABFE    ----------------------                           → 0x157FE

      FLASH CONFIG1

0xAC00    ----------------------                           → 0x15800

                             |

                             |

                             |

0xF80000 ----------------------

      DEVICE CONFIG4

0xF80002 ----------------------

      DEVICE CONFIG3

0xF80004 ----------------------

      DEVICE CONFIG2

0xF80004 ----------------------

      DEVICE CONFIG1

                             |

 0xF80010 ----------------------

 

※リンカーエラーが発生

 Ver1.30以降で発生するので、今回はVer1.24を使用することにします。

 Ver1.30以降で使用する場合は gldファイルの

           CRT1_STARTUP(crt1_standard.o) の次の行に

           CRT_STARTMODE(crt_start_mode_normal.o) を追加すれば直ります。

 

コンパイル時、_CONFIG1~4で警告が発生(Ver1.31)

 以前のバージョン(Ver1.24)では問題ありませんでしたが、新しいバージョンではCONFIGの記述方法が変更になっています。変換ツールは

 MPLABX IDE > Window > PIC Memory Views > Configuration Bits

で各CONFIGの設定をし、Generate Source Code toボタンをクリックすると#pragma形式に変換してくれます。表示されたコードをソースコードに貼り付けることで対処できます。

 →今回はVer1.24を使用するので問題ありません。

 

続きは(2)へ http://fujiharagiken.hatenablog.com/entry/2017/10/03/130302