参考文章: 中断-NVIC 以及EXTI外设详解
这里使用STM32F411U6 微控制器 , 这里使用PC15产生脉冲信号, 并利用PA1 引脚输入信息来触发外部中断 .
1. 初始化外部中断 EXIT_init()
- 对用到的外设进行时钟使能
- 配置引脚PC15 为输出 , 推挽 , 上拉 , 100MHZ 模式
- 配置引脚PA1 为输入 上拉
- 通过 SYSCFG_EXTILineConfig() 函数 将PA1 于中断线 EXTI_Line1 进行连接
- 配置 外部中断线 1 配置为上升沿触发模式
void EXIT_init(void)
{
//使能外设时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//初始化GPIOC引脚15
GPIO_InitTypeDef GPIO_InitStruct ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT ;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 ;
GPIO_Init( GPIOC, & GPIO_InitStruct);
//初始化GPIOA引脚1
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN ;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 ;
GPIO_Init( GPIOA, & GPIO_InitStruct);
/* 将引脚和中断线进行连接*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA , EXTI_PinSource1 );
EXTI_InitTypeDef EXTI_InitStruct ;
EXTI_InitStruct.EXTI_Line = EXTI_Line1 ;//PA1 对应EXTI_Line1
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt ;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising ;
EXTI_InitStruct.EXTI_LineCmd = ENABLE ;
EXTI_Init(& EXTI_InitStruct) ;
}
2. 配置NVIC 中断服务 NVIC_config()
使能外设中断后, 再送入NVIC再使能
- 配置中断优先级分组
- 配置外部中断 EXTI1 , 设置抢占优先级 以及响应优先级 , 使能外部中断
void NVIC_config(void)
{
/* 优先级分组 */
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
/*配置对应外设中断*/
NVIC_InitTypeDef NVIC_InitStruct ;
NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn ; //外部中断1 通道 IRQn 位于stm32f4xx.h 中196行处
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =2 ; //抢占优先级 2
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2 ; //响应优先级 2
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ; //使能中断
NVIC_Init(& NVIC_InitStruct);
}
3. 编写中断服务函数
中断服务的函数已经写好 位于 启动文件 startup_stm32f411xe.s 下 102 行
DCD EXTI0_IRQHandler ; EXTI Line0
模仿别人将其放在专门一个文件 stm32f4xx_it.c 下
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line1) == 1) //检查EXTI_Line1中断标志位
{
printf("EXTI1_IRQHandler\r\n") ; // 包含头文件 stdio.h
EXTI_ClearITPendingBit(EXTI_Line1) ; //及时清除 EXTI_Line1 的标志位
}
}
4. 主函数
#include "stm32f4xx.h"
# include "USART.h"
#include "EXIT.h"
/*使用 PC15 产下下降沿脉冲 传入到 PA1 使用 用EXTI_Line1 检测下降沿
出发中断 , 然后用到串口打印触发的信息
*/
void delay_ms(uint32_t ms) ;
int main()
{
/*串口初始化*/
GPIO_init();
USART_init();
/*配置外设中断 以及NVIC 使能 */
EXIT_init() ;
NVIC_config() ;
while(1)
{
Test() ;
__NOP() ;
__NOP() ;
}
}