io_setup.hの内容
void hardware_setup(void);
void set_LED_R(int);
void set_LED_G(int);
int get_sw1(void);
int get_PortA_bit(int);
void set_PortE_bit(int,int);
ダウンロード
io_setup.cの内容
#include "iodefine.h"
#include "io_setup.h"
/*=============各ポートの入出力設定と汎用IOの機能設定=============*/void hardware_setup(void){
//ポートEの特殊機能設定 //今回はポートEの0~7を汎用IOに設定する PFC.PECRL2.BIT.PE7MD = 0x0;
//PE07 IO PFC.PECRL2.BIT.PE6MD = 0x0;
//PE06 IO PFC.PECRL2.BIT.PE5MD = 0x0;
//PE05 IO PFC.PECRL2.BIT.PE4MD = 0x0;
//PE04 IO PFC.PECRL1.BIT.PE3MD = 0x0;
//PE03 IO PFC.PECRL1.BIT.PE2MD = 0x0;
//PE02 IO PFC.PECRL1.BIT.PE1MD = 0x0;
//PE01 IO PFC.PECRL1.BIT.PE0MD = 0x0;
//PE00 IO //ポートEの入出力を設定する //3,2を入力それ以外は出力 //1111 1111 1111 0011(2進数) // F F F 3(16進数) PFC.PEIORL.WORD = 0xFFF3;
// !!!注意!!! //ベースボードを接続する場合PE02は出力に設定しないこと。 //ポートAの特殊機能設定 PFC.PACRL4.BIT.PA15MD = 0x0;
//PA15 IO PFC.PACRL4.BIT.PA14MD = 0x0;
//PA14 IO PFC.PACRL4.BIT.PA13MD = 0x0;
//PA13 IO PFC.PACRL4.BIT.PA12MD = 0x0;
//PA12 IO PFC.PACRL3.BIT.PA11MD = 0x0;
//PA12 IO PFC.PACRL3.BIT.PA10MD = 0x0;
//PA12 IO //ポートAの入出力を設定する PFC.PAIORL.WORD = 0x0000;
//全部入力}
/*============= LED赤の出力関数(0:消灯、1:点灯) =============*/void set_LED_R(int on){
if(on==0)
//関数への入力が0の時 PE.DRL.BIT.B0=0;
//消灯 else
//それ以外(入力が0の時) PE.DRL.BIT.B0=1;
//点灯}
/*============= LED緑の出力関数(0:消灯、1:点灯) =============*/void set_LED_G(int on){
if(on==0)
//関数への入力が0の時 PE.DRL.BIT.B1=0;
//消灯 else
//それ以外(入力が0の時) PE.DRL.BIT.B1=1;
//点灯}
/*============= SW1の状態取得関数(SW1上:0、SW1下:1)=============*/int get_sw1(void){
return PE.DRL.BIT.B2;
}
/*============= PortA 10-15入力関数(ビット番号) =============*/int get_PortA_bit(int bit){
int state=0;
//変数を宣言しておく int outdata=0;
//変数を宣言しておく if( bit<10 || bit>15 )
//関係ない端子を指定した場合 return -1;
//0,1以外の数値を返して強制終了 state = PA.DRL.WORD&(0x0001<<bit);
//0または0以外の値として取得 outdata = (state==0)? 1 : 0 ;
//0-1に変換(プルアップへの対応のため反転) return outdata;
//指定したポートの状態を返す}
/*============= PortE 4-7出力関数(ビット番号、ON/OFF) =============*/void set_PortE_bit(int bit,int on){
int outdata=0;
if( bit<4 || bit>7 )
//関係ない端子を指定した場合 return;
//ここでこの関数を強制終了 outdata=0x0001<<bit;
if(on==0){
//OFFする場合 PE.DRL.WORD &=~outdata;
//OFF 指定したビットのみ0にする }else{
PE.DRL.WORD |= outdata;
//ON 指定したビットのみ1にする }
}
変更箇所解説
PFC.PECRL2.WORDだった個所を
PFC.PECRL2.BIT.PE7MD~
PE4MDに変更しました。
以前はPE4~PE7の4つ分の特殊機能設定が入った
PECRL2を
WORDアクセスで4つ分まとめて設定していましたが、これを
BITアクセスを使って1ビットごとに分けて設定する仕様に変更しました。
ただし、このBITというアクセス方法は
PECRL2に1ビットずつアクセスするという意味ではなく、
PEの1ビット分に該当する個所に関して
PECRL2に3ビットずつアクセスしています。
ダウンロード
別ファイルの機能取り込み
とりあえず機能を別ファイルに移すことができましたが、メインのソースファイルと新規作成したファイルが関連付けられていないためこのままではビルドの際にエラーが出ます。
そこで
メインのソースファイルでヘッダファイルio_setup.hをincludeします。
メインのソースファイル(sw1.cとか)の中身
#include "iodefine.h"
//マイコン設定に必要な情報読み込み#include "io_setup.h" //ポートの入出力設定に用いる関数読込main(){
int i;
int bit_state;
hardware_setup();
//マイコンの端子を初期化(汎用IO) set_LED_R(0);
//とりあえずLED赤消灯 set_LED_G(0);
//とりあえずLED緑消灯 while(1){
if(get_sw1()){
//スイッチ1がON:下の時 set_LED_R(1);
//LED赤点灯 set_LED_G(0);
//LED緑消灯 }else{
//スイッチ1がON:下じゃない時(OFF:上) set_LED_R(0);
//LED赤消灯 set_LED_G(1);
//LED緑点灯 }
//4bit分の入力を受け付け、4bit分出力する for(i=0;i<4;i++){
bit_state = get_PortA_bit(10+i);
//PortAの10~13ビット目の状態取得 set_PortE_bit(4+i,bit_state);
//PortEの4~7ビット目に出力 }
}
}
これで細かい設定が完全に裏方に回りメインのソースは実現したい内容だけになりました。
余計な部分に気を取られる事がなくなり、メインのプログラムに集中できるようになります。
ダウンロード