定时中断
EXIT
EXTI(External Interrupt)是一种外部中断功能,它允许微控制器(MCU)响应外部事件或信号。外部中断是一种重要的硬件特性,它使得微控制器能够在特定事件发生时立即采取行动,而无需持续轮询或检查外部引脚的状态,从而提高了系统的效率和响应速度。外部中断通常由微控制器的某个输入引脚触发。当这个引脚的电平变化(例如,从低电平变为高电平,或从高电平变为低电平)或达到某个特定的电平持续时间时,EXTI会生成一个中断请求。微控制器的中断控制器接收到这个请求后,如果相应的中断使能位已经被设置,就会触发一个中断服务例程(ISR),执行预定义的中断处理代码。
在配置EXTI时,开发者需要指定以下参数:
中断引脚:选择哪个GPIO(通用输入输出)引脚作为外部中断的输入。
触发模式
上边沿:指的是数字信号从低电平(0)跳变到高电平(1)的瞬间。
下降沿:数字信号从高电平(1)跳变到低电平(0)的瞬间。
双边沿:双边沿意味着无论信号是从低到高还是从高到低,任何一种跳变都会触发中断或事件处理。
中断优先级:根据需要处理中断的紧迫性,设置中断的优先级。中断使能:启用或禁用外部中断功能。
TIM定时器
输入捕获
输出比较
编码器接口
主从触发模式

基本定时器
预分频器:对输入的基准频率提前进行一个分频的操作。
计数器:对预分频的计数时钟进行计数,计数时钟每来一个上升沿,计数器+1(0~65535)
自动重装寄存器:存的是写入的计数目标,当计数值等于自动重装值,那就是计时时间到,产生中断信号清零计数器。
更新中断:通往NVIC
更新事件:不会触发中断,但会触发内部其他电路工作。

通用定时器
向上计数模式
向下计数模式
中央对齐模式

定时中断基本结构

第一步,开启RCC时钟
第二步,选择时基单元的时钟源(对于定时中断选择内部时钟模式)
第三步,配置时基单元
第四步,配置输出中断控制,允许更新中断输出到NVIC
第五步,配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
第六步,使能计数器
配置所用到的库函数
(1)恢复缺省配置
Tim.h第1054
1 | TIM_DeInit(TIM_TypeDef* TIMx); |
(2)时基单元初始化
Tim.h第1055
1 | TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); |
(3)把结构体变量赋默认值
Tim.h第1063
1 | TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); |
(4)使能计数器(对应运行控制)
(计数器的种类,使能/失能)
Tim.h第1067
1 | TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); |
(5)使能中断输出信号
Tim.h第1069
(选择定时器,选择中断输出,使能/失能)
1 | TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); |
(6)时基单元的时钟选择部分
选择内部时钟模式
1 | TIM_InternalClockConfig(TIM_TypeDef* TIMx); |
ITRx-外部时钟模式1
1 | TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter); |
(选择定时器类型,选择TIx某个引脚,输入的极性,输入的滤波器)
TIx捕获通道-外部时钟模式
1 | TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter); |
ETR外部时钟-外部时钟模式1
(选择定时器类型,外部触发预分频器,输入的极性,输入的滤波器)
1 | TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter); |
ETR外部时钟-外部时钟模式2
(选择定时器类型,外部触发预分频器,输入的极性,输入的滤波器)
1 | TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, |
单独配置ETR引脚的预分频器,极性,滤波器
1 | TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter); |
(7)单独修改预分频值
1 | TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); |
(8)改变计数器的计数模式
1 | TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); |
(9)自动重装器预装功能配置
1 | TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); |
(10)手动给计数器一个计数值
1 | TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); |
(11)手动给自动重装器一个计数值
1 | TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload); |
(12)获取当前计数器的值
1 | TIM_GetCounter(TIM_TypeDef* TIMx); |
(13)获取当前预分频值的值
1 | TIM_GetPrescaler(TIM_TypeDef* TIMx); |
(14)获取标志位和清除标志位
1 | FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); |
结构体的参数
1 | TIM_TimeBaseInitStructure.TIM_Period=1000-1;//ARR自动重装器的值 |

若想定时1s,(定时频率为1HZ“)
对72M进行7200分频,得到10K的计数频率,计10000个数,就是1s
预分频器时序

CK_PSC:预分频器的输入时钟(选内部时钟一般是72HZ)
CNT_EN:CEN(计数器使能)是控制寄存器1(CR1)中的一个位,位于位0。这个位用于启动或停止定时器的计数器。当CEN位被设置为1时,定时器的计数器开始计数;当它被清零(设置为0)时,计数器停止计数。
CK_NET:计数器时钟
代码
定时中断Timer.c
1 |
|
定时器外部时钟
1 |
|