打印

关于TIM的疑问

[复制链接]
3052|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zb214|  楼主 | 2008-7-5 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, rc, TE, ST, se
我只想简单的测试一下STM32103RBT6的TIM4定时器溢出中断,根据设置,定时器周期居然不对,下面是我的具体设置,请教各位,问题在哪里?

时钟的设置:晶体8MHZ,SYSCLK = 72MHZ,PCLK1 = 36MHZ,下面的设置对吗?
   /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能USART2 ,TIM4 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4, ENABLE);

定时器4 寄存器的设置
  TIM_TimeBaseStructure.TIM_Period = 0x00ff;  //周期,重装载数值        
  TIM_TimeBaseStructure.TIM_Prescaler = 0;    //预分频器   
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //定时器输入滤波器对时钟输入的采样频率,1,2,4倍    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //向上计数
  
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  TIM_CounterModeConfig(TIM4, TIM_CounterMode_Up);
  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // TIM4 中断使能
   TIM_Cmd(TIM4, ENABLE);

中断函数:GPIOC输出脉宽为定时周期,按照计算应该是 (1/36)*256 = 7.1us
但是实际脉冲宽度是3.55US,查阅了很久的手册,看到《STM32F10xxx参考手册》P37时钟章节的图7 时钟树,有一个“TIM  2,3,4 ×1,2 multiplier”是不是这个乘法器的影响?但是我并没有在手册里面看到这个的说明,

void TIM4_IRQHandler(void)
{
  
    static        u16    temp = 0x0000;
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
    {
        
        temp = ~temp;
        GPIO_Write(GPIOC,temp);        
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    }
}
F: .jpg



    
沙发
pb486| | 2008-7-5 14:43 | 只看该作者

72M分频

(1/72)*256 = 3.55us

使用特权

评论回复
板凳
香水城| | 2008-7-5 16:58 | 只看该作者

这个问题已经有人贴出了例子,在精华帖中找找

使用特权

评论回复
地板
zb214|  楼主 | 2008-7-5 17:39 | 只看该作者

APB1时钟 36MHZ

问题在于 
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
TIM4使用的是 36MHZ的APB1时钟,不是72MHZ吧

使用特权

评论回复
5
香水城| | 2008-7-5 17:59 | 只看该作者

楼主没有好好看手册,手册里写得很清楚

你看的是中文版的翻译,在所说的P37的最后一个段落,有这样一段话“定时器时钟频率是其所在APB总线频率的两倍。然而,如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。”

这段话的前半句正是你所要的答案。

另外,这个中文版本是根据英文第2版翻译的,现在英文的版本已经是第4版,在这个英文第4版的69页,有这样一段话,也明确地说明了这个问题:

The timer clock frequencies are automatically fixed by hardware. There are two cases:
1. if the APB prescaler is 1, the timer clock frequencies are set to the same frequency as that of the APB domain to which the timers are connected.
2. otherwise, they are set to twice (x2) the frequency of the APB domain to which the timers are connected.


以前还有一个精华帖,对这个问题也有专门的叙述:STM32F10xx时钟系统框图:时钟是整个系统的脉搏
相关链接:http://www.st.com/stonline/products/literature/rm/13902.pdf

使用特权

评论回复
6
zb214|  楼主 | 2008-7-5 18:17 | 只看该作者

非常感谢!

使用特权

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

本版积分规则

7

主题

23

帖子

0

粉丝