stm32-通用定时器原理及代码分析

目录

定时器:基本,通用

一,基本定时器:

作用:

结构图:

二、通用定时器:

作用:

结构图:

三、代码分析:

1、选择时钟

2、配置时基单元

3、产生中断

4、使用定时器


定时器:基本,通用

一,基本定时器:

作用:

        ● 16位自动重装载累加计数器
        ● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
分频
        ● 触发DAC的同步电路
        ● 在更新事件(计数器溢出)时产生中断/DMA请求

结构图:

         timxclk一般为72M沿着线路先到达预分频处(TIMx_CNT)

        预分频:(16位,所以max:65535),设置为0即72/(0+1)以此类推。

        分屏完到达计数器处:(16位,所以max:65535)(TIMx_CNT)

        计数器:遇到一个上升沿加一:加到固定值触发后面波浪箭头(固定值自己设置:自动重装载寄存器(TIMx_ARR):16位)

        我们简单算一下最大计数时间。频率f=72MHZ/(预分频值*重装载值)

        time=1/f        只要f取最小即可。最后f=53.6523235s左右。

        一个定时器还可以做另一个定时器输入。所以三个定时器几乎可以定时8000年。

        我们简单讲一下这个至DAC;这里可以设置一个主模式。把最下面那个事件映射到TRGO.这样我们就不需要频繁使用中断。它可以自动运行、

二、通用定时器:

作用:

●包含所有基本定时器功能。
4个独立通道:
        ─输入捕获
        ─输出比较
        ─PWM生成(边缘或中间对齐模式)
        ─单脉冲模式输出

● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
        ─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
        ─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
        ─输入捕获
        ─输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管

结构图:

将这幅图分为三部分:基本定时器图上,基本定时器图下,基本定时器。

基本定时器图上:可以简单理解为产生时钟的部分:复杂的线路不过是不同不同方式的提供时钟方式。

基本定时器前面已讲。

基本定时器图下:输出捕获,输入捕获。

三、代码分析:

定时时间计算方式:time = ((arr+1)*(psc+1))/clk ;

  clk:定时器的输入时钟频率(单位MHZ)time:定时器溢出时间(单位为us)

令arr=4999;psc:7199所以time = ((4999+1)×(7199+1))/72 = 500000us = 500ms .

1、选择时钟

        以TIM3为例,打开TIM3时钟。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

选择时基单元时钟。这有很多选项我们选择对应内部时钟。(默认)可以不写,但如果选择其他路就要写。

TIM_InternalclockConfig(TIM2);

2、配置时基单元

把这些设置为一个结构体,然后配置。其中TIM_TimeBaseStructure.TIM_ClockDivision = 0; 和滤波有关随意设置。

得到代码:

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    TIM_ClearFlag(TIM3,TIM_FLAG_Updata);//TIM_TimeBaseInit会导致中断标志位为1,为了更准确我们清除它。

3、产生中断

即图中UI那个箭头。

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;//中断源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级分组(只能分组一次建议放到主函数)
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//子优先级,响应优先级。
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能,失能		
NVIC_Init(&NVIC_InitStruct);	

4、使用定时器

TIM_Cmd(TIM3,ENABLETIM_Cmd(TIM3,ENABLE););

注:常用函数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小趴菜学习记录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值