PY32F003F18的中断线有30条,其中Line20~Line28保留不用,见下图:
Line0~Line8需要配置,选择引脚和中断线连接,和GPIO引脚对应,Line9~Line15和PA9~PA15一一对应。见下图:
外部中断选择寄存器1(EXTI_EXTICR1)中bit1:0=00B,则选择"PA0连接到中断线Line0
外部中断选择寄存器1(EXTI_EXTICR1)中bit1:0=01B,则选择"PB0连接到中断线Line0
外部中断选择寄存器1(EXTI_EXTICR1)中bit1:0=10B,则选择"PF0连接到中断线Line0
外部中断选择寄存器1(EXTI_EXTICR1)中bit9:8=00B,则选择"PA1连接到中断线Line1
外部中断选择寄存器1(EXTI_EXTICR1)中bit9:8=01B,则选择"PB1连接到中断线Line1
外部中断选择寄存器1(EXTI_EXTICR1)中bit9:8=10B,则选择"PF1连接到中断线Line1
外部中断选择寄存器1(EXTI_EXTICR1)中bit17:16=00B,则选择"PA2连接到中断线Line2
外部中断选择寄存器1(EXTI_EXTICR1)中bit17:16=01B,则选择"PB2连接到中断线Line2
外部中断选择寄存器1(EXTI_EXTICR1)中bit17:16=10B,则选择"PF2连接到中断线Line2
外部中断选择寄存器1(EXTI_EXTICR1)中bit25:24=00B,则选择"PA3连接到中断线Line3
外部中断选择寄存器1(EXTI_EXTICR1)中bit25:24=01B,则选择"PB3连接到中断线Line3
外部中断选择寄存器1(EXTI_EXTICR1)中bit25:24=10B,则选择"PF3连接到中断线Line3
外部中断选择寄存器2(EXTI_EXTICR2)中bit1:0=00B,则选择"PA4连接到中断线Line4
外部中断选择寄存器2(EXTI_EXTICR2)中bit1:0=01B,则选择"PB4连接到中断线Line4
外部中断选择寄存器2(EXTI_EXTICR2)中bit1:0=10B,则选择"PF4连接到中断线Line4
外部中断选择寄存器2(EXTI_EXTICR2)中bit8=0,则选择"PA5连接到中断线Line5
外部中断选择寄存器2(EXTI_EXTICR2)中bit8=1,则选择"PB5连接到中断线Line5
外部中断选择寄存器2(EXTI_EXTICR2)中bit17:16=00B,则选择"PA6连接到中断线Line6
外部中断选择寄存器2(EXTI_EXTICR2)中bit17:16=01B,则选择"PB6连接到中断线Line6
外部中断选择寄存器2(EXTI_EXTICR2)中bit24=0,则选择"PA7连接到中断线Line7
外部中断选择寄存器2(EXTI_EXTICR2)中bit24=1,则选择"PB7连接到中断线Line7
外部中断选择寄存器3(EXTI_EXTICR3)中bit0=0,则选择"PA8连接到中断线Line8
外部中断选择寄存器3(EXTI_EXTICR3)中bit0=1,则选择"PB8连接到中断线Line8
PA9~P15和中断线Line9~Line15一一对应连接。
GPIO通过外部中断线产生中断:
#include "KeyIntrrupt.h"
#include "LED.h"
#include "MyGPIO.h"
void Key1_Interrupt_Init(void);
//函数功能:Key1引脚初始化为外部中断输入
void Key1_Interrupt_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructureure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //GPIOA时钟使能
GPIO_InitStructureure.Pin = GPIO_PIN_12;//选择第12脚
GPIO_InitStructureure.Pull = GPIO_PULLUP;//引脚上拉被激活
// GPIO_InitStructureure.Pull = GPIO_NOPULL;//引脚上拉和下拉都没有被激活
GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_MEDIUM;//配置GPIO速度为中速
GPIO_InitStructureure.Mode = GPIO_MODE_IT_FALLING;//配置为下降沿检测模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStructureure);
//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器
//因为使用了GPIO_MODE_IT_FALLING,所以使能了外部中断线
/*
__HAL_RCC_GPIOA_CLK_ENABLE(); //GPIOA时钟使能
Configure_Pin_Direction_mode(GPIOA,GPIO_PIN_12,GPIO_MODE_IT_FALLING);
Activate_Pull_up_or_Pull_down_for_Pin(GPIOA,GPIO_PIN_12,GPIO_PULLUP);
Select_External_Interrupt_Line(GPIOA,GPIO_PIN_12);
Set_EXTI_line_X_InterruptSwitch(GPIO_PIN_12,GPIO_MODE_IT_FALLING);
// Set_EXTI_line_X_EventSwitch(GPIO_PIN_12,GPIO_MODE_IT_FALLING);
Set_Rising_And_Falling_Mode(GPIO_PIN_12,GPIO_MODE_IT_FALLING);
*/
HAL_NVIC_SetPriority(EXTI4_15_IRQn,0x03,0);
//EXTI4_15_IRQn表示外部中断线4~中断线15,EXTI4_15_IRQn
//设置中断优先级为0x03,0无意义,注意:0<=PreemptPriority<=3,值越大,表示中断优先级越低
//Enable and set Button EXTI Interrupt to the lowest priority
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
//EXTI4_15_IRQn表示外部中断线4~中断线15,EXTI4_15_IRQn
//使能EXTI4_15_IRQn中断
}
//函数功能:GPIO4~GPIO15外部中断服务程序
void EXTI4_15_IRQHandler(void)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != 0x00u)
{//读"GPIO_PIN_12事件挂起标志位",当软件或者硬件产生上升沿/下降沿触发事件时,该位置位。
MCU_LED_Toggle();//输出电平翻转
// __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_12);//清除外部事件标志位
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_12);//清除外部事件标志位
//清除"GPIO_PIN_12外部事件标志位"
//当软件或者硬件产生上升沿/下降沿触发事件时,该位置位;
}
NVIC_ClearPendingIRQ(EXTI4_15_IRQn);//清除EXTI4_15_IRQn中断源的中断标志位
}