Thursday, February 23, 2012

외부 GPIO Trigger

출처: http://prosigi.tistory.com/115


1. STM32 EXTI 5, 6, 7 Init Code





void EXTI_7_5_Init(void)

{



  EXTI_InitTypeDef  EXTI_InitStructure;

  NVIC_InitTypeDef  NVIC_InitStructure;

  GPIO_InitTypeDef   GPIO_InitStructure;



  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);  



  // GPIO PORT INIT

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    // Pull-Up

  GPIO_Init(GPIOC, &GPIO_InitStructure);





  // Enable the EXTI9_5 Interrupt

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);





  EXTI_ClearITPendingBit(EXTI_Line5);

  EXTI_ClearITPendingBit(EXTI_Line6);

  EXTI_ClearITPendingBit(EXTI_Line7);





  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5 );

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6 );

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource7 );



  // Configure EXTI Line to generate an interrupt

  // Rising and Falling edge Trigger

  EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line7;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);



}
 

 




2. stm32f10x_it.c 추가내용 (IRQ내부)



void EXTI9_5_IRQHandler(void)

{

  

  if(EXTI_GetFlagStatus(EXTI_Line5) != RESET)

  {

    Uart_Printf("Init IRQ_5 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line5);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line6) != RESET)

  {

    Uart_Printf("Init IRQ_6 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line6);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line7) != RESET)

  {

    Uart_Printf("Init IRQ_7 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line7);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line8) != RESET)

  {

    Uart_Printf("Init IRQ_8 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line8);

  }

  else if (EXTI_GetFlagStatus(EXTI_Line9) != RESET)

  {

    Uart_Printf("Init IRQ_9 \n");

    

    EXTI_ClearITPendingBit(EXTI_Line9);

  }

  else

  {

    ;

  }

}



3. 디버깅도중 CPU Halted 걸려서 먹통.. OTL.



증상)





원인)

- icf 파일 내용





- stm32f10x_vector.c 내용







해결)

icf파일에서 생성하는 intvec_start 섹션의 이름이 

stm32f10x_vector.c에 정의된 이름과 같지 않아서 생긴 문제인듯..

icf파일의 ".INTVEC" -> "INTVEC"로 변경으로 해결!! 








4. 실행중 HardFaultException 에 들어감.



증상)

- The stack 'CSTACK' is filled to 100% 

- The Stack pointer for stack 'CSTACK'

이라고 혼냄.. ㅠ_ㅠ





- HardFaultException 함수에서 껌뻑껌뻑.. 깜깜 무소식..





- 어셈..

 







원인)

- Stack을 너무 많이 썼음.. (너무많이 부려먹었나..?)



해결)

- .icf 파일의 스텍사이즈 정의..

- 일단 키워보자. 사용하는걸 계산할수 있으면.. 이런글도 안남기겠지? ㅎㅎ 



(요놈을)



(이렇게) (symbol 이름이 파일마다 다를수가 있나??)












저작자 표시
비영리
동일 조건 변경 허락

No comments:

Post a Comment