ブログ - LPC8xxのボーレート

LPC8xxのボーレート

カテゴリ : 
雑記
2014-12-11 18:46
NXP LPC824と戯れているウチにボーレートの設定に疑問が出てきてしまった。

LPCXpressoはサンプルやライブラリも一緒に提供してくれるのでお気楽なのだが、いかんせんXpresso MAX用の設定がわんさとあって自前のものに移管させる際に結構ハマる。
普通LPCOpenのライブラリを使ってくれる事を期待しているのだろうと思い、それを無意識に使うと案の定といった感じ。とは言うもののソースがあるので、十分追うことは可能だし複雑怪奇な物は特に無いので素直にデータシートと見比べれば良いまでである。

そいでもってシリアル通信だが、やっぱり半二重や1Mbpsはさくっと出来て欲しいなぁと思って色々試したお話を。

端子はSWMまかせで好き勝手に割り当てられるのでよしとして、USARTの初期化とボーレートの設定はサンプルのまんまでも何ら問題はない。OETA|OESEL|OEPOLは半二重I/Fのバス制御にRTS端子を使う際に追加している。
#define _BAUDRATE	115200
Chip_UART_Enable (LPC_USART0);
Chip_UART_ConfigData (LPC_USART0,
UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1 | UART_CFG_OETA | UART_CFG_OESEL | UART_CFG_OEPOL);
Chip_Clock_SetUSARTNBaseClockRate (_BAUDRATE * 16, true);
Chip_UART_SetBaud (LPC_USART0, _BAUDRATE);
後はボーレートを好きな値にすれば良い筈だが、ボーレートジェネレータがインテリジェンスなのは分かるが1Mbps以下でしか誤差率を吸収してくれないし、Chip_Clock_SetUSARTNBaseClockRate に指定しているボーレートに対する *16 なんてデータシートまともに読まないと怪しい倍数にしか思えない。

結局の所、昔ながらの明確な指定をしようとするのであれば、ライブラリを使わずに自前でレジスタを叩いた方が素直というのはどこの世界も同じ。今回は1Mbpsにしたいだけだったので、クロックを16MHzの倍数にし、予め div と mul を固定し、BRGに好きな値を入れるという方針にした。
まず sysinitほげほげ.c の中の Chip_SetupIrcClocking でPLL設定しているとこを
Chip_Clock_SetupSystemPLL(7, 0);
Chip_Clock_SetSysClockDiv(3);
てな感じにすればオーバー気味だが fclkout=96MHz, sysclk=32MHz になる。
後はUARTの初期化時に
Chip_Clock_SetUSARTNBaseClockRate ((2000000 * 8), true);
LPC_USART0->OSR = 7;
としておけば良いかな。ボーレートは
uint32_t setbaudrate (uint32_ baudrate) {
  LPC_USART0->BRG = (Chip_Clock_GetUSARTNBaseClockRate () / (8 * baudrate)) - 1;
  return (Chip_Clock_GetUSARTNBaseClockRate () / (_OSR * (LPC_USART0->BRG + 1)));
}
で決めてみてはどうでしょう。今回はOSRをデフォルトの16から8にしたが、この辺は必要に応じて変えればOK。
これで2M,1M,666k,500k[bps]といったどこかで見た様な値が選べる。

技術

トラックバック

トラックバックpingアドレス http://www.besttechnology.co.jp/modules/d3blog/tb.php/168