STM32中断(外部中断和定时器中断)
一、外部中断
spi,iic的中断和51单片机不一样,这些在stm32属于外设,是外部中断。
因为STM32的中断非常多,因此必须设置中断优先级
STM32有两个优先级的概念:抢占式优先级和响应式优先级(亚优先级,副优先级)
抢占式优先级:高抢占式优先级的中断事件会打断当前主程序以及中断程序运行,俗称中断嵌套。
响应优先级:在抢占式优先级相同的情况下,高响应优先级的中断优先被响应;
在抢占式优先级相同的情况下,如果有低响应优先级中断正在执行,要等待其结束后才能得到响应,即不能嵌套。
先看抢占式优先级,在看响应优先级,抢占式优先级决定是否会有中断嵌套。
如果抢占式优先级和响应优先级都相同,那么更加官方手册给的各种中断的默认顺序执行。
意思是,如果被分到第1组,那你就可以设置最高2级的抢占式优先级,最高8级的响应优先级。
左图的意思是,可以将那些对应的引脚设置为对应的外部中断输入口,即PA0,PB0,PC0....PG0可以用库函数设置为外部中断0的输入脚。
接下来上外部中断代码(库函数实现,代码未测试不一定对):
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_exti.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
int main()
{RCC_Configuration();GPIO_Configuration();EXTI_Configuration();NVIC_Configuration();while(1);
}
void RCC_Configuration(void)
{SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure; //声明用来装载要设置的GPIO的信息的结构体GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //设置针脚5GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置针脚速度GPIO_Init(GPIOB,&GPIO_InitStructure); //设置为B端口 并将针脚信息传入
}
void EXTI_Configuration(void) //外部中断配置
{EXTI_InitTypeDef EXTI_InitStructure; //声明包含设置信息的结构体EXTI_ClearITPendingBit(EXTI_Line5); //清除中断状态,避免冲突,清除的是5线中断GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); //映射中断线至引脚EXTI_InitStructure.EXTI_Line=EXTI_Line5; //选择中断线,即用第几管脚中断的意思EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //选择中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //设置为下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能EXTI_Init(&EXTI_InitStructure); //初始化中断
}
void NVIC_Configuration(void) //配置外部中断响应优先级
{NVIC_InitTypeDef NVIC_InitStructure; //声明结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断组别为1组NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; //选择要设置的是5线中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //设置抢占优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置响应优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能NVIC_Init(&NVIC_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line5)==SET) //中断产生{EXTI_ClearITPendingBit(EXTI_Line5); //中断清除GPIO_SetBits(GPIOB,GPIO_Pin_5); //这里做中断里要做的操作}
}
二、定时器中断
TIM1,TIM8是高级定时器,TIM2~5是通用定时器,TIM6,TIM7是基本定时器。
我的理解来解释一下上图前三个参数:
计数器分辨:即类似51单片机中的初值可以装多大,16位就是初值可以为0~FFFF。
计数器类型:向上计数就是从0开始计数到设定的初值,向下计数就是从设定的初值开始减到0。
预分频系数:即将定时器速度减慢几倍,比如预分频系数为2,那么定时器计数速度减慢一倍。分频分频,就是把频率分小份嘛,平率小了,耗费的时间就大了。这里可以将预分频系数设置为1~65536任意一个数。
下面上代码:
代码功能为用定时器计数一秒,每秒PB5上的led闪烁一下
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM3_Configuration(void);
void NVIC_Configuration(void);
int main()
{RCC_Configuration();GPIO_Configuration();TIM3_Configuration();NVIC_Configuration();while(1);
}
void RCC_Configuration(void)
{SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3时钟
}
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //设置针脚5GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置针脚速度GPIO_Init(GPIOB,&GPIO_InitStructure); //设置为B端口 并将针脚信息传入
}
void TIM3_Configuration(void) //注TIM主频为72M,这里的设置是设置为1秒的定时器
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3标志位,避免冲突TIM_TimeBaseStructure.TIM_Period=2000; //设置初值TIM_TimeBaseStructure.TIM_Prescaler=35999; //设置预分频系数为36000//主频72000000/36000=2000,意味着分频36000后,1秒钟可以计数2000下,因此上面的初值设置为2000TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置为向上计数TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //设置TIM3信息TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //打开中断允许TIM_Cmd(TIM3,ENABLE); //打开定时器外设
}
void NVIC_Configuration(void) //配置定时器中断响应优先级
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //选择要设置的是定时器3NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //设置抢占优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置响应优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能NVIC_Init(&NVIC_InitStructure);
}
void TIM3_IRQHandler(void)
{TIM_ClearITPendingBit(TIM3,TIM_IT_Update);if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET) //检测PB5的状态并颠倒{ //以达到led一秒闪烁一下的目的GPIO_SetBits(GPIOB,GPIO_Pin_5);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_5);}
}
STM32中断(外部中断和定时器中断)相关推荐
- STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序
STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进电机驱动程序 一.ULN2003驱动器 1.工作原理 2.步距角以及一圈所需步数的计算 二.硬件连接 三.STM32F103定时器中断 ...
- 定时器中断程序 c语言,定时器中断函数的使用
1.定时器与延时的区别 大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效 ...
- 51C语言中断LED闪烁,单片机定时器中断实现LED灯闪烁程序
运用定时器0工作在方式1(16位计数器)实现LED灯的闪烁.先来看看定时器0工作在方式1的逻辑结构图. 从上图可以看到,GATE先经过非门,再和INT0引脚作为或门的输入.这里简单提一下数字电路中的与 ...
- STM32定时器中断实验-学习笔记
目录 目录 目录 通用定时器简介 寄存器 控制寄存器 (TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄存器(TIMx_PSC) TIMx_CNT 寄存器 自动重装载寄存器( ...
- 51单片机学习笔记(郭天祥版)(3)——引脚讲解、数码管静态显示、中断系统(外部中断,定时器中断)...
学习引脚的功能 9引脚 复位管脚,当给2个机器周期(24个时钟振荡周期)的高电平时会复位,单片机正常工作时会给0.5v的低电平 VPD备用电源的输入端,当主电源VCC发生故障降低到某一规定的低电平时, ...
- STM32之外部中断
今天来说下外部中断EXTI 其实外部中断和我们的定时器中断都差不多,只不过定时器中断是利用内部的计数器来进行定时,从而产生定时中断,而外部中断的触发条件是来自于外部,当外部的信息引起了外部中断,那么就 ...
- stm32定时器中断配置及使用
stm32定时器中断配置及使用 定时器中断就是:可以周期性的执行某些功能,而不受main函数的影响. 我们以通用定时器time3为例说明 1.首先配置时钟源为内部时钟,分频和充装载值根据自己需要填入, ...
- 快速复习51单片机的外部中断、计数/定时器中断和串行口中断,加代码实现
目录 1.中断系统的概念 1.1中断的概念 1.2中断系统的概念 1.3中断系统的优点 1.4我们要说的三种中断源 2.外部中断 2.1 外部中断0 代码示范 2.2 外部中断 分析 3.计数/定时器 ...
- 【STM32】定时器中断原理及操作
目录 时钟的选择及分频 定时器中断有关的寄存器 定时器中断有关的库函数 1.时钟使能函数:RCC_APB1PeriphClockCmd 2.定时器初始化函数:TIM_TimeBaseInit 3.定时 ...
- stm32 TIM定时器中断
一.TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断: 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 ...
最新文章
- mysql忘记密码重置
- 黄金时代:这个地区17所新大学建设,提速!
- 物联网云平台-贝壳物联入门详细使用方法
- java基础---System类
- hadoop集群中datanode启动几秒钟自动关闭
- 数据库服务器网页,服务器 数据库 网页前端
- 某大型银行深化系统技术方案之十:核心层之任务调度
- java和php基础部分相同或异同
- Mujoco基本情况介绍
- 常见错误:无效的文件dsn
- 安装pytorch1.10.0/cu111时报错:no matching distribution found for torchvision==0.11.0+cu111
- pycocotools安装,简单易懂
- 新手如何租用阿里云服务器(图文教程)
- 在技术招聘中,HR 如何识别候选人的“味道”?
- vscode 格式化 json文件
- 如何获得免费虚拟主机,云服务器呢?(免费)
- 中国城市码cityCode映射
- IntelliJ IDEA 创建 Java包
- matlab卡农,又用Mathematica写了一段卡农
- 神经网络量化入门--Folding BN ReLU