目录
图 47 通用定时器寄存器
TIMx_CR1 【0】打开计数器 【APRE 位】影子寄存器搬运数据到ARR的条件
TIMx_DIER 【0】更新中断
TIMx_SR寄存器中的UIF位 读取更新标志
TIMx_PSC寄存器 设置预分频值
TIMx_ARR 设置重载值
TIMx_SMCR 选择时钟源
TIMx_CNT 寄存器 读取计数值
TIMx_SR 【0】读取更新中断
TIMx_RCR 设置更新N次后才触发更新中断
1、控制寄存器 1(TIMx_CR1)
使能计数器、计数方向
2、预分频器 与 自动自动重装载器
设置预分频值、重载值,都是从0开始计数,所以需要把实际值减1.
直接写入数值。
3、中断使能寄存器
选择中断类型
4、计数器
读取当前计数值,直接读取寄存器。
5、状态寄存器
判断状态,可用于判断中断触发类型。
程序设计
寄存器配置
//TIM3初始化
void TIM3_Init(uint16_t Prescaler, uint16_t Period)
{
RCC->APB1ENR |= 1<<1; // 开启tim3时钟
RCC->APB1RSTR|= 1<<1; // 复位tim3配置
RCC->APB1RSTR&= ~(1<<1);
TIM3->ARR = Period; // 预装载值
TIM3->PSC = Prescaler; // 遇到分频值
TIM3->CR1 &= ~(1<<4); // 向上计数
TIM3->CR1|=0x01; //使能定时器 3
TIM3->DIER |= 1; // 使能更新中断
MY_NVIC_Init(2,2, TIM3_IRQn, 2);
}
// TIM3中断服务函数
void TIM3_IRQHandler(void)
{
if(TIM3->SR & 0x1) // 触发更新中断
{
TIM3->SR &= ~(0x1); // 清空中断标志
LED0 = !LED0;
}
}
库函数配置
- 打开定时器时钟
- 初始化定时器的计数模式,预分频值、计数值(自动中装载值)
- 使能定时器中断,并设置中断触发类型
- 设置中断优先级
- 使能定时器
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 1、打开定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
// 2、定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
// 3、使能定时器中断,并指定中断触发类型
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
// 4、中断优先级NVIC设置
//要先设置好中断分组,一般是在数函数设置,NVIC_PriorityGroupConfig()
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
// 5、使能定时器
TIM_Cmd(TIM3, ENABLE);
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
LED1=!LED1;
}
}