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

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