我试图通过读取ISR(中断状态寄存器)标志来使用GPIO中断。应用笔记说复位值应该等于0(参考手册,第1433页),但它不是(它的0xCF08FEFF),而我正在启动时读取它。我也尝试使用以下方法手动重置此值: *(+ gpio3_base_address GPIO_ISR_OFFSET)= 0xFFFFFFFF的;
其中:gpio3_base地址使用mmap()映射,其 volatile unsigned long type 和GPIO_ISR_OFFSET = 0x18 / sizeof(long)。
但值仍然相同...... 其他寄存器正常工作。我不知道什么是错的,或者我错过了什么。
此外,应用说明该寄存器需要"一个等待状态进行复位"但是我不知道我怎么能这样做"等待状态"在C ++ / C中(也许这是主要问题)
我使用imx6 quad和Debian。 (内核3.14.60-fslc-imx6-sr armv7L)
参考手册i.mx6quad reference manual
的链接//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;