PIOポート出力 – セット・リセット方式
ポートを有効にするには、書き込み専用のPIO_PERレジスタで該当ビットをセットします。
ポートを無効にには、書き込み専用のPIO_PDRレジスタで該当ビットをセットします。
読み込み専用のPIO_PSRレジスタは、該当するポートが有効であるビットのみONになっています。
ポートを出力にするには、書き込み専用のPIO_OERレジスタで該当ビットをセットします。
ポートを入力にするには、書き込み専用のPIO_ODRレジスタで該当ビットをセットします。
読み込み専用のPIO_OSRレジスタは、該当するポートが出力であるビットのみONになっています。
下記プログラムは、ポートのON・OFFをそれぞれ別のレジスタで行う方式で、500ミリ秒ごとに点滅をします。
#include <mes2.h>
#include <at91/at91sam9260.h>
int main() {
PIOC(PIO_PER) = PORT(5);
PIOC(PIO_OER) = PORT(5);
for(;;) {
PIOC(PIO_SODR) = PORT(5);
sleep(500);
PIOC(PIO_CODR) = PORT(5);
sleep(500);
}
}
PIOポート出力 – 出力用レジスタ方式
PIO_OWSRレジスタの該当ビットをセットすることにより単一レジスタでポート操作を行うことができます。
下記プログラムは、ポートのON・OFFをそれぞれ単一レジスタで行う方式で、500ミリ秒ごとに点滅をします。
#include <mes2.h>
#include <at91/at91sam9260.h>
int main() {
PIOC(PIO_PER) = PORT(5);
PIOC(PIO_OER) = PORT(5);
PIOC(PIO_OWER) = PORT(5);
for(;;) {
PIOC(PIO_ODSR) ^= PORT(5);
sleep(500);
}
}
PIOポート入出力
ポート入力は、読み込み専用のPIO_PDSRレジスタで取得します。
下記プログラムは、PA5のスイッチ状態をPC5のLEDに反映させるプログラムです。
#include <mes2.h>
#include <at91/at91sam9260.h>
int main() {
PIOA(PIO_PER) = PORT(5);
PIOC(PIO_PER) = PORT(5);
PIOA(PIO_ODR) = PORT(5);
PIOC(PIO_OER) = PORT(5);
PIOC(PIO_OWER) = PORT(5);
for(;;) {
PIOC(PIO_ODSR) = PIOA(PIO_PDSR) & PORT(5);
}
}
FIQ割り込み
FIQ割り込みは最優先の割り込みになりますが、MESで割り込み禁止にしないため、
FIQ割り込み処理時は、MESで割り込み禁止で処理すべき事項が正常動作しない可能性があります。
原則としてMESでは割り込みを管理しないため、ユーザープログラムの割り込み処理は、
ハードウェアから直接呼び出されます。
また、割り込みを使用するユーザープログラムは終了してはいけません。
割り込みハンドラは通常の関数ではなく、その属性に「FIQ」を指定しなければなりません。
割り込みハンドラ処理終了時は、割り込みをクリアするため、AIC_ICCRレジスタをセットし、
AIC_EOICRレジスタに適当な値でアクセスします。
下記プログラムは、FIQ端子に接続された割り込みスイッチにLEDがトグルするようになっています。
また、割り込み端子のスイッチ入力はチャタリングをしないように回路処理する必要があります。
#include <mes2.h>
#include <at91/at91sam9260.h>
void fiq_handler() __attribute__ ((interrupt ("FIQ")));
void fiq_handler() {
if(PIOC(PIO_ODSR) & PORT(5)) {
PIOC(PIO_CODR) = PORT(5);
} else {
PIOC(PIO_SODR) = PORT(5);
}
AIC_ICCR = AIC_IPR_PID(SYS_PID_AIC);
AIC_EOICR = 0;
}
int main() {
PIOC(PIO_PER) = PORT(5);
PIOC(PIO_OER) = PORT(5);
PIOC(PIO_CODR) = PORT(5);
set_handler(SYS_PID_AIC, fiq_handler);
for(;;);
return 0;
}
IRQ1割り込み
原則としてMESでは割り込みを管理しないため、ユーザープログラムの割り込み処理は、
ハードウェアから直接呼び出されます。
また、割り込みを使用するユーザープログラムは終了してはいけません。
割り込みハンドラは通常の関数ではなく、その属性に「IRQ」を指定しなければなりません。
割り込みハンドラ処理終了時は、割り込みをクリアするため、AIC_ICCRレジスタをセットし、
AIC_EOICRレジスタに適当な値でアクセスします。
下記プログラムは、IRQ1端子に接続された割り込みスイッチにLEDがトグルするようになっています。
また、割り込み端子のスイッチ入力はチャタリングをしないように回路処理する必要があります。
#include <mes2.h>
#include <at91/at91sam9260.h>
void irq_handler() __attribute__ ((interrupt ("IRQ")));
void irq_handler() {
if(PIOC(PIO_ODSR) & PORT(5)) {
PIOC(PIO_CODR) = PORT(5);
} else {
PIOC(PIO_SODR) = PORT(5);
}
AIC_ICCR = AIC_IPR_PID(SYS_PID_IRQ1);
AIC_EOICR = 0;
}
int main() {
PIOC(PIO_PER) = PORT(5);
PIOC(PIO_OER) = PORT(5);
PIOC(PIO_CODR) = PORT(5);
set_handler(SYS_PID_IRQ1, irq_handler);
for(;;);
return 0;
}
シリアルポート送受信
MESでシリアルポートを使用しない場合のみ使用できます。
シリアルポートに限らず、外部端子を使う周辺機能を利用する場合、PIOポートと端子機能が兼用のため、PIO_PDRレジスタでPIOポートを無効にして、PIO_ASRまたはPIO_BSRレジスタで利用する外部端子を指定し、周辺機能で外部端子を使えるようにします。
パワーマネージメント機能付き周辺機能の場合、デフォルトで電源OFFになっているため、PMC_PCERレジスタで利用する周辺機能の電源をONにします。
US_CRレジスタで最初に送受信機能をリセットし、次に一旦送受信機能を無効にします。
US_MRレジスタで通信条件を設定し、US_BRGRでボーレートを設定します。
シリアルポートの設定が終ったら、US_CRレジスタで送受信機能を有効にします。
また、DTRやRTSを使用しない場合は同時に無効にしておきます。
下記プログラムは、シリアルポート0番で送受信しています。
注意点としては、タスクスイッチで他タスク実行中に受信データを取りこぼす可能性があります。
受信データを取りこぼしたくない場合は、MESでの送受信を推奨します。
#include <at91/at91sam9260.h>
int main() {
int c;
PIOB(PIO_PDR) = PORT(4) + PORT(5);
PIOB(PIO_ASR) = PORT(4) + PORT(5);
PMC_PCER = PERIPH_SET(SYS_PID_US0);
USART0(US_CR) = US_RSTRX + US_RSTTX + US_RSTSTA;
USART0(US_CR) = US_RXDIS + US_TXDIS + US_DTRDIS + US_RTSDIS;
USART0(US_MR) = US_USART_MODE_NORMAL + US_USCLKS_MCK + US_CHRL_8bits +
US_PAR_NONE + US_NBSTOP_1bit;
USART0(US_BRGR) = 57;
USART0(US_CR) = US_RXEN + US_TXEN + US_DTRDIS + US_RTSDIS;
for(;;) {
while((USART0(US_CSR) & US_RXRDY) == 0);
c = USART0(US_RHR) & 0xff;
while((USART0(US_CSR) & US_TXRDY) == 0);
USART0(US_THR) = c;
}
}