我正在尝试通过读取 ISR(中断状态寄存器)标志来使用 GPIO 中断。应用说明说重置值应该等于 0(参考手册第 1433 页),但不是(它是 0xCF08FEFF),而我在启动时阅读此内容。我还尝试使用以下方法手动重置此值: *(gpio3_base_address+GPIO_ISR_OFFSET)=0xFFFFFFFF;
其中:gpio3_base 地址使用 mmap() 及其volatile unsigned long 类型和 GPIO_ISR_OFFSET= 0x18/sizeof(long) 映射。
但是值还是一样的……其他寄存器工作正常。我不知道有什么问题或者我错过了什么。
应用说明还说这个寄存器需要“一个等待状态进行复位”,但我不知道如何在 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;