SSブログ
プログラム ブログトップ

AKI-SH7125プログラミング [プログラム]

なーんと無く書いてみたくなったので、、、

秋月電子 AKI-SH7125のプログラミングサンプル。

コンパイラは秋月の開発キットに付属していたHEWを使用。
先ずはシリアルポートの初期化です。

volatile UInt8 tSCI1RcvBuf[SCI1_RCV_BUF_SIZE]; // 受信バッファ。
volatile UInt8 tSCI1SndBuf[SCI1_SND_BUF_SIZE]; // 送信バッファ。
volatile int tSCI1RcvPshCnt;
volatile int tSCI1RcvPopCnt;
volatile int tSCI1SndPshCnt;
volatile int tSCI1SndPopCnt;

/******************************************************************************
InitSCI1()
InitPorts()の後に行う。
******************************************************************************/
void InitSCI1(void)
{
int cnt;
STB.CR3.BIT._SCI1 =0; // クロック供給開始

SCI1.SCSCR.BYTE =0;
SCI1.SCSCR.BYTE =SCSCR_CKE_INT_CLK_SCK_OUT; // 調歩同期 SCK出力
SCI1.SCSMR.BYTE =SCSMR_CA_ASYNC | SCSMR_CHR_8 | SCSMR_STOP_1 | SCSMR_CKS_1;
SCI1.SCSDCR.BYTE =SCSDCR_RES | SCSDCR_DIR_LSB;
SCI1.SCBRR =80; // 9600bps

for(cnt =0; 10000 >cnt; cnt++)
{
tSCI1RcvPshCnt =tSCI1RcvPopCnt =0;
tSCI1SndPshCnt =tSCI1SndPopCnt =0;
} // 1bit 時間待ち。

PFC.PACRL2.WORD =PACRL2_PA5_SCK1 | PACRL2_PA4_TXD1; // ポート端子設定
PFC.PACRL1.WORD =PACRL1_PA3_RXD1;

INTC.IPRL.BIT._SCI1 =3; // 割り込みレベル

SCI1.SCSCR.BYTE =SCSCR_RIE | SCSCR_TE | SCSCR_RE | SCSCR_CKE_INT_CLK_SCK_OUT; // 送受信許可
}

シリアルポートはSCI1からオプションのベースボードを介してRS232Cでパソコンと通信します。
私のプログラムでは送受信共に割込みを使いますので、メインプログラムと割込みの間で通信データを受け渡しする、tSCI1RcvBuf[] とtSCI1SndBuf[] を持ちます。
そして、送受信バッファは各々をリングバッファとして使いますので、
送信用には、メインループ側から送信バッファを何処まで書き込んだかを示すtSCI1SndPshCntと、割込み側で何処まで送信したかを示すtSCI1SndPopCntを持ちます。

メインループからの送信は以下のSndSCI1Str()を用います。
int SndSCI1Str(char *inStr)
{
for( ; *inStr; inStr++)
{
tSCI1SndBuf[tSCI1SndPshCnt++] =*inStr;
if(tSCI1SndPshCnt >=SCI1_SND_BUF_SIZE) tSCI1SndPshCnt =0;
}
SCI1.SCSCR.BIT.TIE =1; // 送信割り込み許可
return 0;
}

SndSCI1Str()で注意して措くのが、通信は原則的にテキストベースで行っている点です。
バイナリの生データ通信は高速に通信出来ますが、パソコンのターミナルソフトとかに繋いでも化け文字しか見えないので、デバッグが面倒です。また、テキストをマイコン内でデータやコードに変換する際にエラーチェックを入れ易いので、手間は掛かっても実際の開発は早いです。
if(tSCI1SndPshCnt >=SCI1_SND_BUF_SIZE) tSCI1SndPshCnt =0;
のところで、tSCI1SndBuf[]をリングバッファとして用いている事が理解出来ると思います。

送信割込みは、
void INT_SCI1_TXI1(void)
{
if(SCI1.SCSSR.BIT.TDRE)
{
if(tSCI1SndPshCnt !=tSCI1SndPopCnt)
{
SCI1.SCTDR =tSCI1SndBuf[tSCI1SndPopCnt++];
if(tSCI1SndPopCnt >=SCI1_SND_BUF_SIZE) tSCI1SndPopCnt =0;
SCI1.SCSSR.BIT.TDRE =0;
}
else
SCI1.SCSCR.BIT.TIE =0; // 送信データ無し
}
}

単純に、tSCI1SndPshCnt とtSCI1SndPopCntが一致するまで割り込みで送信を続けます。
tSCI1SndPshCnt とtSCI1SndPopCntが一致すると云う事は送信データがもう無いと云う事ですので、SCI1.SCSCR.BIT.TIE =0;として、割込み許可をはずします。







プログラム ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。