打印

STM32的TIM2通用定时1s功能设置

[复制链接]
9501|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
绿眼孤狼|  楼主 | 2011-1-17 21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 绿眼孤狼 于 2011-1-18 22:22 编辑

/***********************************************************************
*   定时公式:                                                                                                            *
*         T = (TIM_Period + 1) * (TIM_Prescaler + 1) / TIM2 Clock                                     *
*                                                                                                                             *
*   附注:此结果已经示波器验证,正确!                                                                           *
***********************************************************************/

#include "stm32f10x_lib.h"
#include "stm32f10x_conf.h"
/********** 函数声明 *********/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void TIM_Configuration(void);
void Delay(u32 nCount);
/****** 主函数 ******/
int main(void)
{
#ifdef DEBUG
       debug();
#endif
       //----- 初始化 -------
       RCC_Configuration();
       NVIC_Configuration();
       GPIO_Configuration();
       TIM_Configuration();
       while(1);
}

/****** 系统时钟配置函数 ********/
void RCC_Configuration(void)
{
       ErrorStatus  HSEStartUpStatus;

       RCC_DeInit();         //RCC system reset(for debug purpose)
       RCC_HSEConfig(RCC_HSE_ON);      //Enable HSE
       HSEStartUpStatus = RCC_WaitForHSEStartUp();  //Wait till HSE is ready
       if(HSEStartUpStatus == SUCCESS)
       {
         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
         FLASH_SetLatency(FLASH_Latency_2);      //Set 2 Latency cycles
         RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock  = SYSCLK
         RCC_PCLK2Config(RCC_HCLK_Div1);  //APB2 clock = HCLK
         RCC_PCLK1Config(RCC_HCLK_Div4);  //APB1 clock = HCLK/4
         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz
         RCC_PLLCmd(ENABLE);          //Enable PLL
         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  //Wait till PLL is ready  
         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source
         while(RCC_GetSYSCLKSource() != 0x08);  //Wait till PLL is used as system clock source
         //-----------------------------------------------------
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //GPIOD clock ENABLE
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2  clock ENABLE
       }
}
/****** 中断配置函数 ********/
void NVIC_Configuration(void)
{
       NVIC_InitTypeDef NVIC_InitStructure;
//--- 在内存中进行调试 -----   
#ifdef VECT_TAB_RAM
       NIVC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
//--- 在FLASH中进行调试 ----
#else
       NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
   //---- 配置TIM2中断,并使能 -----
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      
   NVIC_Init(&NVIC_InitStructure);
}

/********** 通用I/O配置函数 ***************/
void GPIO_Configuration(void)
{
       GPIO_InitTypeDef GPIO_InitStructure;

       GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
       GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PD8
}
/*****************************************************
函数名称:TIM_Configuration(void)
功能说明:通用定时器定时配置,配置定时溢出时间;
输入参数:无
返回值  :无
*****************************************************/
void TIM_Configuration(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_TimeBaseStructure.TIM_Period = 1000 - 1; //定时公式:(TIM_Period + 1) * (TIM_Prescaler + 1) / TIM2 Clock
        TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; //TIM2时钟为36MHz,经36000分频后为1KHz  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化TIM2
        //------------------------------
        TIM_ClearFlag(TIM2, TIM_FLAG_Update);   //清中断标志,防止打开中断瞬间产生误操作
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  //打开中断
        TIM_Cmd(TIM2, ENABLE);  //打开TIM2定时器
}
/*************************************************/
#ifdef DEBUG
void assert_failed(u8 *file, u32 line)
{
        while(1);
}

/*********************************************/
/*********************************************/

#include "stm32f10x_it.h"
/*********** TIM2中断服务子程序 *************/
void TIM2_IRQHandler(void)
{
     if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
      {
           TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清中断标志
           //------------ 中断处理部分 -------------
           GPIO_WriteBit(GPIOD, GPIO_Pin_8, (BitAction)(1 -  \
           GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_8)));
      }
}

#endif
沙发
dxgung| | 2011-1-18 19:23 | 只看该作者
楼主是定时1ms还是1s?

使用特权

评论回复
板凳
绿眼孤狼|  楼主 | 2011-1-18 22:22 | 只看该作者
语误哈,是1s,谢谢提醒!

使用特权

评论回复
地板
xiahouzuoxin| | 2011-9-29 13:44 | 只看该作者
刚学STM32,大有收获,谢谢楼主:)

使用特权

评论回复
5
2009chinalj| | 2011-12-10 19:23 | 只看该作者
谢谢了  不过有个问题 请教 如果不要   if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) 这个捕捉特点中断源会发现有两个中断???

使用特权

评论回复
6
dongjiajia| | 2012-7-13 17:33 | 只看该作者
这个定时是500ms吧

使用特权

评论回复
7
savvy1988| | 2013-1-17 19:40 | 只看该作者
大哥,您的APB1的时钟频率是36M 还是18M呢

使用特权

评论回复
8
for_load| | 2014-6-16 11:54 | 只看该作者
楼主的PCLK1分频 出来是 18M,一般是2分频,你这4分频,还能定时1S?
不过我现在遇到问题就是这个,我TIM2 定时本来是10S,结果5S 就结束了。。。类似就是TIM时钟为72M样的,呵呵,如果像楼主4分频才为36M的话,那估计我的定时就准了,但是那肯定是错误的。。。楼主为18M
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        TIM_TimeBaseInitStruct.TIM_Prescaler = (36-1);  //计数频率1Mhz,APB1 36M,APB2 72M
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period=10000;  //10ms overflow. //ARR的值
        TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

使用特权

评论回复
9
wendaoxyp| | 2015-5-20 15:45 | 只看该作者
APB1的时钟频率是36M,到了TIM2 自动2倍频,就是72M,所以TIM2clock =72m。lz这是500ms定时吧

使用特权

评论回复
10
wendaoxyp| | 2015-5-20 15:48 | 只看该作者
没看到 RCC_APB2是4分频,是1s定时。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

19

帖子

1

粉丝