인터럽트를 살리는 루틴이 있다.

 
 
------------------------------------------------------------------------------------
 
int main(void)
{
    uint8_t ch;
 
    /* System Clocks Configuration */
    RCC_Configuration();  //시스템 클럭을 살리고 주변 프리페럴럴 를 살린다.
 
    RCC_GetClocksFreq(&rcc_clocks); //현재 설정된 클럭을 rcc_clocks 스트럭쳐로 가져 온다.

    /* NVIC configuration */
    NVIC_Configuration();   //인터럽트 백터 테이블을 선언 한고, 우선순위 선언, 인터럽트 살리기 

------------------------------------------------------------------------------------
 
 
 
NVIC_Configuration 을 살펴 보면  code를 ram 에서 돌릴지 flash 에서 돌릴지에 따라
 
NVIC가 동작할수 있도록 인터럽트 백터 번지를 선언해 주고

인터럽트를 동작하도록 선언 하다.

 
 
------------------------------------------------------------------------------------
 
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;//인터럽트 선언하기 위한 스트럭쳐 정의 함

#ifdef  VECT_TAB_RAM    //선언이 안되어 있음 동작안함  ..
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */    //flash type으로 컴파일
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //인터럽트 백터 번지 설정   
#endif
 
    //기본적으로 H/W 에 인터럽트 테이블 순서에 따라 우선순위가 정해지나
    //Interrupt Priority Register 를 가지고 S/W 적으로 0~255까지 변경할수 있다.
    //그러나 reset,NMI,hard fault 는 가장 높은 우선순위를 가진다.
    //하나씩 다 설정하면 무척 복잡해서 우선순위 group 을 지원하며
    //
    /* Configure one bit for preemption priority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //인터럽트 운선 순위 설정

    /* Enable the EXTI0 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;    //
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
 
    /* Enable the EXTI1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
 
------------------------------------------------------------------------------------
 
 
 
NVIC_SetVectorTable 에보면 assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); 라는 문장이 있다. 조건이 다르면 에러가 발생되도록 하는것인데 조건이 아래와 같다.
 
#define NVIC_VectTab_RAM             ((uint32_t)0x20000000)
#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \
                                  ((VECTTAB) == NVIC_VectTab_FLASH))
즉 인터럽럽트 백터 번지가 다른것이 들어올경우 에러 처리 ..

 
 
NVIC_Init() 에서 최종적으로 인터럽트를 동작시키거나 죽이는 역활을 한다.

'공부 > STM32' 카테고리의 다른 글

[STM32] Source 보기 7  (0) 2012.11.09
[STM32] Source 보기 6  (0) 2012.11.09
[STM32] Source 보기 4  (0) 2012.11.09
[STM32] Source 보기 3  (0) 2012.11.09
[STM32] SOURCE 보기 2  (0) 2012.11.09

+ Recent posts