【stm32】定时器
1.1、TIM6和TIM7的主要特性● 16 位自动重载递增计数器● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和65536之间● 用于触发 DAC 的同步电路● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢1、TIM6和TIM7寄存器(基本定时器)1.1、控制寄存器偏移地址:0x00复位值:0x0000位15:8 保留,必须保持复位值。位6
stm32f4xx:
APB2 ----> TIM1,TIM8,TIM9,TIM10,TIM11
APB1 ----> TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14
一、定时器介绍
1、基本定时器
1.1、TIM6 和 TIM7 的主要特性

2、通用定时器
2.1、TIM2 到 TIM5 主要特性
2.2、TIM9/TIM12 主要特性

2.3 TIM10/TIM11 和 TIM13/TIM14 主要特性

3、高级定时器
3.1、TIM1 和 TIM8 主要特性

二、寄存器介绍
1、TIM6 和 TIM7 寄存器(基本定时器)
1.1、控制寄存器 1 (TIMx_CR1)

1.2、控制寄存器 2 (TIMx_CR2)
1.3、DMA/中断使能寄存器 (TIMx_DIER)
1.4、状态寄存器 (TIMx_SR)
1.5、事件生成寄存器 (TIMx_EGR)
1.6、计数器 (TIMx_CNT)
1.7、预分频器 (TIMx_PSC)
1.8、自动重载寄存器 (TIMx_ARR)

2、TIM9 和 TIM12 寄存器(通用定时器)
2.1、控制寄存器 1 (TIMx_CR1)
2.2、控制寄存器 2 (TIMx_CR2)
2.3、从模式控制寄存器 (TIMx_SMCR)
2.4、中断使能寄存器 (TIMx_DIER)
2.5、状态寄存器 (TIMx_SR)
2.6、事件生成寄存器 (TIMx_EGR)
2.7、捕获/比较模式寄存器 1 (TIMx_CCMR1)
2.8、捕获/比较使能寄存器 (TIMx_CCER)
2.9、计数器 (TIMx_CNT)
2.10、预分频器 (TIMx_PSC)
2.11、自动重载寄存器 (TIMx_ARR)
2.12、捕获/比较寄存器 1 (TIMx_CCR1)
2.13、捕获/比较寄存器 2 (TIMx_CCR2)

3、TIM10/11/13/14 寄存器(通用定时器)
3.1、控制寄存器 1 (TIMx_CR1)
3.2、状态寄存器 (TIMx_SR)
三、定时器案列
1、基本定时
定时时间计算:1/T=CK_PSC/[(PSC+1)*(ARR+1)]
CK_PSC:时钟频率
PSC:分频系数
ARR:自动重装载值
#include "TIM.h"
#include "LED.h"
TIM_HandleTypeDef TIM1_InitStructure;//定义结构体
void Timer1_Init(void)
{
TIM1_InitStructure.Instance = TIM1;
TIM1_InitStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
TIM1_InitStructure.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//分频因子
TIM1_InitStructure.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式:向上计数
TIM1_InitStructure.Init.Period = 5000 - 1;//自动重装载值ARR
TIM1_InitStructure.Init.Prescaler = 16800 - 1;//分频系数PSC
TIM1_InitStructure.Init.RepetitionCounter = 0;//重复计数器
HAL_TIM_Base_Init(&TIM1_InitStructure);//初始化结构体
HAL_TIM_Base_Start_IT(&TIM1_InitStructure);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)
{
__HAL_RCC_TIM1_CLK_ENABLE();//开启TIM1的时钟
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn,1,1);//设置中断优先级
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);//开启中断
}
}
void TIM1_UP_TIM10_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM1_InitStructure);//中断处理函数
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//中断回调函数
{
if(htim->Instance == TIM1)
{
LED1_Toggle;//LED1翻转
}
}
2、脉冲宽度调制(PWM)输出
#include "PWM.h"
TIM_HandleTypeDef PWM_InitStructure;
TIM_OC_InitTypeDef PWM_InitStruct;
void PWM_Init(void)
{
PWM_InitStructure.Instance = TIM1;
PWM_InitStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
PWM_InitStructure.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//分频因子
PWM_InitStructure.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式:向上计数
PWM_InitStructure.Init.Period = 500 - 1;//自动重装载值ARR
PWM_InitStructure.Init.Prescaler = 84 - 1;//分频系数PSC
PWM_InitStructure.Init.RepetitionCounter = 0;//重复计数器
HAL_TIM_PWM_Init(&PWM_InitStructure);
PWM_InitStruct.OCMode = TIM_OCMODE_PWM1;
PWM_InitStruct.Pulse = (500 - 1)/2;
PWM_InitStruct.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&PWM_InitStructure,&PWM_InitStruct,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&PWM_InitStructure,TIM_CHANNEL_1);
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)
{
__HAL_RCC_TIM1_CLK_ENABLE();//开启定时器1的时钟
__HAL_RCC_GPIOE_CLK_ENABLE();//开启GPIOE的时钟 TIM1_CH1---->PE9
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; //复用推挽输出
GPIO_InitStructure.Pin = GPIO_PIN_9; //引脚9
GPIO_InitStructure.Pull = GPIO_PULLUP; //上拉
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //超高速
GPIO_InitStructure.Alternate = GPIO_AF1_TIM1; //复用功能
HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
}
}
void TIM1_SetCompare(uint32_t compare)
{
TIM1->CCR1 = compare;
}
更多推荐




所有评论(0)