STM32基本定时器

STM32中基本定时器TIM6和TIM7的运用,包括中断控制和获取计数值来控制。
====中断,所以2个代码块,还有timer.h======
/*******************************************************************************
*  函数功能:定时器头文件  
*  芯片:STM32F103VCT6   V3.5.0
*  编译环境:Keil uVision4
*  编写时间:Genz ZHANG
*  作    者:18/06/2014
*******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TIMER_H
#define __TIMER_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
/* 自定义变量         -------------------------------------------------------*/
/* 自定义函数声明      -------------------------------------------------------*/
void NVIC_TIM7_Configuration(void);
void TIM7_Timer_Configuration (void);
void Init_TIM7(void);
void Init_TIM6(void);
float Get_HalfSampleTime(void);
#endif /* __TIMER_H */
//=================main函数==================
int main(void)
{
		RCC_Configuration();
		USART1_Bluetooth_TXRX();
		Init_TIM7();
		Init_TIM6();
		while(1){};
}

//=================中断服务函数stm32f10x_it.c=================
//为了对时序的精确控制,最好仿真出运行时间。注意,时间不能太小。
//extern u8 Attitude_Completed; //给控制策略发送欧拉角的时间
void TIM7_IRQHandler(void)    //计数时基是3ms,产生一次中断
{
		static uint8_t Ms3=0,Ms30=0,Ms60=0;
		if(TIM7->SR & TIM_IT_Update)
		{
				Ms3++;
				Ms30++;
				Ms60++;	
  			TIM7->SR = ~TIM_FLAG_Update;//清除中断标志位	


			  if(Ms30==15) //更新深度时间周期为45ms
				{				
						Ms30=0;		
						Get_Depth();	
	//					TIM7->SR = ~TIM_FLAG_Update;//清除中断标志						
				}
		}
}


//=================TIM6.7配置timer.c==================

#include "timer.h" 
/********配置优先级*****************/
void NVIC_TIM7_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;
	NVIC_InitStructure.NVIC_IRQChannel =TIM7_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
	NVIC_Init(&NVIC_InitStructure);
	/*
	NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0);
	这句是配置中断向量偏移表的.默认是FLASH的,所以你不设置也无关系. 
	使用RAM调试的时候,必须设置.
    */
}
/*****定时器初始化配置*********/
void TIM7_Timer_Configuration (void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
	// TIM_Cmd(TIM7, DISABLE);
	//预分频系数为36000-1,这样计数器时钟为72MHz/72= 10MHz
	TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
	//设置时钟分割 TIM_CKD_DIV1=0x0000,不分割,TIM_CKD_DIV1
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	//设置计数器模式为向上计数模式,也只能向上好像?
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;
	//配置时钟的自动重装计数器
	TIM_TimeBaseStructure.TIM_Period = 3000 - 1;
	//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	//将配置应用到TIM7中
	TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);
	//TIM_UpdateRequestConfig( TIM7, TIM_UpdateSource_Regular);
	//清除标志位
	TIM_ClearFlag(TIM7, TIM_FLAG_Update);
	//使能中断
	TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
	//使能计数器
	TIM_Cmd(TIM7, ENABLE);
	
}

/********TIM7计数器初始化*****************/
void Init_TIM7(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
	TIM7_Timer_Configuration();
	NVIC_TIM7_Configuration();
}


/*******************************************************************************
*  函数功能: TIM6时间基655.36ms,不断计数来控制那些时序和时间不是很严格的程序运行态
*  芯    片:STM32F103VCT6   V3.5.0
*  编写时间:Genz ZHANG
*  作    者:08/06/2014
*******************************************************************************/
/********TIM6计数器初始化*****************/
void Init_TIM6(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
	//预分频系数为36000-1,这样计数器时钟为72MHz/720= 0.1MHz
	TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1;
	//设置时钟分割 TIM_CKD_DIV1=0x0000,不分割,TIM_CKD_DIV1
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	//设置计数器模式为向上计数模式,也只能向上好像?
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;
	//配置时钟的自动重装计数器
	TIM_TimeBaseStructure.TIM_Period = 65536 - 1;
	//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	//将配置应用到TIM6中
	TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
	//使能计数器
	TIM_Cmd(TIM6, ENABLE);
}

/********TIM6计数器获取时间片段*****************/
float Get_HalfSampleTime(void)     //用于读取积分周期,因为如果定值积分周期,那么如果时序出现一点点问题,那么积分就会不准确
{
	float temp=0 ;
	static u16 now=0; // 采样周期计数 单位 us

 	now = TIM6->CNT;//读取16位计数值
	TIM6->CNT=0;
	temp = (float)now / 200000.0f;        //换算成秒,再除以2得出采样周期的一半

	return temp;
}

/*
void NVIC_Timer_Configuration(void);
void TIM7_Timer_Configuration (void);
void Init_TIM7(void);
float Get_HalfSampleTime(void);
*/



                
### STM32 基本定时器使用方法与原理 STM32基本定时器(Basic Timer),也称为 TIM6 和 TIM7,在内部结构上较为简单,主要用于时间测量和产生延时功能。这类定时器不具备输入捕获、输出比较等功能。 #### 定时器工作模式 基本定时器通过计数预装载寄存器中的数值来实现定时操作。当计数器达到自动重装载寄存器中设定的最大值时,会产生更新事件并重新从0开始计数[^1]。 ```c // 初始化TIM6作为基本定时器 void MX_TIM6_Init(void) { __HAL_RCC_TIM6_CLK_ENABLE(); // 使能TIM6时钟 TIM_HandleTypeDef htim6; htim6.Instance = TIM6; htim6.Init.Period = 999; // 自动重装载值设置为999 htim6.Init.Prescaler = 8399; // 预分频系数设为8399, 即APB1频率除以8400 htim6.Init.ClockDivision = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&htim6); // 初始化定时器基类成员函数 } ``` 上述代码配置了一个基于向上计数模式的定时器实例 `htim6` ,其中 Period 参数决定了定时周期长度;Prescaler 则用于调整实际的工作频率。 #### 中断处理机制 为了响应定时溢出中断请求,需编写相应的回调服务程序: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6){ /* 用户自定义的功能 */ } } /* 在启动文件内声明弱函数覆盖默认版本 */ __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){} ``` 每当发生一次满量程溢出后就会触发该ISR入口点执行特定任务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值