打印
[STM32F1]

stm32 tim1 时钟上不了 72M,只有36M 求助

[复制链接]
809|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljxh401|  楼主 | 2021-1-17 17:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
电路板 8M 晶振  pll后 系统时钟 72M
apb2 的时钟     RCC_PCLK2Config(RCC_HCLK_Div1);
所以 apb2 的频率 应该也是72M
InitTim1(1000,72,1); 得到的中断 频率是 2ms

将 apb2 的时钟     RCC_PCLK2Config(RCC_HCLK_Div2);
所以 apb2 的频率 应该也是36M
InitTim1(1000,72,1); 得到的中断 频率还是 2ms


将 apb2 的时钟     RCC_PCLK2Config(RCC_HCLK_Div4);
所以 apb2 的频率 应该也是18M
InitTim1(1000,72,1); 得到的中断 频率还是 4ms



是频率上不去吗 RCC_PCLK2Config(RCC_HCLK_Div1); 和  RCC_PCLK2Config(RCC_HCLK_Div2); 得到的结果是一样的


设置 tim1 定时中断 InitTim1(1000,72,1); 得到的中断频率是 2ms
void InitTim1(INT16U pwm_period,INT16U prescaler,INT8U enIrq)
{
        NVIC_InitTypeDef NVIC_InitStructure;  
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能 TIMx 外设
        TIM_DeInit(TIM1);
        TIM_TimeBaseStructure.TIM_Period = pwm_period-1;                                                         //设置自动重装载周期值
        TIM_TimeBaseStructure.TIM_Prescaler =prescaler-1;                                                         //设置预分频值 不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                         //设置时钟分割:TDTS = Tck_tim                        这里是 32M
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                                 //向上计数
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


中断代码 如下:


void  TIM1_UP_IRQHandler (void)
{
        static int cnt=0;
        OSIntEnter();
    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
        if(++cnt==1000)
        {
                cnt=0;
                OSQPost(OSQTim,(void*)1);
        }
    OSIntExit();                                                /* Tell uC/OS-II that we are leaving the ISR                */
}


使用特权

评论回复
沙发
LcwSwust| | 2021-1-17 18:11 | 只看该作者
不知是不是这原因:

使用特权

评论回复
板凳
ljxh401|  楼主 | 2021-1-17 21:54 | 只看该作者
LcwSwust 发表于 2021-1-17 18:11
不知是不是这原因:

这个可以解释 为什么 div1 div2 都是 出来的时钟都一样

使用特权

评论回复
地板
香水城| | 2021-1-18 08:22 | 只看该作者
是的。
应该说你看到原因所在了,不是它上不去 而是你不让他上去。

使用特权

评论回复
5
ljxh401|  楼主 | 2021-1-18 22:49 | 只看该作者
香水城 发表于 2021-1-18 08:22
是的。
应该说你看到原因所在了,不是它上不去 而是你不让他上去。

还是不明白 为什么 tim1 只有36M的 速度  而TIM2 有72M 同样的设置
我tim1 和 tim2 的设置完全一样  apb2是72M apb1 是36M  但是 中断函数 打印出 tim1的频率只有500HZ TIM2 1000HZ
主程序里面启动

        InitTim1(1000,72,1);
        InitTim2(1000,72,1);

中断函数
void  TIM1_UP_IRQHandler (void)
{
        static int cnt=0;
        OSIntEnter();
    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
        if(++cnt==1000)
        {
                cnt=0;
                OSQPost(OSQTim,(void*)1);
        }
    OSIntExit();                                                /* Tell uC/OS-II that we are leaving the ISR                */
}

void TIM2_IRQHandler (void)
{
        static int cnt=0;
        OSIntEnter();
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        if(++cnt==1000)
        {
                cnt=0;
                OSQPost(OSQTim,(void*)2);
        }
    OSIntExit();                                                /* Tell uC/OS-II that we are leaving the ISR                */
}

定时器初始化函数
void InitTim1(INT16U pwm_period,INT16U prescaler,INT8U enIrq)
{
        NVIC_InitTypeDef NVIC_InitStructure;  
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能 TIMx 外设
        TIM_DeInit(TIM1);
        TIM_TimeBaseStructure.TIM_Period = pwm_period-1;                                                         //设置自动重装载周期值
        TIM_TimeBaseStructure.TIM_Prescaler =prescaler-1;                                                         //设置预分频值 不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                         //设置时钟分割:TDTS = Tck_tim                        这里是 32M
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                                 //向上计数
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                                                                //初始化 TIMx

        TIM_ClearFlag(TIM1, TIM_FLAG_Update);                 
        if(enIrq)
        {
                NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;                       /*溢出中断*/  
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);  
                TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);                                           /* 使能中断 */       
        }


        TIM_ARRPreloadConfig(TIM1, ENABLE);                                                                 //使能 TIMx 在 ARR 上的预装载寄存器
        TIM_CtrlPWMOutputs(TIM1,ENABLE);                                                                        //MOE 主输出使能,高级定时器必须开启
        TIM_Cmd(TIM1, ENABLE);                                                                                                 //使能 TIMx
}


void InitTim2(INT16U pwm_period,INT16U prescaler,INT8U enIrq)
{
        NVIC_InitTypeDef NVIC_InitStructure;  
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能 TIMx 外设
        TIM_DeInit(TIM2);

        TIM_TimeBaseStructure.TIM_Period = pwm_period-1;                                                         //设置自动重装载周期值
        TIM_TimeBaseStructure.TIM_Prescaler =prescaler-1;                                                         //设置预分频值 不分频
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                                                 //设置时钟分割:TDTS = Tck_tim                        这里是 32M
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                                 //向上计数
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                                                                //初始化 TIMx
       

        TIM_ClearFlag(TIM2, TIM_FLAG_Update);                 
        if(enIrq)
        {
                NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;                       /*溢出中断*/  
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);  
                TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                                           /* 使能中断 */       
        }

        TIM_ARRPreloadConfig(TIM2, ENABLE);                                                                 //使能 TIMx 在 ARR 上的预装载寄存器
        TIM_Cmd(TIM2, ENABLE); //使能 TIMx
}


使用特权

评论回复
6
香水城| | 2021-1-20 11:01 | 只看该作者
首先你保证TIM1/TIM2的计数时钟是相同的,如果采用默认配置,计数时钟都应该是72Mhz,
当你使用相同ARR时,更新频率应该是一样的。注意对于TIM1,这个地方要保证这样 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
否则更新事件频率会变。

要验证的话,简单点 直接在更新中断里做GPIO翻转,先排除其它干扰。

使用特权

评论回复
7
zljiu| | 2021-2-4 22:55 | 只看该作者
这是九倍倍频啊

使用特权

评论回复
8
coshi| | 2021-2-4 22:59 | 只看该作者
我记得有一个是跟pll没有关系的

使用特权

评论回复
9
aoyi| | 2021-2-4 23:02 | 只看该作者
如何保证两个定时器的时钟是相同的呢

使用特权

评论回复
10
drer| | 2021-2-4 23:05 | 只看该作者
在寄存器中选择同一个时钟源就可以了啊

使用特权

评论回复
11
gwsan| | 2021-2-4 23:09 | 只看该作者
城主的验证方式很方便操作

使用特权

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

本版积分规则

49

主题

220

帖子

3

粉丝