stm32 定时器 通用定时器

STM32F10xxx

2个基本定时器(TIM6、TIM7)
4个通用定时器(TIM2、 TIM3、 TIM4和TIM5)
2个高级定时器(TIM1、TIM8)

每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作

TIMx主要功能

16位向上、向下、向上/向下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
使用外部信号控制定时器和定时器互连的同步电路
如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
支持针对定位的增量(正交)编码器和霍尔传感器电路
触发输入作为外部时钟或者按周期的电流管理

TIMx配置步骤

1.使能定时器时钟
2.初始化定时器参数,预分频器的值、自动重装载的值等设定
3.设置定时器中断类型
4.初始化NVIC外设,设置定时器中断优先级
5.开启定时器
6.编写定时器处理函数

举例

void TIM4_IRQHandler()
{
	if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1)
	{
		delay_ms(10);

		led1 = ~led1;
	}
	
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
} 

typedef struct
{
	uint16_t TIM_Prescaler; //预分频器的值
	uint16_t TIM_CounterMode; //计数模式
	uint16_t TIM_Period; //自动重装载的值 
	uint16_t TIM_ClockDivision; //时钟分频
	uint8_t TIM_RepetitionCounter; //重复计数器
} TIM_TimeBaseInitTypeDef;   

void TIM4_init(u16 per, u16 pre)
{
	TIM_TimeBaseInitTypeDef tim = {0};

	NVIC_InitTypeDef nvic = 
	{
		TIM4_IRQn,
		2,
		2,
		ENABLE
	};

	tim.TIM_Prescaler = pre;
	tim.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数,常用
	tim.TIM_Period = per;
	tim.TIM_ClockDivision = TIM_CKD_DIV1; //时钟1分频
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器时钟

	TIM_TimeBaseInit(TIM4, &tim); //初始化定时器参数

	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //设置定时器中断类型,发生哪种事件

	NVIC_Init(&nvic); //初始化NVIC

	TIM_ClearFlag(TIM4, TIM_IT_Update); //清中断

	TIM_Cmd(TIM4, ENABLE); //开启定时器
}

定时器定时时间计算

Tout = ((Period)*(Prescaler+1))/Tclk; //mb == us
500000 = (1000 * 36000)/72	//500000us
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值