何か部品が足らないのか。ハードの問題は別として、これでうまく行ったと思ったら、そうは問屋が卸さなかった。時刻の設定をする受信関数が、がんとしてデータを読まない。自信がないので、プログラムの頭でテストステートメントを挿入してみた。時刻設定の入力では、受信データのフラグがあがらない。それにしても、UARTぐらいの機能で、このソースの複雑さは何だ。読みにくいことおびただしい、と悪態をつきながらデバッグする。最適化が原因かと思ってループに、NOP_Processなどを入れるが変わらない。UARTなら、このあいだのGNUサンプルソースにもあった。こちらは至極簡単なソースだ。こいつを持ってきて動かすが、これも駄目。原因はUARTではなかった。あっけない幕切れ(6/5/09)UART受信が出来ない。本質と関係のないところでつまずいている。RTC不調も電池でない可能性が強い。電源を入れたままリセットをすると、RTCの初期化が途中で止まる。UARTの方は、その後ステータスレジスターを問題のところで出力させ不正なビットが立っていないことを確認した。UARTがハングの原因ではなさそうだ。LEDとUART出力を処理の始めから、少しづつ挿入し、ハングアップするステートメントを探していった。その結果、RTCの割込みをenableするところでハングすることがわかる。RTC割込みがおかしい。試しに割込みルーチンにLEDを点灯するステートメントを入れるが、点かない。デモソースのバグは考えられないので、これは明らかに、Dfuのためにずらしたプログラムのエントリーアドレスが、ベクターテーブルに反映されていないことを物語る。ソースの何処を探しても、テーブルのアドレスを設定するところはない。ベクターテーブルは、リンカーの最初のプログラムのスタートアドレスから相対的に展開しているからだ(これが大きな勘違い)。すると、リンカースクリプトか、スタートアップルーチンか。ここは良く分からないところで手が出せない。思い余って、最近お世話になっている「ねむい」さんが、RTCを動かしたと言うので、質問しようかとページを開いたら、ソースを公開されている。質問する前に調べてみようとありがたくソースを頂く。(会社ではダウンロードできなかった)おお、このソースは情報の宝庫だ。ユーザープログラムで割込みを止めるステートメントもある。ベクターテーブルを設定するところは、どこだ。あ、あ、あ、なーんだ。明示的に設定するのだ。0x3000);早速、このステートメントを追加し、コンパイルしなおす。