LPC1114FN28/102 (6)
外付けディジタル・オーディオ DAC および内蔵タイマを PWM DAC として使って約 440 Hz の正弦波を発生させる前回のプログラムを、LPCXpresso IDE でビルドして動作させることができました。
トラ技 2012 年 10 月号付属の DVD-ROM に収録されている LPCXpresso IDE V4.2.3 をインストールしただけのアクティベーションしていない 8K 制限のある状態で試してみました。
ただし、前回の記事の当初のソース・プログラムではメイン・ルーチンと割り込みハンドラとの間のデータの受け渡しを行うグローバル変数 (dac_update_flag, dac_buf[], pwm_buf[]) に「volatile」を付け忘れていて、コンパイラの最適化レベルを上げると正常に動作しなくなる問題がありました。
前回の記事のソース・プログラム・リストには、すでに修正を行ってあります。
また、Keil/ARM MDK-Lite uVision4 でコンパイルした結果の HEX ファイルを下に示します。
:020000040000FA :1000000018020010250100002D0100002F01000042 :1000100000000000000000000000000000000000E0 :10002000000000000000000000000000310100009E :100030000000000000000000330100003501000056 :1000400037010000370100003701000037010000D0 :1000500037010000370100003701000037010000C0 :1000600037010000370100003701000037010000B0 :1000700037010000370100003701000037010000A0 :100080003701000041010000370100003701000086 :100090003701000037010000370100003701000080 :1000A0003701000037010000370100003701000070 :1000B0003701000037010000370100003701000060 :1000C0000348854600F0EEF8004800472302000090 :1000D0001802001070B4104800240460012343602B :1000E000446043604168C907FCD00C4923228A6000 :1000F0000B4A956B8026B5439563CA68D207FCD03E :1001000003210163436344634363416BC907FCD02C :10011000836370BC7047000040800440008004404E :10012000008204400448804704480047FEE7FEE799 :10013000FEE7FEE7FEE7FEE7D5000000C100000095 :1001400010B44A480168090710D501680822114314 :100150000160C06B4749C207454809D0464A474B32 :100160001468DC6152685A620068886010BC70478D :100170004068886042490120086010BC704770B434 :10018000414B404A186801210904084318603F495F :10019000C224CC64F9200866D92048663C48C325AF :1001A00005604461F1244462C12484628C630224AA :1001B000046318681D21090208431860506801256E :1001C0002843506029494C6000224A60CA600A678F :1001D000FF20F43048628D613020C86340014861DF :1001E000264844604260C26002672A4E0662FF26CB :1001F000F536C66146620A264667802646614E6825 :100200002E434E604168294341601A485D6122498E :10021000016042600461446020492004086070BCB1 :100220007047FF250024ED01FFF7A9FF144B0027BD :100230001B4811491E1D1A68002AFCD03B2262434C :100240009212AD1A3B226A4392121419E3229200D1 :100250001F60624312147560121834600A60E32252 :1002600092006A43121412184A60E4E70000014049 :1002700004000010000004400C0000100080014049 :1002800000000010008004408080044000400440D2 :1002900080400440E70300000F07000000E100E099 :1002A00022020000064C0125064E05E02046E368C8 :1002B00007C82B4398471034B442F7D3FFF704FF25 :1002C000000300002003000002E008C8121F08C15C :1002D000002AFAD170477047002001E001C1121FC7 :1002E000002AFBD170470000000000000000000061 :1002F000000000000000000000000000FFFFFFFF02 :10030000200300000000001014000000C8020000DC :10031000340300001400001004020000D8020000A2 :1003200000000000000000000000000000000000CD :0403300000000000C9 :0400000500000125D1 :00000001FF
12 MHz 内部 RC オシレータ (IRC) を使う設定になっています。
フラッシュ・サイズは 0x334 = 820 バイトです。
このオブジェクトでは、例外ベクタ 7 に置かれるべきチェックサムの値が未設定なので、このデータをその通りにフラッシュに書き込むとユーザ・プログラムが起動せずに ISP (ブートローダ) が起動してしまいます。
もちろん、「Flash Magic」を使って書き込めば、チェックサム計算は自動で行われ、正しい値に置き換えられて書き込まれます。
uVision4 の最適化の設定は次のようにしました。
Project / Options for Target ... ダイアログの Target タブの Code Generation グループで、
Use Cross Module Optimization
Use MicroLIB
にチェックを入れ、C/C++ タブの Language/Code Generation グループの
Optimization: Level 3 (-O3)
Optimize for Time
と設定しました。