stm32定时器tim6tim7,对定时时间的设置与哪些寄存器有关

stm32定时器tim6tim7,对定时时间的设置与哪些寄存器有关,第1张

STM32F10XXX系列包含TIM6、TIM7两个基本定时器,计数器为16位,其功能比较简单,仅支持向上计数,且只能计时,没有外部I/O口。

一、基本定时器的功能框图

1、时钟源TIMxCLK:定时器的时钟源来自系统内部时钟,准确来说由APB1预分频器分频提供,因为TIM6、7都是挂载在APB1上的外设。如果APB1的预分频系数等于1,则频率不变,其他情况,频率乘以2,库函数中APB1的分频系数为2,故定时器的时钟TIMxCLK=362=72MHz。

2、计数器时钟CK_CNT:CK_PSC可看成直接由CK_INT经触发控制器引入,PSC预分频器为16位寄存器,可对TIMxCLK进行1~65536分频,计算公式为:CK_CNT=TIMxCLK/(PSC+1)。

3、计数器CNT:计数器CNT为16位寄存器,只能向上计数,最大值为65535,当计数器有0加到65535并溢出时,可以产生一个更新中断/更新事件。

4、自动重装寄存器ARR:16位寄存器,里面的数值为计数器能达到的最大数值。

5、产生一次中断的时间计算:time=(ARR+1)/(TIMxCLK/(PSC+1))

在实际中,预分频器起分频作用的是其影子寄存器或称为缓冲器。由下图的时序图可见:

ARR的值为FC-1,最开始预分频控制寄存器的值为0,此时预分频系数为1,即计数器时钟为72MHz。当计数器计数到F8时,我们将预分频控制寄存器的值写为1,此时,预分频器缓冲寄存器的值并没有立即更新为1,定时器的时钟依然为72MHz,计数器计数到FC,产生一个更新事件后,才将预分频器缓冲器的值更新为1,此时定时器的时钟变为原来的一半,即36MHz,保证了计数的准确性。

二、时基单元

typedef struct

{

uint16_t TIM_Prescaler; /!< Specifies the prescaler value used to divide the TIM clock

This parameter can be a number between 0x0000 and 0xFFFF /

uint16_t TIM_CounterMode; /!< Specifies the counter mode

This parameter can be a value of @ref TIM_Counter_Mode /

uint16_t TIM_Period; /!< Specifies the period value to be loaded into the active

Auto-Reload Register at the next update event

This parameter must be a number between 0x0000 and 0xFFFF /

uint16_t TIM_ClockDivision; /!< Specifies the clock division

This parameter can be a value of @ref TIM_Clock_Division_CKD /

uint8_t TIM_RepetitionCounter; /!< Specifies the repetition counter value Each time the RCR downcounter

reaches zero, an update event is generated and counting restarts

from the RCR value (N)

This means in PWM mode that (N+1) corresponds to:

- the number of PWM periods in edge-aligned mode

- the number of half PWM period in center-aligned mode

This parameter must be a number between 0x00 and 0xFF

@note This parameter is valid only for TIM1 and TIM8 /

} TIM_TimeBaseInitTypeDef;

1、TIM_Prescaler:定时器预分频器设置

2 、TIM_CounterMode:计数器有向上计数、向下计数、中心对齐计数3中模式,基本定时器仅支持向上计算,这里不用设置

3、TIM_Period:定时器周期,实际就是设置自动重装寄存器ARR的值

4 、TIM_ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率的分频比,基本定时器不用设置

5 、TIM_RepetitionCounter:重复计数器,属于高级定时器的功能,不用设置

三、代码

使用定时器实现1S定时,因为STM32F103C8T6只有TIM1、TIM2、TIM3、TIM4这几个定时器,这里使用TIM2代替TIM6。

Timerc文件

#include "stm32f10xh" // Device header

void Timer_Init(void)

{

//第一步:开启APB1上的TIM2外设时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

//第二步:时钟源选择内部时钟

TIM_InternalClockConfig(TIM2);

//第三步:初始化TIM2时基单元

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_TimeBaseInitStructureTIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInitStructureTIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStructureTIM_Period = 10000 - 1;

TIM_TimeBaseInitStructureTIM_Prescaler = 7200 - 1;

TIM_TimeBaseInitStructureTIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

//第四步:手动清除计数器中断标志位

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

//第五步:开启计数器中断

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

//第六步:配置NVIC

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructureNVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE;

NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructureNVIC_IRQChannelSubPriority = 1;

NVIC_Init(&NVIC_InitStructure);

//第七步:计数器使能

TIM_Cmd(TIM2, ENABLE);

}

mainc文件

#include "stm32f10xh" // Device header

#include "Delayh"

#include "OLEDh"

#include "Timerh"

uint16_t Num;

int main(void)

{

OLED_Init();

Timer_Init();

OLED_ShowString(1, 1, "Num:");

while (1)

{

OLED_ShowNum(1, 5, Num, 5);

}

}

/TIM2中断处理程序/

void TIM2_IRQHandler(void)

{

if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)

{

Num ++;

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

}

}

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。

STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!这里我们仅利用 TIM3的 CH2 产生一路 PWM 输出。

PWM 相关的函数设置在库函数文件 stm32f10x_timh 和 stm32f10x_timc文件中。

TIM3_CH2 默认是接在 PA7上面的,而我们的 LED0 接在 PB5 上面,如果普通 MCU,可能就只能用飞线把 PA7 飞到 PB5上来实现了,不过,我们用的是 STM32,它比较高级,可以通过重映射功能,把 TIM3_CH2映射到 PB5 上。

STM32函数库对TIM3重映射有两种方法,一种是完全重映射GPIO_FullRemap_TIM3,这个比较好理解就是把TIM3的所有通道端口映射到Remap指定的端口上;还有一种是部分映射GPIO_PartialRemap_TIM3。

在库函数中,PWM 通道设置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这里我们使用的是通道 2,所以使用的函数是 TIM_OC2Init()。

总结:PWM模式1下,TIMx_CCR1大时有效;PWM模式2下,TIMx_CCR1小有效。

有效电平的高低取决于TIM_OCPolarity的定义。本例子情况如下图:

至此,PWM初始化结束。

这是STM32官方库给出的配制系统定时器中断的库函数:

static __INLINE uint32_t SysTick_Config(uint32_t ticks){

if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);

SysTick->VAL = 0;

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk;

return (0);

}

只需要把形参ticks赋值为50就能让系统定时器每20ms中断一次。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13492226.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存