LoginSignup
0
0

More than 3 years have passed since last update.

UART(RXI割り込み)

Last updated at Posted at 2020-07-18

はじめに

受信時のUARTで割り込み処理を行う場合についての記述をする.マイコンボードはGR-CITRUSとする.ハードウェアマニュアルの参考先はHM *.*.*と表記する(例:HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考).

資料(必需品)
RX63Nグループ、RX631グループ ユーザーズマニュアル
GR-CITRUS回路図

設定

初期化と割り込み関数の作成を行う.

初期化関数

初期化関数の詳細は,UARTに記載されているものとする.ここに,割り込み関連の許可や設定が加わる.

流れ
1. UARTの基本設定をする.
2. REIレジスタを1とする.
3. 割り込み許可と優先度を設定する.

"hwsetup.c"
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;
}

割り込み関数

受信データをリードする割り込み関数を作成する.

"vect.h"
// SCI6 RXI6
//#pragma interrupt (Excep_SCI6_RXI6(vect=232))
//void Excep_SCI6_RXI6(void);
#pragma interrupt (Ctrl_read(vect=232))
void Ctrl_read(void);
"sci.h"
extern unsigned char ctrl_cmd[8];
"sci.c"
#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レジスタをリードした後にフラグをクリアする.他は詳細不明.

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0