今頃になってなんですが、LPC2388のcclkを72MHzに変更してみました。これまでは57.6MHzだったのですが、それとて特別な理由があって選択した理由があったわけでもなく、Interface誌に掲載されていたどれかの記事のサンプルからクロック初期化部分を拝借した結果、そうなっていただけのことです。57.6MHzでも何不自由があるわけでもないのですが、どうせなら72MHzでの動作確認もとっておこうと思った次第です。
クロック初期化部分を変更しただけでビルドしてみると、シリアルポートの出力が文字化けしてしまいました。ボーレートの設定はPCLKから計算してあったのですが、UnFDRを使わずにUnDLM/UnDLLの設定だけで済ませていたのが原因でした。確認のために115200bpsを生成する場合を計算してみると
ここで、divisor = pclk/16/115200 です。divisorの値を四捨五入せずに切り捨ててDLの整数値を求めていたので、かなり誤差が大きくなっていました。切り上げてDLとして10を使っても動作したと思いますが、せっかくなので上記のDivAddValとMulValでUnFDRを設定しておきました。
DivAddValとMulValの算出はちょっと面倒ですね。わたしはNXPが提供しているExcelシートを使って求めてしまいました。AT91SAM7にも同様にFractional baud rateの機能があるのですが、こちらの方が設定は簡単だと感じました。
クロック初期化部分を変更しただけでビルドしてみると、シリアルポートの出力が文字化けしてしまいました。ボーレートの設定はPCLKから計算してあったのですが、UnFDRを使わずにUnDLM/UnDLLの設定だけで済ませていたのが原因でした。確認のために115200bpsを生成する場合を計算してみると
cclk | pclk | divisor | DL | DivAddVal | MulVal | Baud |
---|---|---|---|---|---|---|
57.6MHz | 28.8MHz | 15.625 | 15 | 0 | 0 | 120000 |
72.0MHz | 18.0MHz | 9.765 | 9 | 0 | 0 | 125000 |
72.0MHz | 18.0MHz | 9.765 | 8 | 2 | 9 | 115056 |
ここで、divisor = pclk/16/115200 です。divisorの値を四捨五入せずに切り捨ててDLの整数値を求めていたので、かなり誤差が大きくなっていました。切り上げてDLとして10を使っても動作したと思いますが、せっかくなので上記のDivAddValとMulValでUnFDRを設定しておきました。
DivAddValとMulValの算出はちょっと面倒ですね。わたしはNXPが提供しているExcelシートを使って求めてしまいました。AT91SAM7にも同様にFractional baud rateの機能があるのですが、こちらの方が設定は簡単だと感じました。