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

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

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

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

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

Timer.c文件

#include "stm32f10x.h" // Device header

void Timer_Init(void)

{

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

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)

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

TIM_InternalClockConfig(TIM2)

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

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up

TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1

TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1

TIM_TimeBaseInitStructure.TIM_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_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)

}

main.c文件

#include "stm32f10x.h" // Device header

#include "Delay.h"

#include "OLED.h"

#include "Timer.h"

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)

}

}

1、解锁。用STM32定时器设置占空比为10%的输出波形连按4次插座上的,当显示屏最左边没有看到反写的6字样,说明键盘已经解锁了。

2、手动设置。插座设置有两种形式,分别是自动设置和手动设置。为了定时的准确性,通常需要进入手动设置模式。不过这种设置方式每次开关都需要按键 *** 作。

3、设置时间。找到时间设置按钮,小时键、分钟键、星期键,然后根据具体想要设置的时间进入时间的设置。

4、设定。调好时间后,按设定键进入定时模式,如果连续按还可切换成不同组的定时段。一般的定时插座还能允许修改内部的定时参数。

如果设置的STM32中AD采集时间没有什么用,可能有以下几种原因:

1. AD采集时间不是真实的采集时间:在STM32中,AD采集时间设置的是采集规定次数的时间,而不是真实的采集时间。因此,如果设置的采样次数很少,AD采样时间看起来可能没有什么用。

2. AD采集时间被其他因素覆盖:有时候,AD采集的时间可能会被其他因素覆盖,如时钟速度、AD转换器分辨率或其它设置等。

3. 代码设计问题:AD采集时间的无效可能还是代码设计问题,如未正确初始化ADC或中断服务程序存在问题等等。

针对以上原因,可以尝试以下方法:

1. 增加采集次数:在增加采集次数的情况下,AD采集时间会有更明显的影响,可以更好的观察其效果。

2. 尝试不同的采集时间:如果某个采集时间没有效果,可以尝试其他的值,以获得更准确的AD采集时间。

3. 检查代码:可以检查代码是否正确初始化ADC和处理ADC中断的中断服务程序,以解决AD采集时间的无效问题。


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

原文地址: http://outofmemory.cn/tougao/7796744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存