OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3830|回复: 6

程序死在TIM2的中断处理程序里了,为什么?

[复制链接]

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-6
在线时间
12 小时
发表于 2016-7-10 21:31:37 | 显示全部楼层 |阅读模式
1金钱
static void TIM_GPIO_Config(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;
               
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                GPIO_Init(GPIOA,&GPIO_InitStructure);
       
}

static void TIM2_Mode_Config(void)
{
                TIM_ICInitTypeDef TIM_ICInitStructure;
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
       
                TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
               
                TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
                TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
                TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
          
                TIM_ICInitStructure.TIM_ICFilter = 0x0;
                TIM_ICInit(TIM2,&TIM_ICInitStructure);
                TIM_SetCounter(TIM1, 0);
                TIM_Cmd(TIM2, ENABLE);
       
     TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 0x0);
       
                TIM_TimeBaseStructure.TIM_Prescaler = 0;      
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数
                TIM_TimeBaseStructure.TIM_Period = 0;        //装载值
                //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
                TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
               
                TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
                //TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //单独设置通道的捕获极性
       

                        TIM_ITConfig(TIM2, TIM_IT_Update  , ENABLE );


               
}

static void TIM3_Mode_Config(void)
{
                TIM_Cmd(TIM3,ENABLE);
               
}
static void TIM3_TimeBase_Config(void)
{
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
                TIM_TimeBaseStructure1.TIM_ClockDivision = 0;
                TIM_TimeBaseStructure1.TIM_CounterMode = TIM_CounterMode_Up;
                TIM_TimeBaseStructure1.TIM_Period = 0xD8EF;
                TIM_TimeBaseStructure1.TIM_Prescaler = (7200-1); //7200分频
                TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure1);
                TIM_ITConfig(TIM3,TIM_IT_Update | TIM_IT_CC2,ENABLE);
               
}

static void NVIC_Config(void)
{
                NVIC_InitTypeDef NVIC_InitStructure;
                NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
               
                NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
                NVIC_Init(&NVIC_InitStructure);
}

void TIM2_Config(void)
{
        TIM_GPIO_Config();
        NVIC_Config();
        TIM2_Mode_Config();
        TIM3_Mode_Config();
        TIM3_TimeBase_Config();
}
中断处理程序如下:
uint32_t Overtime = 0;

uint32_t Frequence;


void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)               
                Overtime++;
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

}

void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
        {
          Frequence = Overtime*65535+TIM_GetCounter(TIM2);
         Overtime = 0;
        }
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}


最佳答案

查看完整内容[请看2#楼]

改NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 就好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-6
在线时间
12 小时
 楼主| 发表于 2016-7-10 21:31:38 | 显示全部楼层
改NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 就好了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-11 12:08:33 | 显示全部楼层
硬件调试,看看TIM2开了哪些中断吧
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2016-7-11 14:52:35 | 显示全部楼层

就三句话,
仿真器走走看,到底停在哪里。


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2016-7-11 14:53:29 | 显示全部楼层

就三句话,
仿真器走走看,到底停在哪里。


回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-6
在线时间
12 小时
 楼主| 发表于 2016-7-11 20:48:49 | 显示全部楼层
有了新的问题,开两个定时器中断,配置优先级上如何考虑?现在的程序只能进一个中断处理,无法进入另一个中断处理
static void TIM2_Mode_Config(void)
{
                TIM_ICInitTypeDef TIM_ICInitStructure;
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
          TIM2->ARR = 0;
                TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
               
                TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
                TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
                TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
          
                TIM_ICInitStructure.TIM_ICFilter = 0x0;
                TIM_ICInit(TIM2,&TIM_ICInitStructure);
                TIM2->CCMR1 = 0x0002;
                TIM2->CCER = 0x0002;
                TIM_SetCounter(TIM2, 0);
               
                TIM_Cmd(TIM2, ENABLE);
               
                TIM2->SMCR = 0x0066;
       
       
                TIM_TimeBaseStructure.TIM_Prescaler = 0;      
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数

                TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
               
                TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
                TIM_ITConfig(TIM2, TIM_IT_Update  , ENABLE );


               
}

static void TIM3_TimeBase_Config(void)
{
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
                TIM_TimeBaseStructure1.TIM_ClockDivision = 0;
                TIM_TimeBaseStructure1.TIM_CounterMode = TIM_CounterMode_Up;
                TIM_TimeBaseStructure1.TIM_Period = 10000;
                TIM_TimeBaseStructure1.TIM_Prescaler = (7200-1); //7200分频
                TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure1);

          TIM_ClearFlag(TIM3, TIM_FLAG_Update);
       
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
               
    TIM_Cmd(TIM3, ENABLE);       
               
}

static void NVIC_Config(void)
{
                NVIC_InitTypeDef NVIC_InitStructure;
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
                NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
               
                NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
                NVIC_Init(&NVIC_InitStructure);
}
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-7-12 10:54:58 | 显示全部楼层
好好看一下内核关于中断嵌套部分,结合实际情况来设定。
活到老,学到老。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-5 20:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表