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












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

Monday, February 13, 2012

STM32 라이브러리 적용 Flow..

1. 라이브러리 설정
        - ST 홈페이지에서 다운로드
                STM32F10x_StdPeriph_Lib        (10/06/24 현재 3.3.0 버전)
                ㄴ CMSIS 폴더
                ㄴ STM32F10x_StdPeriph_Driver 폴더
                STM32F10x_USB-FS-Device_Lib        (10/06/24 현재 3.2.0 버전)
                ㄴ STM32_USB-FS-Device_Driver 폴더
        - \CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h 파일의 내용 변경
                ㄴ Performance line Define을 CPU에 맞게 변경 (LD, MD, HD, CL.. 등)
                ㄴ "#define HSE_Value" 값을 사용 외부 클럭속도에 맞게 수정
        
        - \CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c 파일의 내용 변경
                ㄴ SetSysClockTo72(); 함수의 내용중 
                   "RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);" 라인의 
                   PLLMULLx 값 변경하여 "HSE * x = 72MHz" 성립되게 수정
원본: http://prosigi.tistory.com/81