你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

定时器时基

[复制链接]
clonehe1225 提问时间:2010-11-3 00:02 /
我参考ST官方提供的定时器相关代码TimeBase,已经测试到demo中所说的几个定时器中断,可是对里面的
TIM2 counter clock = 7.2 MHz 不太理解。请高手指教?
代码是这样的:
#include "stm32f10x_lib.h"
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
vu16 CCR1_Val = 49152;
vu16 CCR2_Val = 32768;
vu16 CCR3_Val = 16384;
vu16 CCR4_Val = 8192;
ErrorStatus HSEStartUpStatus;
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
#ifdef DEBUG
  debug();
#endif
  /* System Clocks Configuration */
  RCC_Configuration();
  /* NVIC Configuration */
  NVIC_Configuration();
  /* GPIO Configuration */
  GPIO_Configuration();
  /* ---------------------------------------------------------------
    TIM2 Configuration: Output Compare Timing Mode:
    TIM2CLK = 36 MHz, Prescaler = 4, TIM2 counter clock = 7.2 MHz
    CC1 update rate = TIM2 counter clock / CCR1_Val = 146.48 Hz
    CC2 update rate = TIM2 counter clock / CCR2_Val = 219.7 Hz
    CC3 update rate = TIM2 counter clock / CCR3_Val = 439.4 Hz
    CC4 update rate = TIM2 counter clock / CCR4_Val =  878.9 Hz
  --------------------------------------------------------------- */
// TIM2 counter clock = 7.2 MHz                       ------------------------->这个值如何计算得出?
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* Prescaler configuration */
  TIM_PrescalerConfig(TIM2, 4, TIM_PSCReloadMode_Immediate);      -------------->此处的分频值起什么作用?
  /* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);
  /* Output Compare Timing Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
  /* Output Compare Timing Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
  /* Output Compare Timing Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
  while (1);
}
/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* PCLK1 = HCLK/4 */
    RCC_PCLK1Config(RCC_HCLK_Div4);
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  }
  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /* GPIOC clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
}
/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure the GPIOD Pins.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* GPIOC Configurationin6, 7, 8 and 9 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configure the nested vectored interrupt controller.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
  /* Enable the TIM2 gloabal Interrupt */
  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);
}
 
中断处理函数:
void TIM2_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
    /* Pin PC.06 toggling with frequency = 73.24 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
    capture = TIM_GetCapture1(TIM2);
    TIM_SetCompare1(TIM2, capture + CCR1_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
    /* Pin PC.07 toggling with frequency = 109.8 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
    /* Pin PC.08 toggling with frequency = 219.7 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));
    capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
    /* Pin PC.09 toggling with frequency = 439.4 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));
    capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
  }
}

TimeBase.rar

下载

9.8 KB, 下载次数: 3, 下载积分: ST金币 -1

收藏 评论7 发布时间:2010-11-3 00:02

举报

7个回答
废鱼 回答时间:2010-11-3 09:27:16

RE:定时器时基

/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK1 = HCLK/4 */
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
以上代码设置TIM2的时钟,具体意义参考寄存器手册。
TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
这个是用来操作TIM2计数器的方式,没有其他的作用,你可以参考驱动库里面的说明。
   其实很多东西在注释中解释了,希望你能够好好参看注释和RM手册。
clonehe1225 回答时间:2010-11-3 16:12:19

RE:定时器时基

首先谢谢您。
RCC_HCLKConfig(RCC_SYSCLK_Div1);
该配置HCLK=SYSCLK = 72MHZ
RCC_PCLK1Config(RCC_HCLK_Div4);
分频后 PCLK1=HCLK/4=18MHZ
TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
设置TIM2的时钟,我有看应用手册clk=PCLK1/(分频系数+1)=3.6MHZ
所以不知道DEMO中TIM2 counter clock = 7.2 MHz
怎么算的,还是我理解的有问题?
还有就是时基中配置预分频
TIM_TimeBaseStructure.TIM_Prescaler = 0;
和TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
有什么区别?请您指教
merryanddaisy 回答时间:2010-11-5 15:51:15

回复:定时器时基

回复第 3 楼 clonehe1225于2010-11-03 08:12:19发表:
首先谢谢您。
RCC_HCLKConfig(RCC_SYSCLK_Div1);
该配置HCLK=SYSCLK = 72MHZ
RCC_PCLK1Config(RCC_HCLK_Div4);
分频后 PCLK1=HCLK/4=18MHZ
TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
设置TIM2的时钟,我有看应用手册clk=PCLK1/(分频系数+1)=3.6MHZ
所以不知道DEMO中TIM2 counter clock = 7.2 MHz
怎么算的,还是我理解的有问题?
还有就是时基中配置预分频
TIM_TimeBaseStructure.TIM_Prescaler = 0;
和TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
有什么区别?请您指教
 

这个我可以回答你。
TIM_Prescaler 是时钟频率预分频,取0表示不分频。TIM_PrescalerConfig则是配置PSC重装载的次数和装载时机
 
clonehe1225 回答时间:2010-11-5 22:58:31

回复:定时器时基

回复第 4 楼 merryanddaisy于2010-11-05 07:51:15发表:
回复第 3 楼 clonehe1225于2010-11-03 08:12:19发表:
首先谢谢您。
RCC_HCLKConfig(RCC_SYSCLK_Div1);
该配置HCLK=SYSCLK = 72MHZ
RCC_PCLK1Config(RCC_HCLK_Div4);
分频后 PCLK1=HCLK/4=18MHZ
TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
设置TIM2的时钟,我有看应用手册clk=PCLK1/(分频系数+1)=3.6MHZ
所以不知道DEMO中TIM2 counter clock = 7.2 MHz
怎么算的,还是我理解的有问题?
还有就是时基中配置预分频
TIM_TimeBaseStructure.TIM_Prescaler = 0;
和TIM_PrescalerConfig(TIM2,4,TIM_PSCReloadMode_Immediate);
有什么区别?请您指教
 

这个我可以回答你。
TIM_Prescaler 是时钟频率预分频,取0表示不分频。TIM_PrescalerConfig则是配置PSC重装载的次数和装载时机
 
 

首先感谢你的回答,今天有点忙,经过试验验证,这2个的作用一致,都是设置时钟预分频,用其中一个即可。
 
lucky-92214 回答时间:2010-11-22 15:02:39

RE:定时器时基

最近很忙,有空仔细看看!
guanjianguo 回答时间:2010-11-24 16:48:22

回复:定时器时基

 
应用手册说的很清楚,定时器频率clk=PCLK1/(分频系数+1 ),  即36M/(4+1)=7.2M
   这个36M是APB1的频率,也就是PCLK1
vfp8341-196728 回答时间:2011-4-11 12:49:30

RE:定时器时基

关于“  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* Prescaler configuration */
  TIM_PrescalerConfig(TIM2, 4, TIM_PSCReloadMode_Immediate);      -------------->此处的分频值起什么作用?
”,你说他为什么不一次把TIM_Prescaler 设定好,非要先设成零再用函数加载一次呢?
应该是有原因的吧?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版