いまだに炎上案件抱えてひーひーゆうてるのに。
PSoC Advent Calender 2017 の 記事を!って頼まれたのでそれをば。
さて、PSoC のUARTってコンポーネント、ポンっ!ってかんじで
いいので、とっても簡単なんですがね、ほかのマイコンなら
途中でボーレートチェンジ!なんて簡単にできるのに
この部分はAPIとしてはParityは公開されているけれど、
肝心の速度は公開されてないので、なんともならない。
きっかけは MonoWirelessのTWELiteの書き込みがPSoCからしたいよね!的な
ところから始まったんだけど。
PC <--USB--> PSoC <--UART-->TWELite
っていう感じでつかって、モード変更で書き込み対応したいとか。
で、やってみた。
Design Wide Resources (.cydwr)をひらいて Clockタブを見てみる。
やっぱり、UART_1_IntClockを引き込んでいる。
今回は115200bps = 115.2kHzがほしい設定なので
サンプリングを8倍した 921.6kHzを生成してるわけですね。(最下行)
この921.6kHzを生成するのに、64MHzを69分周して近似の
927.536kHzを出してるというのはわかる。
ということなら
このDividerを変更したらよくね?
UART_1のコードの下に、UART_1_IntClock.cというのができてる。
このなかに SetDividerRegister()関数という、もうそのままのネーミングの
関数あるじゃんと。
これをよべばよさげですよね。
===================================
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void setBitRate(uint32 rate) | |
{ | |
uint16 div; | |
switch( rate ){ | |
case 57600: div = HS57600; break; | |
case 38400: div = HS38400; break; | |
case 19200: div = HS19200; break; | |
case 9600: div = HS9600; break; | |
case 115200: | |
default: | |
div = HS115200; | |
break; | |
} | |
UART_1_Stop(); | |
UART_1_IntClock_SetDividerRegister(div, 1); // 設定変更+リスタート | |
UART_1_Start(); | |
} | |
===================================
ぼくの場合だと
#define HS115200 69
#define HS57600 139
#define HS38400 208
#define HS19200 417
#define HS9600 833
ってかんじですかね。
ここらは計算でする方法もあるし、あるていど決め打ちでもいいかも
ですね。
64000(kHz) / (欲しい周波数(kHz) * 8) = divider
ってかんじですね。