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

stm32f10x的高级定时器TIM1和通用定时器TIM2~TIM4如何同步作用?

[复制链接]
冰牛奶 提问时间:2023-4-16 15:44 / 未解决

TIM2~TIM4我都用了,现在还需要用一个计时器,但是只要我在定时器初始化加上TIM1的初始化,还没写中断函数,其他程序就什么都运行不了了,想请问大佬们是为什么呢

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
    //超声波的定时器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //启用TIM4时钟

    TIM_InternalClockConfig(TIM4);                              //设置TIM4使用内部时钟,其实就算不写也默认用内部时钟

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure4;         //定义结构体,配置定时器
    TIM_TimeBaseInitStructure4.TIM_ClockDivision = TIM_CKD_DIV1;    //设置1分频(不分频)
    TIM_TimeBaseInitStructure4.TIM_CounterMode = TIM_CounterMode_Up;    //设置计数模式为向上计数
    TIM_TimeBaseInitStructure4.TIM_Period = 10 - 1;         //ARR 自动重装器的值 (0~65535) //计数器溢出频率CK_CNT_OV=
    TIM_TimeBaseInitStructure4.TIM_Prescaler = 72 - 1;      //PSC 预分频器的值 (0~65535) //=CK_PSC/(PSC+1)/(ARR+1)
    TIM_TimeBaseInitStructure4.TIM_RepetitionCounter = 0;       //重复计数器(高级定时器才有)
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure4);
       //时基单元配置

    TIM_ClearFlag(TIM4, TIM_FLAG_Update);           //清除更新中断标志位
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);      //开启更新中断,开启了更新中断到NVIC的通路

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);             //设置中断优先级分组

    NVIC_InitTypeDef NVIC_InitStructure4;                       //定义结构体,配置中断优先级
    NVIC_InitStructure4.NVIC_IRQChannel = TIM4_IRQn;                //指定中断通道(定时器在NVIC里的通道
    NVIC_InitStructure4.NVIC_IRQChannelCmd = ENABLE;                //中断使能
    NVIC_InitStructure4.NVIC_IRQChannelPreemptionPriority = 2;  //抢占优先级
    NVIC_InitStructure4.NVIC_IRQChannelSubPriority = 1;         //响应优先级
    NVIC_Init(&NVIC_InitStructure4);

    TIM_Cmd(TIM4, ENABLE);      //开启定时器


    //人体红外的定时器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启APB1总线上的APB1的时钟

    TIM_InternalClockConfig(TIM3);//调用使用内部时钟,其实就算不写也默认用内部时钟

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure3;
    TIM_TimeBaseInitStructure3.TIM_ClockDivision = TIM_CKD_DIV1;//1分频
    TIM_TimeBaseInitStructure3.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
    TIM_TimeBaseInitStructure3.TIM_Period = 10000-1;//ARR 自动重装器的值 (0~65535) //计数器溢出频率CK_CNT_OV=
    TIM_TimeBaseInitStructure3.TIM_Prescaler = 7200-1;//PSC 预分频器的值 (0~65535) //=CK_PSC/(PSC+1)/(ARR+1)
    TIM_TimeBaseInitStructure3.TIM_RepetitionCounter = 0;//重复计数器的值
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure3);
      //时基单元配置

    TIM_ClearFlag(TIM3,TIM_FLAG_Update);//避免刚初始化完就立刻进入中断
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启了更新中断到NVIC的通路

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure3;
    NVIC_InitStructure3.NVIC_IRQChannel = TIM3_IRQn;//定时器2在NVIC里的通道
    NVIC_InitStructure3.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure3.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
    NVIC_InitStructure3.NVIC_IRQChannelSubPriority = 2;//响应优先级
    NVIC_Init(&NVIC_InitStructure3);

    TIM_Cmd(TIM3 , ENABLE);//启动定时器
}
/*
    //称重的定时器
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//开启APB2总线上的APB1的时钟

    TIM_InternalClockConfig(TIM1);                              //设置TIM1使用内部时钟,其实就算不写也默认用内部时钟

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure1;             //定义结构体,配置定时器
    TIM_TimeBaseInitStructure1.TIM_ClockDivision = TIM_CKD_DIV1;    //设置1分频(不分频)
    TIM_TimeBaseInitStructure1.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式为向上计数
    TIM_TimeBaseInitStructure1.TIM_Period = 10000-1;                //ARR 自动重装器的值 (0~65535) //计数器溢出频率CK_CNT_OV=
    TIM_TimeBaseInitStructure1.TIM_Prescaler = 7200-1;              //PSC 预分频器的值 (0~65535) //=CK_PSC/(PSC+1)/(ARR+1)
    TIM_TimeBaseInitStructure1.TIM_RepetitionCounter = 0;           //重复计数器(高级定时器才有)
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure1);
       //时基单元配置

    TIM_ClearFlag(TIM1, TIM_FLAG_Update);   //清除更新中断标志位
    TIM_ITConfig(TIM1, TIM_IT_Update | TIM_IT_Trigger, ENABLE); //开启更新中断,开启了更新中断到NVIC的通路

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure1;
    NVIC_InitStructure1.NVIC_IRQChannel = TIM1_UP_IRQn;//定时器2在NVIC里的通道
    NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 3;//抢占优先级
    NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 3;//响应优先级
    NVIC_Init(&NVIC_InitStructure1);

    TIM_Cmd(TIM1 , ENABLE);//启动定时器

}
*/
//中断函数模板
/*
void TIM4_IRQHandler(void)          //更新中断函数//当定时器产生更新中断时,函数自动被执行
{
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)        //获取TIM4定时器的更新中断标志位//如果(获取中断标志位==SET),那么可以执行相应地用户代码
    {

        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);         //清除更新中断标志位
    }
}*/

收藏 评论2 发布时间:2023-4-16 15:44

举报

2个回答
网络孤客 回答时间:2023-4-17 09:12:11

用stm32cubemx吧,可以减少很多设置问题。

xmshao 回答时间:2023-4-17 10:18:42
你现在用到多个定时器而已,似乎并没有彼此时序同步的关系。


你现在的问题是,初始化TIM1整个程序瘫痪了。 个人认为问题很可能跟中断有关,


你看看TIM1的中断标志哪些被置位了,是否在中断服务程序里做清零操作。


还有,我看你代码有关中断的地方 不同外设赋予不同有限级,你检查下有无


优先级设计不合理导致程序运行死锁的情况。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版