안녕하세요..

일단 먼저 엣지 검출을 사용하지 마시고,

GPLR0 레지스트를 사용하셨어 그냥 입력의 상태를 먼저 읽어 보시기 바랍니다.

소스에서는 별 문제가 없는것 같습니다..

혹시 정상적으로 입력이 된다면 소스 전체를 압축하셨어 올려 주세요..
( 저희가 TEST를 해 볼 수가 없네요..)

그럼 수고하세요..


왕초보 wrote..
: #include
: #include
: #include
: #include
: #include
: #include
: #include
: #include
: #include
:
: #define IO_BASE_ADDR 0x40000000
: #define IO_SIZE 0x0C000000
:
: #define IO_GAFR0_L_ADDR 0x40E00054
: #define IO_GPDR0_ADDR 0x40E0000C
: #define IO_GPSR0_ADDR 0x40E00018
: #define IO_GPCR0_ADDR 0x40E00024
: #define IO_GRER0_ADDR 0x40E00030
: #define IO_GEDR0_ADDR 0x40E00048
: #define IO_GFER0_ADDR 0x40E0003C
:
: #define IO_GAFR0_L_OFFSET ( IO_GAFR0_L_ADDR - IO_BASE_ADDR )
: #define IO_GPDR0_OFFSET ( IO_GPDR0_ADDR - IO_BASE_ADDR )
: #define IO_GPSR0_OFFSET ( IO_GPSR0_ADDR - IO_BASE_ADDR )
: #define IO_GPCR0_OFFSET ( IO_GPCR0_ADDR - IO_BASE_ADDR )
: #define IO_GRER0_OFFSET ( IO_GRER0_ADDR - IO_BASE_ADDR )
: #define IO_GEDR0_OFFSET ( IO_GEDR0_ADDR - IO_BASE_ADDR )
: #define IO_GFER0_OFFSET ( IO_GFER0_ADDR - IO_BASE_ADDR )
:
:
: #define IO_GPIO3 (1<<3)
: #define IO_GPIO4 (1<<4)
: #define IO_GPIO5 (1<<5)
:
: int main( int argc, char **argv )
: {
: int fd;
:
: void *baseaddr;
: unsigned long *gpdr0;
: unsigned long *gpsr0;
: unsigned long *gpcr0;
: unsigned long *gafr0;
: unsigned long *grer0;
: unsigned long *gedr0;
: unsigned long *gfer0;
:
: fd = open( "/dev/mem", O_RDWR|O_SYNC );
: if( fd < 0 )
: {
: perror( "/dev/mem open error" );
: exit(1);
: }
:
: // IO 메모리를 얻는다.
: baseaddr = mmap( 0, // 커널에서 알아서 할당요청
: IO_SIZE, // 할당 크기
: PROT_READ|PROT_WRITE, MAP_SHARED, // 할당 속성
: fd, // 파일 핸들
: IO_BASE_ADDR ); // 매핑 대상의 물리주소
: printf( "IO ADDR %p
", baseaddr );
:
: if( baseaddr != NULL )
: {
: // GPIO 어드레스
: gafr0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GAFR0_L_OFFSET );
: gplr0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GPLR0_OFFSET );
: gpdr0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GPDR0_OFFSET );
: gpsr0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GPSR0_OFFSET );
: gpcr0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GPCR0_OFFSET );
: grer0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GRER0_OFFSET );
: gfer0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GFER0_OFFSET );
: gedr0 = (unsigned long *) ( (unsigned char *)baseaddr +
: IO_GEDR0_OFFSET );
:
: *gafr0=0x00; //범용으로 설정
: *gpdr0=0x30; // gpio4,5 출력 나머지 입력으로 설정
: *grer0|=IO_GPIO3; //gpio3 상승 엣지 검출 허가.
:
: printf( "GPDR0 STATE %08X
", *gpdr0 );
: printf( "GAFR0 STATE %08X
", *gafr0 );
: printf( "GRER0 STATE %08X
", *grer0 );
: printf( "GEDR0 STATE %08X
", *gedr0 );
:
: while(1)
: {
:
: if(*gedr0== (*gedr0 | IO_GPIO3))
:
: {
: *gpcr0 = IO_GPIO4; printf( "ON4
" );
: sleep(1);
: *gpsr0 = IO_GPIO4; printf( "Off4
" );
: sleep(1);
:
: *gpcr0 = IO_GPIO5; printf( "ON5
" );
: sleep(1);
: *gpsr0 = IO_GPIO5; printf( "Off5
" );
:
: *gedr0 |= IO_GPIO3; // gedr0 clear
: }
: }
:
:
: if( baseaddr != NULL ) munmap( baseaddr, IO_SIZE ); // 매핑된것
: 해제
: }
:
: close( fd );
:
: return 0;
: }
:
:
: 장형기 wrote..
: : 안녕하세요.
: :
: : 뭔가 레지스트 설정을 잘못하셨거나, 설정을 빠뜨리시지는 않으셨나요??
: :
: : 아니면 다른 곳에서 이 GPIO를 건드리고 계시든지...
: :
: : 또는 GPIO를 인터럽트로 사용하셨다고 하셨는데... 입력 전압은 얼마인지??
: :
: : 소스를 한번 올려 주세요...
: :
: : 그럼 수고하세요..
: :
: :
: :
: : 왕초보 wrote..
: : : GPIO0,1은 계속해서 인터럽트가 걸리는데요..
: : : 3번 부터는 한번 걸리고는 반응이 없습니다.
: : : developer sheet보고 레지스터란 레지스터는 보았는데..
: : : 왜 그런지 모르겠습니다.
: : : 어떤 걸 건드려야 하는지..ㅜ.ㅜ
: : : 안걸리면 안걸리지 왜 한번인지..
: : : GAFR0을 00을 줬는데...
: : : 0,1은GEDR0에 값이 셋되는걸 확인했는데 3번부터는 셋이 안되고
: : : 한번만 실행됩니다..이런일이...
: : : 도와주세요~!~!