STM32-定时器

定时器:有4个独立通道:输入捕获;输出比较PWM生成;单脉冲模式输出;可通外部信号控制定时器(TIMx-ETR);

支持针对定时的增量(正交)编码器、霍尔传感器电路

通用定时器配置步骤:

  • 使能定时器时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟

  • 初始化定时器参数
cs 复制代码
typedef struct
{
  uint16_t TIM_Prescaler;//指定用于分频TIM时钟的预分频器值
                          //实际分频值 = 此参数值+1

  uint16_t TIM_CounterMode; //指定计数器计数模式
                                       - TIM_CounterMode_Up: 向上计数模式(从0递增到ARR)
                                       - TIM_CounterMode_Down: 向下计数模式(从ARR递减到0)
                                       - TIM_CounterMode_CenterAligned1: 中心对齐模式1
                                       - TIM_CounterMode_CenterAligned2: 中心对齐模式2
                                       - TIM_CounterMode_CenterAligned3: 中心对齐模式3 

  uint16_t TIM_Period;//指定将在下一次更新事件时加载到自动重载寄存器(ARR)的值
 
  uint16_t TIM_ClockDivision;  //指定时钟分频因子(用于数字滤波器)
                                       - TIM_CKD_DIV1: 不分频(Tclk = TIM时钟)
                                       - TIM_CKD_DIV2: 2分频(Tclk = TIM时钟/2)
                                       - TIM_CKD_DIV4: 4分频(Tclk = TIM时钟/4) */

  uint8_t TIM_RepetitionCounter;//指定重复计数器值(仅高级定时器TIM1和TIM8支持)
                                      
} TIM_TimeBaseInitTypeDef;
  • 设置定时器中断类型,并使能
cs 复制代码
/**
  * @brief  使能或禁用TIM定时器的中断
  * @param  TIMx: 指向TIM外设的指针,例如TIM1、TIM2等
  * @param  TIM_IT: 指定要配置的中断源,可使用逻辑或组合多个中断源
  *                 例如: TIM_IT_Update(更新中断)、TIM_IT_CC1(通道1比较中断)
  * @param  NewState: 新状态,可选择ENABLE或DISABLE
  */
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
  • 设置定时器中断优先级使能定时器通道
  • 开启定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

  • 编写定时器中断服务函数

void TIM4_IRQHandler(void)【每个不一样可以去启动文件查看】

cs 复制代码
/**
  * @brief  检查指定TIM定时器的中断状态标志
  * @param  TIMx: 指向TIM外设的指针,如TIM1、TIM2等
  * @param  TIM_IT: 指定要检查的中断源,可使用逻辑或组合多个中断源
  *                 例如: TIM_IT_Update(更新中断)、TIM_IT_CC1(通道1比较中断)
  * @retval ITStatus: 中断状态(SET = 中断发生; RESET = 中断未发生)
  */
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
cs 复制代码
/**
  * @brief  清除指定TIM定时器的中断挂起标志
  * @param  TIMx: 指向TIM外设的指针,如TIM1、TIM2等
  * @param  TIM_IT: 指定要清除的中断源,可使用逻辑或组合多个中断源
  *                 例如: TIM_IT_Update(更新中断)、TIM_IT_CC1(通道1比较中断)
  * @note   必须在中断处理完成后调用此函数,否则会持续触发中断
  * @note   通过向TIMx_SR寄存器的对应位写入0来清除标志
  * @example TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除TIM3的更新中断标志
  */
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

代码实现(500msLED电平翻转一次)

cs 复制代码
#include "time.h"
#include "led.h"


/*******************************************************************************
* 函 数 名         : TIM4_Init
* 函数功能		   : TIM4初始化函数
* 输    入         : per:重装载值
					 psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM4_Init(u16 per,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
	
	TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值(设置溢出中断值)
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
	
	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);	
	
	TIM_Cmd(TIM4,ENABLE); //使能定时器	
	
}
/*******************************************************************************
* 函 数 名         : TIM4_IRQHandler
* 函数功能		   : TIM4中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update))//查询中断标志位
	{
		LED2=!LED2;
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);	//清除标志位
}

主函数代码

cs 复制代码
    u8 i;
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
	TIM4_Init(1000,36000-1);  //定时500ms
	
相关推荐
xuxg20051 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT2 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen3 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠6 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_6 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技8 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计8 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦9 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报9 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业9 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件