栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32-TIM---定时器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32-TIM---定时器

TIM—定时器 1.定时器介绍

基本定时器:驱动DAC、DMA请求、中断

通用定时器:输入捕获、输出捕获、PWM、单脉冲输出、中断、DMA请求

高级定时器:输入捕获、输出捕获、PWM、单脉冲模式输出、带可编程死区的互补输出、使用外部信号控制定时器且可实现多个定时器互连的同步电路、中断/DMA 请求、支持定位用增量(正交)编码器和霍尔传感器电路、外部时钟触发输入或逐周期电流管理

2.寄存器 2.1定时器时钟

使用APB1的定时器

基本定时器:TIM6、TIM7

通用定时器:TIM2-TIM5、TIM12-TIM14

#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)

使用APB2的定时器

通用定时器:TIM9-TIM11

高级定时器:TIM1、TIM8

#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000001)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00000002)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00040000)
2.2定时器配置寄存器

结构体:TIM_TimebaseInitTypeDef

结构体成员名称作用
TIM_Prescaler预分频系数预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。
CK_INT是内部时钟源的频率,根据APB1的倍频器送出的时钟频率。
其值范围是从0 – 65535。
TIM_CounterMode计数模式计数模式:向上计数、向下计数、向上向下双向计数
向上模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。
向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
TIM_Period自动装载值设置定时器自动重载计数周期值,在事件产生时更新到影子寄存器。
其值范围是从0 – 65535。
TIM_ClockDivision时钟分频因子设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比。
TIM_RepetitionCounter重复计数器通过此参数可以非常简单的控制 PWM 输出个数。此成员只针对于高级定时器配置,基本定时器与通用定时器不用设置。
2.2.1时钟分频因子

定时器时钟分频因子TIM_ClockDivision是决定数字滤波器采样频率的参数。

3.配置方法

(1)使能定时器时钟

​ 配置时钟的时候选择对应的时钟。

(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等

​ 一般配置成通内部时钟源相同数值

(3)设置定时器中断类型,并使能

​ 要先开启中断分组,根据中断优先级分组配置

(4)设置定时器中断优先级,使能定时器中断通道

(5)开启定时器

(6)编写定时器中断服务函数

​ 进入中断服务函数首先检测是否有中断标志位,执行完事件后再清除中断标志位。

void TIM4_Init(u16 per,u16 psc)
{
	TIM_TimebaseInitTypeDef TIM_TimebaseInitStructure;//定义时钟结构体
	NVIC_InitTypeDef NVIC_InitStructure;//定义中断结构体
    
	//(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;//时钟分频因子
	TIM_TimebaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimebaseInit(TIM4,&TIM_TimebaseInitStructure);//初始化定时器
	
    //(3)**设置定时器中断类型,并使能**
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
	
    //(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); //使能定时器	
}

//调用定时器
TIM4_Init(5000-1,8400-1);  //定时500ms,-1是因为定时器预分频器内部会自动加 1

//(6)**编写定时器中断服务函数**
void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update))//检测中断标志位
	{
		led2=!led2;//执行中断事件
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
}
4.定时器工作原理待后续补充

讲解不到位的希望大家指出,有需要我讲解的部分,希望大家提出,我会出文档讲解。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784565.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号