ISR (割り込みステータス レジスタ) フラグを読み取って、GPIO 割り込みを使用しようとしています。アプリケーション ノートには、リセット値は 0 に等しくなければならないと書かれていますが (リファレンス マニュアルのページ: 1433)、起動時にこれを読んでいる間はそうではありません (0xCF08FEFF です)。また、次を使用してこの値を手動でリセットしようとしています: *(gpio3_base_address+GPIO_ISR_OFFSET)=0xFFFFFFFF;
ここで、gpio3_base アドレスは、mmap() とその揮発性の符号なし long 型および GPIO_ISR_OFFSET= 0x18/sizeof(long) を使用してマップされます。
しかし、値は同じままです...他のレジスタは正常に動作します。何が間違っているのか、何かを見逃したのかわかりません。
また、アプリケーション ノートには、このレジスタには「リセットのための 1 つの待機状態」が必要であると書かれていますが、C++/C でこの「待機状態」を行う方法がわかりません (これが主な問題かもしれません)。
Debian で imx6 quad を使用しています。(カーネル 3.14.60-fslc-imx6-sr armv7L)
リファレンス マニュアルへのリンクi.mx6quad リファレンス マニュアル
//SETTING UP INTERRUPT CONTROL REGISTER FOR GPIO_IO09 ICR1 I ICR2
cout<<"startup value ICR1="<<std::hex<<*(gpio3_base_address+GPIO_ICR1_OFFSET)<<"h"<<endl;
//setting up new value for GPIO_IO09 in ICR1
*(gpio3_base_address+GPIO_ICR1_OFFSET)&=0;
*(gpio3_base_address+GPIO_ICR1_OFFSET)|=0xC0000;// set FALLING EDGE for GPIO_IO09
cout<<"new value in ICR1:"<<std::hex<<*(gpio3_base_address+GPIO_ICR1_OFFSET)<<"h"<<endl;
//ICR2 RESET
cout<<"startup value ICR2:"<<std::hex<<*(gpio3_base_address+GPIO_ICR2_OFFSET)<<"h"<<endl;
if(*(gpio3_base_address+GPIO_ICR1_OFFSET)!=0){ //0 is default value
*(gpio3_base_address+GPIO_ICR1_OFFSET)&=0;
cout<<"new value ICR2:"<<std::hex<<*(gpio3_base_address+GPIO_ICR1_OFFSET)<<"h"<<endl;
}
//IMR
cout<<"startup value IMR:"<<std::hex<<*(gpio3_base_address+GPIO_IMR_OFFSET)<<"h"<<endl;
*(gpio3_base_address+GPIO_IMR_OFFSET)&=0;
*(gpio3_base_address+GPIO_IMR_OFFSET)|=(1<<9); //odblokowywanie przerwania od GPIO_IO09
cout<<"new value IMR:"<<std::hex<<*(gpio3_base_address+GPIO_IMR_OFFSET)<<"h"<<endl;
//ISR reset -- PROBLEM IS HERE
cout<<"address:"<<((&gpio3_base_address+GPIO_ISR_OFFSET))<<endl;
cout<<"startup value ISR: "<<std::hex<<*(gpio3_base_address+GPIO_ISR_OFFSET)<<"h"<<endl;
*(gpio3_base_address+GPIO_ISR_OFFSET)=0xFFFFFFFF;
cout<<"new value ISR :"<<std::hex<<*(gpio3_base_address+GPIO_ISR_OFFSET)<<"h"<<endl;
//EDGE_SEL register reset
cout<<"startup value EDGE_SEL: "<<std::hex<<*(gpio3_base_address+GPIO_EDGE_SEL_OFFSET)<<"h"<<endl; // "h" == hex
*(gpio3_base_address+GPIO_EDGE_SEL_OFFSET)&=0;
cout<<"new value EDGE_SEL: "<<std::hex<<*(gpio3_base_address+GPIO_EDGE_SEL_OFFSET)<<"h"<<endl;