S TM32 定时器定时时间的计算2010-11-18 14:12:18| 分类:资料引用| 标签:|字号大中小订阅引用mxpopstar 的STM32 定时器定时时间的计算假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。
RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。
因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1 +9999)=1秒*/定时器的基本设置1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到)3、TIM_TimeBaseStructure.TIM_CounterMode =TIM1_CounterMode_Up; //定时器模式向上计数4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值5、TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定时器26、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断7、TIM_Cmd(TIM2, ENABLE);//打开定时器或者:TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/(35999+1)/2=1Hz 1秒中断溢出一次TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*( 1+2000)=1秒*/STM32通用定时器的基本定时器功能实现灯闪烁/blog/static/12003725820091023451 51281/?fromdm&isFromSearchEngine=yes/*MAIN.C*//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include "misc.h"/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void TIM3_Configuration(void);/* Private functions ---------------------------------------------------------*/ /*** @brief Main program* @param None* @retval : None*/int main(void){RCC_Configuration();NVIC_Configuration();GPIO_Configuration();TIM3_Configuration();TIM_ClearFlag(TIM3, TIM_FLAG_Update);/*清除更新标志位*/ TIM_ARRPreloadConfig(TIM3, DISABLE);/*预装载寄存器的内容被立即传送到影子寄存器*/TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);TIM_Cmd(TIM3, ENABLE);while (1) {;}}/*** @brief Configures TIM3* @param None* @retval : None*/void TIM3_Configuration(void){/*每1秒发生一次更新事件(进入中断服务程序)。
RCC_Configuration()的SystemInit()的RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。
因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+99 99)=1秒*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 9999;TIM_TimeBaseStructure.TIM_Prescaler = 7199;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/*此函数的语句"TIMx->EGR = TIM_PSCReloadMode_Immediate;"以软件方式产生更新事件(注:当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF 位)。
)。
*/}/*** @brief Configures the different system clocks.* @param None* @retval : None*/void RCC_Configuration(void){SystemInit();/* TIM3 clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/* GPIOC clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);}/*** @brief Configures NVIC.* @param None* @retval : None*/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;/* Enable the TIM3 gloabal Interrupt*/NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}/*** @brief Configure the TIM3 Ouput Channels.* @param None* @retval : None*/void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);/*注:不用为实现通用定时器的基本定时器功能配置Pin*/}/*stm32f10x_it.c*//* Includes ------------------------------------------------------------------*/#include "stm32f10x_it.h"void TIM3_IRQHandler(void){if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { /* Clear TIM3 update interrupt */TIM_ClearITPendingBit(TIM3, TIM_IT_Update);GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));}}/*注:stm32f10x_stdperiph_lib_v3.0.0 编译器:MDK3.24A*//*软件仿真:首次进入中断Sec为1.00016507,第二次进入中断Sec 为2.00016507,因此2.00016507-1.00016507。