2025-05-26 18:48:47 +08:00

82 lines
3.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stm32f10x.h" // Device header
struct {uint16_t Value; uint16_t Count;} FreqCounter = {0, 0}; //帧率相关结构体并直接实例化
/**
* 函 数:定时中断初始化
* 参 数:无
* 返 回 值:无
*/
void Timer_Init(void)
{
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //开启TIM4的时钟
/*配置时钟源*/
TIM_InternalClockConfig(TIM4); //选择TIM4为内部时钟若不调用此函数TIM默认也为内部时钟
/*时基单元初始化*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1; //计数周期即ARR的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; //预分频器即PSC的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit配置TIM4的时基单元
/*中断输出配置*/
TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除定时器更新标志位
//TIM_TimeBaseInit函数末尾手动产生了更新事件
//若不清除此标志位,则开启中断后,会立刻进入一次中断
//如果不介意此问题,则不清除此标志位也可
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //开启TIM4的更新中断
/*NVIC中断分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2
//即抢占优先级范围0~3响应优先级范围0~3
//此分组配置在整个工程中仅需调用一次
//若有多个中断可以把此代码放在main函数内while循环之前
//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
/*NVIC配置*/
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //选择配置NVIC的TIM4线
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //指定NVIC线路的抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1
NVIC_Init(&NVIC_InitStructure); //将结构体变量交给NVIC_Init配置NVIC外设
/*TIM使能*/
TIM_Cmd(TIM4, ENABLE); //使能TIM4定时器开始运行
}
uint8_t Timer_GetFPS(void) //获取帧率
{
FreqCounter.Count++;
return FreqCounter.Value;
}
void Timer_SetFreqCounter(void) //放置计数器
{
FreqCounter.Count++;
}
uint8_t Timer_GetFreqCounter(void) //获取计数频率
{
return FreqCounter.Value;
}
// /* 定时器中断函数,可以复制到使用它的地方
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
FreqCounter.Value = FreqCounter.Count;
FreqCounter.Count = 0;
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
}
// */