OV7670を使ったバーコード・リーダーのコードを公開するべく作業中です。普段はCrossWorks for ARMを使っているのですが、評価版は30日間の期限付きなので普通の人が使うには、ちょっと不便です。そこで、期限の制約のないIDE評価版を調べてみると、当然のことながらKeilやIARが浮上してきました。DWMにADuC7026が付録としてついた時にKeilを使ったことがあり、少しは慣れ親しんでいるのでKeilを使うことに。当時はKeilは16KBのコードサイズ制限があり、IARは32KBだったと記憶しているのですが、今はKeilも32KBになっているのですね。
![](https://blogimg.goo.ne.jp/user_image/02/4f/5710efc36637f18188befdeb664c0a0e.png)
当然のことながら、KeilでもATMEL SAM3Sがターゲットデバイスとして含まれているので、プロジェクトを作成する際にデバイス指定を行えば、ディフォルトのスタートアップを用意してくれますし、サンプルプロジェクトもいくつかあるので、そのコードをベースに作業を開始できます。と、まぁ出足は良さそうに思われたのですが、それもしばらくしてくじかれることになりました。
その原因はやはり、ヘッダーファイルです。Keil MDK-Liteは V4.23を使っているのですが、これに含まれるSAM3Sのヘッダーがちょっと古いのです。パラレルキャプチャのDMA関連レジスタの定義が入っていないし、各種レジスタのフィールド定義がちゃんとなされていなかったり。ヘッダーファイルはATMEL由来のものなので、Keilが悪いわけではないのですが、残念ながら2009年の版でありチト古い。ATMELが最初からちゃんとしたファイルを出していればこんな問題は発生しないわけですが、Keilがファイルを更新できていないところがSAM3Sの人気の無さを暗示しているようで、すこし寂しいですね。
サンプルに含まれていたsystem_SAM3S.cを使えば、スタートアップ時のクロック関連の設定を上図に示したようにConfiguration Wizardを使って行えるので、とっても楽チンです。が、しかし、PCK0の設定をおこなってみるとコンパイル時にエラーとなります。調べてみると、参照しているレジスタ名がヘッダーファイルでの定義と一致していません。想像するに、どこかの段階でヘッダファイルを更新した際に名前が変わったんじゃないでしょうか?そうとは知らずに、sysem_SAM3S.cは更新されないままということなのでしょう。これもまた、ヘッダーファイルに起因する問題なわけです。
そんなこんなでレジスタ名を変更したりして問題を解決しているのですが、USBのコードを変更する作業が必要なことに気づいて作業を中断。これまでは、CrossWorksが提供するCTLというライブラリを使うことで、マルチタスクでソフト書いていたのですが、Keil評価版にはそんな結構なものは含まれていません。これまではUSBのCDCのスタックをひとつのタスクとして実装していたので、タスクが使えないとなるとコードのロジックを変更せざるをえません。タスクを使うことに慣れている身としては、こういう処理をスーパーループで記述するなんて、ものスゴーく面倒に思えてなりません。
ちなみにUSB CDCは、読み取ったバーコードの値を仮想COMポート経由でPCに伝える機能を持たせるのに使います。
![](https://blogimg.goo.ne.jp/user_image/02/4f/5710efc36637f18188befdeb664c0a0e.png)
当然のことながら、KeilでもATMEL SAM3Sがターゲットデバイスとして含まれているので、プロジェクトを作成する際にデバイス指定を行えば、ディフォルトのスタートアップを用意してくれますし、サンプルプロジェクトもいくつかあるので、そのコードをベースに作業を開始できます。と、まぁ出足は良さそうに思われたのですが、それもしばらくしてくじかれることになりました。
その原因はやはり、ヘッダーファイルです。Keil MDK-Liteは V4.23を使っているのですが、これに含まれるSAM3Sのヘッダーがちょっと古いのです。パラレルキャプチャのDMA関連レジスタの定義が入っていないし、各種レジスタのフィールド定義がちゃんとなされていなかったり。ヘッダーファイルはATMEL由来のものなので、Keilが悪いわけではないのですが、残念ながら2009年の版でありチト古い。ATMELが最初からちゃんとしたファイルを出していればこんな問題は発生しないわけですが、Keilがファイルを更新できていないところがSAM3Sの人気の無さを暗示しているようで、すこし寂しいですね。
サンプルに含まれていたsystem_SAM3S.cを使えば、スタートアップ時のクロック関連の設定を上図に示したようにConfiguration Wizardを使って行えるので、とっても楽チンです。が、しかし、PCK0の設定をおこなってみるとコンパイル時にエラーとなります。調べてみると、参照しているレジスタ名がヘッダーファイルでの定義と一致していません。想像するに、どこかの段階でヘッダファイルを更新した際に名前が変わったんじゃないでしょうか?そうとは知らずに、sysem_SAM3S.cは更新されないままということなのでしょう。これもまた、ヘッダーファイルに起因する問題なわけです。
そんなこんなでレジスタ名を変更したりして問題を解決しているのですが、USBのコードを変更する作業が必要なことに気づいて作業を中断。これまでは、CrossWorksが提供するCTLというライブラリを使うことで、マルチタスクでソフト書いていたのですが、Keil評価版にはそんな結構なものは含まれていません。これまではUSBのCDCのスタックをひとつのタスクとして実装していたので、タスクが使えないとなるとコードのロジックを変更せざるをえません。タスクを使うことに慣れている身としては、こういう処理をスーパーループで記述するなんて、ものスゴーく面倒に思えてなりません。
ちなみにUSB CDCは、読み取ったバーコードの値を仮想COMポート経由でPCに伝える機能を持たせるのに使います。