6-2 定时器定时中断

文章详细介绍了如何在STM32中配置定时器中断,包括开启时钟、选择时基单元、配置中断、NVIC设置以及启用计数器。主要函数如TIM_TimeBaseInit用于时基单元初始化,TIM_Cmd启用计数器,TIM_ITConfig配置中断,NVIC_Init初始化NVIC中断控制器。
摘要由CSDN通过智能技术生成

title: 6-2 定时器定时中断
tags:

  • STM32
    categories:
  • STM32学习

[[6-1_TIM定时中断]]

定时器中断

新建的Timer.c & Timer.h文件在System文件夹下

  1. RCC开启时钟
  2. 选择时基单元的时钟源,对于定时中断,我们就选择内部时钟源
  3. 配置时基单元,包括预分频器、自动重装器、计数模式
  4. 配置输出中断控制,阴虚更新中断到NVIC
  5. 配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
  6. 运行控制
  7. 整个模块配置完成后,我们还需要使能一下计数器,不然计数器不会运行
  8. 定时器中断函数,这样这个中断函数每隔一段事件就能自动执行一次了

库函数解析


TIM_TimeBaseInit时基单元初始化,用来配置时基单元的
TIM_Cmd用于使能计数器,对应时基单元的运行控制
TIM_ITConfig用于使能中断输出信号 ,对应中断输出控制(config v.配置)

  • 像这样的ITConfig后面还会经常遇到,就是使能外设的中断输出

TIM_InternalClockConfig选择内部时钟,参数只有一个,选择之后连线就是这样
TIM_ITRxExternalClockConfig选择ITRx其他定时器时钟,第一个参数TIMx选择要配置的定时器,第二个参数InputTrigggerSource选择要接入哪个其他定时器,调用后连接变成这样
TIM_TIxExternalClockConfig选择TIx捕获通道的时钟,第二个参数TIxExternalCLKSource选择TIx具体的某个引脚,ICPolarity和ICFilter,输入的极性和滤波器,调用后这样连接
TIM_ETRClockMode1Config选择ETR通过外部时钟模式1输入的时钟,参数ExtTRGPrescaler外部触发预分频器(scalar n.标量)
TIM_ETRConfig单独用来配置ETR引脚的预分频器、极性、滤波器等这些参数

  1. 时钟源的选择用这六个函数
  1. 时基单元,用TimeBaseInit函数
  2. 中断输出控制,用ITConfig函数
  3. NVIC,用NVIC_Init函数
  4. 运行控制,用TIM_Cmd函数
  • TIM_PrescalarConfig,用于单独写预分频值
  • TIM_CounterModeConfig,用于改变计数器的计数模式
  • TIM_ARRPreloadConfig,自动重装器预装功能配置
  • TIM_SetCounter,给计数器写入一个值
  • TIM_SetAutoreload,给自动重装器写入一个值
  • TIM_GetCounter,获取当前计数器的值,返回值就是当前计数器的值
  • TIM_GetPrescalar,获取当前预分频器的值

timer.c文件

#include "stm32f10x.h"                  // Device header

extern uint16_t Num;    //告诉编译器,现在有Num这个变量,在别的文件中定义了,至于在哪自己去找
//此处并没有定义新的变量,操作的仍然是main.c文件中的Num
//当然也可以让中断函数放到main函数中,这样这个声明就不需要了


void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //指定时钟分频,选择1分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   //选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;    //period——ARR自动重装器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;        //prescaler——PSC预分频器的值
	//通过设置PSC和ARR的取值,来设定计时的长短
	//72Mhz/7200=10k,10k的时间计10000个数,刚好就是1s,有一位是留给进位的
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;      //repetitioncounter——重复计数器的值,但是只有高级计数器才有,我们直接置零便可
	//如果需要设置计数器的值,可以用setcounter和getcounter
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);


	TIM_ClearFlag(TIM2, TIM_FLAG_Update);   //手动清除标志位,避免刚初始化晚就进中断的问题。ChatGPT说TIM_ClearITFlag()函数只会清除中断相关标志位,因此涉及到中断标志位的清除推荐使用这个避免清除了其他标志位造成出错
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  //ITupdate,更新参数,使能中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //选择分组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);   //最后清除标志位
	}
}
*/

定时器外部时钟

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值