[[FrontPage]] *外部割込み/イベントコントローラ(EXTI) [#hccbc89a] 各GPIOの0はEXTIの0に、GPIOの1はEXTIの1にといった具合に、15まで対応する形でつながっています。 #contents **クロックの供給とGPIOの初期化 [#l304b88c] /* Enable Button GPIO clock */ RCC_APB2PeriphClockCmd(GPIOX_RCC | RCC_APB2Periph_AFIO, ENABLE); /* Configure Button pin as input floating */ GPIO_InitStructure.GPIO_Pin = OB_SW_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(OB_SW_PORT, &GPIO_InitStructure); **EXTIとして使用するGPIOの指定 [#nfd9d55c] GPIO_EXTILineConfig(GPIO_PortSourceGPIOx , GPIO_PinSourcex); :GPIO_PortSource|使用するGPIOポートをGPIO_PortSourceGPIO&color(blue){x};として指定します。&color(blue){x};にはAからGまでが入ります。 :GPIO_PinSource|使用するGPIOピンを、GPIO_PinSource&color(blue){x};として指定します。&color(blue){x};には0から15まで入ります。 **EXTIの初期化 [#q92979b5] EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); **NVICの設定 [#w2101e73] NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); -NVIC_PriorityGroup_0から4の5個 -pre-emptionの数字が低いの方が優先順位が高い、例えば:0が1より優先が高い。 -pre-emptionは同じの場合、subpriorityの数字を確認する、小さいの方が高い。 **EXTI割込み(ライン0-4) [#v8cf930c] ***EXTI0_IRQHandler() [#t2ccbc25] void EXTI0_IRQHandler(void) { /* Clear the Key Button EXTI line pending bit */ EXTI_ClearITPendingBit(EXTI_Line0); 処理(); } ***EXTI_ClearITPendingBit(EXTI_Linex) [#tdea1be4] -EXTI割込みの割込みペンディングビットをクリアします。 :EXTI_Linex|クリアする対象のEXTIラインをEXTI_Line&color(blue){x};の組み合わせで指定します。&color(blue){x};には0から19までの数値が入ります。 **EXTI割込み(ライン5-9) [#c47eaf0d] ***EXTI9_5_IRQHandler() [#t5623178] void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line5) != RESET) { 処理(); } } **EXTI割込み(ライン15-10) [#wc882e0e]