stm32f1 定时器周期计算问题。。。

2019-07-21 04:17发布

[mw_shl_code=c,true]        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断  即周期
        TIM_TimeBaseStructure.TIM_Period = 65535;                //周期
        TIM_TimeBaseStructure.TIM_Prescaler= 35;// 时钟预分频数
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                //时钟分割 默认0,这里忽略即可
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                //向上计数
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;                //高级定时器选项,普通定时器忽略即可       
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// 初始化定时器3

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //选择定时器模式为翻转电平模式
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_CounterMode_Up; //输出极性:TIM输出比较极性高
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);//失能TIMx在CCR3上的预装载寄存器
        TIM_Cmd(TIM3, ENABLE);                            //使能TIM3
  TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);

void TIM3_IRQHandler(void)               
{
         u16 Capture1;
   if(TIM_GetITStatus(TIM3,TIM_IT_CC3)!=RESET)
         {
          TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);//清除TIMx的中断待处理位
    Capture1 = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, Capture1 + 999);//设置TIMx自动重装载寄存器值
         }
}
[/mw_shl_code]
产生PWM为啥是1khz而不是500hz

999不是1000us翻转一次吗,那一个周期不是2000us吗?。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
Gwvfbukn
1楼-- · 2019-07-22 12:17
Gwvfbukn 发表于 2019-3-17 13:45
首先pdf上的图没问题是吧?我有本《基于stm32的嵌入式系统原理与设计》这本书的图上tim3直接挂在apb2上, ...

搜了一下,这个之前有人提问,定时器默认都是72mhz的了
nashui_sx
2楼-- · 2019-07-22 16:35
Gwvfbukn 发表于 2019-3-17 13:53
搜了一下,这个之前有人提问,定时器默认都是72mhz的了

f1是的 不过f4不是
f4//TIM1、TIM8~TIM11的时钟为APB2(84M)时钟的两倍即168M,TIM2~TIM7、TIM12~TIM14的时钟为APB1(48M)的时钟的两倍即84M

一周热门 更多>