Я пытаюсь использовать прерывания GPIO, читая флаги ISR (регистр состояния прерываний). В примечании к приложению сказано, что значение сброса должно быть равно 0 (справочное руководство на стр. 1433), но это не так (это 0xCF08FEFF), пока я читаю это при запуске. Я также пытаюсь сбросить это значение вручную, используя:
* (Gpio3_base_address + GPIO_ISR_OFFSET) = 0xFFFFFFFF;
где: адрес gpio3_base отображается с помощью mmap () и его Летучий тип без знака и GPIO_ISR_OFFSET = 0x18 / sizeof (long).
Но ценность все та же … Другие регистры работают правильно. Я не знаю, что может быть не так или я что-то пропустил.
Также в примечании к заявлению говорится, что этому регистру нужно «одно состояние ожидания для сброса», но я не знаю, как я могу сделать это «состояние ожидания» в C ++ / C (возможно, это главная проблема)
Я использую Imx6 Quad с Debian. (ядро 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;
Задача ещё не решена.
Других решений пока нет …