2010年12月4日 星期六

STM32 多個外部中斷設定方式(使用stm32f10x_lib)

一、打開 GPIO 時鐘及重映射功能時鐘。

/* System Clocks Configuration */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );



二、打開/設定 外部中斷的 中斷套嵌。

/* NVIC configuration */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;
NVIC_Init(&NVIC_InitStructure);

注意:不同的外部中斷需各別使用 NVIC_Init() 函式來設定,不可以用「|」OR 運算來同時設定。


三、設置 GPIO 腳位、屬性。

/* Configure the GPIO ports */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOE, &GPIO_InitStructure);

注意:不同的 IO PORT 需各別使用 GPIO_Init() 函式來設定,但同一個 PORT 可以用「|」OR 運算來同時設定。


四、連結 外部中斷線 到 GPIO線(PIN0~PIN15)

/* Connect EXTI Line to GPIO Pin */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);

注意:不同 GPIO Pin 需各別使用 GPIO_EXTILineConfig() 函式來設定,不可以用「|」OR 運算來同時設定。


五、設置外部中斷反應方式並打開外部中斷

/* Configure EXTI Line to generate an interrupt on falling edge */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3;
EXTI_Init(&EXTI_InitStructure);

注意:所有的外部中斷可以使用一次/多次 EXTI_Init() 函式來設定,並可以用「|」OR 運算來同時設定。


六、最後在 stm32f10x_it.c 處理中斷函式…

void EXTIx_IRQHandler(void)
{
}

沒有留言:

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...