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);
*/