본문 바로가기

ARM9/STR9

STR911 GPIO 테스트

STR911 GPIO 테스트
STR911의  GPIO의 대략적 특성을 보면 아래와 같다.
  • All GPIO pins are 5V tolerant.
  • I/O port drivers may be configured as Push-Pull or as Open Collector.
  • The GPIO ports have no internal or programmable pull-up resistors.
여기서 주의 사항은 풀업 레지스터가 없다. 하드웨어 설계시 주의를 요한다는 뜻...

아래 STR911의 GPIO 블럭도를 보면 상당히 심플한데 레지스터 3개면 된다. 다른 ARM프로세서와 차이점이므로 주의 해야 한다.



STR911에서 GPIO는 아래와 같이 설정하면 된다

#define Led1Init()
SCU_APBPeriphClockConfig(__GPIO2 , ENABLE);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = LED1_BIT;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt1;
GPIO_Init(GPIO2, &GPIO_InitStructure)

DR 레지스터의 어드레스 옵셋은 0x3FC 이므로 아래와 같이 설정해서 사용할 수 있다.
#define PORT2      GPIO2->DR[0x3FC]


단 기본 제공 예제에서 주의 할 사항은 GPIO_DeInit() 함수로 초기화 할때 기존 설정도 지워지기 때문에 문제가 될 수 있다.
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
       :
   if(GPIOx == GPIO2)
  {
    SCU_APBPeriphReset(__GPIO2,ENABLE);
    SCU_APBPeriphReset(__GPIO2,DISABLE);
    SCU->GPIOTYPE[0x02] = 0x0000 ;
    SCU->GPIOOUT[0x02]  = 0x0000;
    SCU->GPIOIN[0x02]   = 0x0000;
  }
}

그래서 System초기화때 GPIO_DeInit() 함수 호출 할 수 있도록 수정했다.
void SystemInit(void)
{
#ifdef DEBUG
  debug();
#endif
 
 /*Configure PLL as clock source @96MHZ*/
 MCLK_Config(STR911_PLL_CLK);
 GPIO_DeInit(GPIO2);
}


반응형