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

定时器时基

[复制链接]
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版