一、概述
1、FM33LC0XX 的 4 组 GPIO(A~D)最多可以产生 16 个 EXTI 中断,每组 GPIO 分别可以产生 4 个EXTI 中断标志
2、EXTI还可以配置输入信号的有效边沿,支持上升沿、下降沿、上升下降沿触发中断,或者禁止EXTI中断触发,由EXTI_EDS寄存器配置。
二、外部中断引脚配置
三、EXTI信号输入示意图
四、软件操作步骤
如需在 Sleep/DeepSleep 模式下启动 EXTI 中断唤醒功能,推荐按照如下步骤进行操作:
1、关闭所有 EXTI 使能
2、配置 SYSCLKSEL 寄存器(0x0x4000020C)的 EXTICKSEL 位为 1,选择 LSCLK 进行 EXTI采样
3、根据需要打开或关闭 EXTI 数字滤波使能
4、配置相应 GPIO 为输入
5、配置 EXTI_SEL 寄存器选择对应的 IO
6、置位 OPCCON1.EXTICKE,打开 EXTI 工作时钟使能
7、等待至少 4 个 LSCLK 周期
8、配置 EXTI_EDS 触发边沿选择,使能所需的 EXTI 中断
正常进入 Sleep 模式芯片上电后默认关闭所有 EXTI,同时默认的引脚中断采样时钟是系统时钟 APBCLK。如果用户使用系统时钟产生 EXTI,推荐流程如下:
1、打开数字滤波使能(如果需要)
2、配置 GPIO 为输入
3、置位 OPCCON1.EXTICKE,打开 EXTI 工作时钟使能
4、等待至少 4 个 APBCLK 周期
5、配置 EXTI_EDS 触发边沿选择,使能所需的 EXTI 中断如果希望使用低速的 LSCLK 来产生 EXTI,推荐流程如下:
6、将 EXTI 采样时钟配置为 LSCLK
7、打开数字滤波使能(如果需要)
8、配置 GPIO 为输入
9、置位 OPCCON1.EXTICKE,打开 EXTI 采样时钟使能
10、等待至少 4 个 LSCLK 时钟周期
11、配置 EXTI_EDS 触发边沿,使能所需的 EXTI 中断
程序:
1、GPIO初始化及配置EXTI相关寄存器
void GPIO_interrupt_init(void)
{
FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.pin = FL_GPIO_PIN_6;
GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = DISABLE;
GPIO_InitStruct.remapPin = DISABLE;
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
FL_RCC_EnableEXTIOnSleep();
FL_RCC_EnableGroup1OperationClock(FL_RCC_GROUP1_OPCLK_EXTI);
FL_GPIO_SetTriggerEdge(GPIO,FL_GPIO_EXTI_LINE_9,FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE);
FL_GPIO_SetExtiLine9(GPIO,FL_GPIO_EXTI_LINE_9_PC6);
FL_GPIO_EnableDigitalFilter(GPIO, FL_GPIO_EXTI_LINE_9);
FL_GPIO_SetTriggerEdge(GPIO,FL_GPIO_EXTI_LINE_9,FL_GPIO_EXTI_TRIGGER_EDGE_RISING);
FL_GPIO_ClearFlag_EXTI(GPIO,FL_GPIO_EXTI_LINE_9);
NVIC_DisableIRQ(GPIO_IRQn);
NVIC_SetPriority(GPIO_IRQn,1);
NVIC_EnableIRQ(GPIO_IRQn);
}
2、中断服务函数
void GPIO_IRQHandler()
{
if(FL_GPIO_IsActiveFlag_EXTI(GPIO,FL_GPIO_EXTI_LINE_9))
{
FL_GPIO_ClearFlag_EXTI(GPIO,FL_GPIO_EXTI_LINE_9);
printf("触发 PC6 EXTI9 外部中断");
}
}
|