はじめに
受信時のUARTで割り込み処理を行う場合についての記述をする.マイコンボードはGR-CITRUSとする.ハードウェアマニュアルの参考先はHM *.*.*と表記する(例:HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考).
資料(必需品)
・ RX63Nグループ、RX631グループ ユーザーズマニュアル
・ GR-CITRUS回路図
設定
初期化と割り込み関数の作成を行う.
初期化関数
初期化関数の詳細は,UARTに記載されているものとする.ここに,割り込み関連の許可や設定が加わる.
流れ
- UARTの基本設定をする.
- REIレジスタを1とする.
- 割り込み許可と優先度を設定する.
void SCI6_init(void);
void HardwareSetup(void)
{
SCI6_init();
}
/*=================================
* 関数名 : SCI6_init
* 機能 : SCI6の初期化
* 引数 : なし
* 戻り値 : なし
* 備考 :通信速度 2400bps,RXI及びERI割り込み
* ===============================*/
void SCI6_init(void)
{
/*=== プロテクト解除 ===*/
SYSTEM.PRCR.WORD = 0xA502;
/*=== SCI6を有効化 ===*/
MSTP(SCI6) = 0;
/*=== プロテクト ===*/
SYSTEM.PRCR.WORD = 0xA500;
/*=== 端子機能の有効化 ===*/
PORT3.PMR.BIT.B2 = 1;
PORT3.PMR.BIT.B3 = 1;
/*=== ピン機能設定 プロテクト解除===*/
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
/*=== ピン機能設定 ===
* P32 > TXD0
* P33 > RXD0
* ================*/
MPC.P32PFS.BIT.PSEL = 0x0A;
MPC.P33PFS.BIT.PSEL = 0x0A;
/*=== ピン機能設定 プロテクト===*/
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
/*=== SCR設定 割り込み禁止 SCK未使用 ===*/
SCI6.SCR.BIT.TEIE = 0;
SCI6.SCR.BIT.MPIE = 0;
SCI6.SCR.BIT.RE = 0;
SCI6.SCR.BIT.TE = 0;
SCI6.SCR.BIT.RIE = 1;
SCI6.SCR.BIT.TIE = 0;
SCI6.SCR.BIT.CKE = 0;
/*=== シリアルインターフェース ===*/
SCI6.SIMR1.BIT.IICM = 0;
/*=== クロックセレクト > 極性反転なし 遅れなし ===*/
SCI6.SPMR.BIT.CKPH = 0;
SCI6.SPMR.BIT.CKPOL = 0;
/*=== 通信フォーマット設定 ===
* クロック : PCLK
* ストップビット : 1bit
* パリティ : なし
* データ長 : 8bit
* 調歩同期式
* ====================*/
SCI6.SMR.BIT.CKS = 2;
SCI6.SMR.BIT.MP = 0;
SCI6.SMR.BIT.STOP = 0;
SCI6.SMR.BIT.PM = 0;
SCI6.SMR.BIT.PE = 0;
SCI6.SMR.BIT.CHR = 0;
SCI6.SMR.BIT.CM = 0;
/*=== 通信ビットレート設定 ===
* 転送速度 2400bps
* ===============*/
SCI6.SEMR.BIT.ABCS = 0;
SCI6.BRR = 38;
/*=== 割り込み優先度設定 ===*/
IPR(SCI6,RXI6) = 5;
/*=== 割り込み許可 ===*/
IEN(SCI6,RXI6) = 1;
/*=== 通信開始 ===*/
SCI6.SCR.BIT.RE = 1;
SCI6.SCR.BIT.TE = 1;
}
割り込み関数
受信データをリードする割り込み関数を作成する.
// SCI6 RXI6
//#pragma interrupt (Excep_SCI6_RXI6(vect=232))
//void Excep_SCI6_RXI6(void);
# pragma interrupt (Ctrl_read(vect=232))
void Ctrl_read(void);
extern unsigned char ctrl_cmd[8];
# include"iodefine.h"
# include"sci.h"
# include"vect.h"
unsigned char ctrl_cmd[8];
/*=================================
* 関数名 : Ctrl_read
* 機能 : コントローラからの情報(8byte)を受信する
* 引数 : なし
* 戻り値 : なし
* 備考 :UART(SCI6),RXI割り込み
* ===============================*/
void Ctrl_read(void)
{
static int n = 0;
/*=== データ受信 ===*/
ctrl_cmd[n] = SCI6.RDR;
/*=== データ格納先更新 ===*/
n++;
/*=== 全データ受信完了 ===*/
if(n == 8)
{
/*=== カウントクリア ===*/
n = 0;
}
}
エラー処理関数
SCIの受信エラーのフラグは,次の3つがある(HM 35.2.7).
SSR.ORER:オーバランエラーフラグ
SSR.PER:パリティエラーフラグ
SSR.FER:フレーミングエラーフラグ
SCR.RIE=1に設定しているときに,いずれかのフラグが立つと,ERI割り込みが発生する(HM 35.2.6).
ERI割り込みはグループ化されてベクタ番号114に割り当てられている.表15.4のグループ12に記載されている. 図35.14のフローチャートを参考にエラー処理関数を作成する.
オーバーランエラー処理は,RDRレジスタをリードした後にフラグをクリアする.他は詳細不明.