stm32学习笔记 TIM定时器中断1.定时器基本定时功能(含代码)

TIM定时器分四个部分

目录

一.定时器基本定时功能

二.定时器输出比较功能

三.定时器输入捕获功能

四.定时器编码接口


一.定时器基本定时功能

RCC时钟树

SystmInit函数

外部晶振出问题会导致程序时钟慢了十倍

stm32C8t6 TIM1-4

RCC内部时钟

高级定时器 TIM1,TIM8--APB2总线

PWM波

三相五刷电机

通用定时器 TIM2-5   APB1总线

外部时钟ETR/TRGI

TRGI---外部时钟模式1,它还有触发输入和从模式

ITR信号

ETR,外部引脚---外部时钟模式2 配置极性选择,边沿检测,预分频器

黄字是时基单元

基本定时器 TIM6-7 APB1

只能选择内部时钟72MHZ

预分频器对时钟进行预分频,计数器自增计数,当计数值达到自动重装值时,计数值清零更新中断和更新事件

预分频的值于实际分频系数有一个数的偏移

计数器计数频率:CK_CNT=CK_PSC/(PSC+1)

计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)

移出时间:1/计数器溢出频率

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//运行控制

//配置时钟源选择

 void TIM_InternalClockConfig(TIM_TypeDef* TIMx);


void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);

中断事件源控制

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

写分频值

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);

当前计数器记到哪了

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

#include "stm32f10x.h"                  // Device header
extern uint16_t NUM;
void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	TIM_InternalClockConfig(TIM2);//通用定时器
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period=10000-1;//自动重装 少 比较低的频率计比较少的数
	TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//预分频 多
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器高级定时器才有,不需要配置
	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//避免刚初始化就进入中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	//定时器就可以开始工作,当产生更新时,就会触发中断
	TIM_Cmd(TIM2,ENABLE);
}

void TIM2_IRQHandler(void)
{
		if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
		{
		  TIM_ClearITPendingBit(TIM2,TIM_IT_Update);

		}
	}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这段代码中,Timer_Init函数用于初始化定时器TIM2和GPIOA外设的时钟。首先,通过调用RCC_APB1PeriphClockCmd函数打开TIM2外设的时钟,然后通过调用RCC_APB2PeriphClockCmd函数打开GPIOA外设的时钟。接下来,使用GPIO_InitTypeDef结构体对GPIOA进行配置,设置GPIOA的模式为输入上拉模式,引脚为GPIO_Pin_0,速度为50MHz。然后,使用TIM_ETRClockMode2Config函数配置TIM2的外部时钟模式,设置时钟分频系数为TIM_ExtTRGPSC_OFF,外部时钟极性为TIM_ExtTRGPolarity_NonInverted,外部时钟滤波器值为0x0F。接着,使用TIM_TimeBaseInitTypeDef结构体对TIM2进行配置,设置时钟分频系数为TIM_CKD_DIV1,计数模式为向上计数模式,计数器周期为10-1,预分频器值为1-1,重复计数器值为0。然后,使用TIM_ClearFlag函数清除TIM2的更新标志位,使用TIM_ITConfig函数使能TIM2的更新中断。接下来,使用NVIC_InitTypeDef结构体对TIM2的中断进行配置,设置中断优先级组为NVIC_PriorityGroup_2,中断通道为TIM2_IRQn,使能中断,设置抢占优先级为2,子优先级为1。最后,使用TIM_Cmd函数使能TIM2定时器。 而Timer_GetCounter函数用于获取TIM2的计数器值,通过调用TIM_GetCounter函数获取TIM2的计数器值,并返回给调用者。 综上所述,Timer_Init函数用于初始化TIM2定时器和GPIOA外设的时钟,并对TIM2进行配置,使其能够按照设定的参数进行定时计数。而Timer_GetCounter函数用于获取TIM2的计数器值。 #### 引用[.reference_title] - *1* *2* *3* [STM32的时钟控制RCC和外设定时器](https://blog.csdn.net/michaelchain/article/details/119627776)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值