imx6 GPIO中断状态寄存器(ISR)坏值

时间:2016-10-13 09:58:02

标签: c++ interrupt imx6

我试图通过读取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;

0 个答案:

没有答案