인터럽트를 살리는 루틴이 있다.
------------------------------------------------------------------------------------
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 |