STM32中断学习记录

STM32中断学习记录

中断概念:CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序,继续执行,这一过程称为中断。引发中断的称为中断源。
STM32f407支持82个可屏蔽中断通道。
NVIC介绍:NVIC英文全称是Nested Vectored Interrupt Controller, 中文意思就是嵌套向量中断控制器,它属于M4内核的一个外设,控制着芯片的中断相关功能。
外部中断
STM32F4外部中断/事件控制器(EXTI) 包含多达23个用于产生事件/ 中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(. 上升沿触发、下 降沿触发或边沿触发),还可单独屏蔽。
按键外部中断配置步骤
(1)使能IO口时钟,配置IO口模式为输入模式。
(2)开启SYSCFG时钟。(RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE));
设置IO口与中断线的映射关系。
(SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOX,EXTI_Pin));
(3)配置中断分组NVIC,使能中断通道。如:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //EXTI0中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
(4)初始化EXTI,选择触发方式
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); //初始化
(5)编写中断服务函数
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)1) //获取中断状态
{ delay_ms(10);
if(K_UP
1)
{
led2=0;
}
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除状态
}
定时器中断
STM32通用定时器简介:STM32F4的通用定时器包含一个16位或32位自动重载计数器(CNT )该计数器由可编程预分频器(PSC) 驱动。STM32F4的通用定时器可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出比较和PWM)等。使用定时 器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F4的每个通用定时器都是完全独立的,没有互相共享的任何资源。
通用定时器配置步骤
(1)使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
(2)初始化定时器参数,包含自动重装载值,分频系数,计数方式等。
TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频,分频系数1
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
(3)设置定时器中断类型,并使能
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断 更新中断
(4)设置定时器中断优先级,使能中断通道
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
(5)开启定时器
TIM_Cmd(TIM4,ENABLE); //使能定时器
(6)编写定时器中断服务函数
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)) / /获取中断状态
{
led2=!led2;
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update); / /清除状态
}
使用例子:TIM4_Init(5000-1,8400-1); //定时500ms,每500ms LED闪烁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值