ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 111024_STM32 EXTI "Cpu Halted"
    SiGi's Programmer Note/2011-10 2011. 10. 24. 22:53


    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 이름이 파일마다 다를수가 있나??)








    댓글

Designed by Tistory.