OpenEdv-开源电子网

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

求助原子哥,两个定时器(中断)初始化问题。

[复制链接]

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
发表于 2015-11-13 09:27:42 | 显示全部楼层 |阅读模式
5金钱


首先麻烦原子哥看看下面的配置是否有问题,我用了TIM2  TIM3两个定时器中断。
void NVIC_Configuration(void)
02 {
03     NVIC_InitTypeDef NVIC_InitStructure;   
04     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//w
05     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //
06     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
07     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //?
08     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
09     NVIC_Init(&NVIC_InitStructure);
10      
11     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //
12     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //
13     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //
14     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
15     NVIC_Init(&NVIC_InitStructure);  //
16 }
01 void TIM2_Int_Init(u16 arr,u16 psc)
02 {
03   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
04      
05     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //
06      
07     TIM_TimeBaseStructure.TIM_Period = arr; // 
08     TIM_TimeBaseStructure.TIM_Prescaler =psc; //
09     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
10     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //
11     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //
12      
13     TIM_ClearFlag(TIM2, TIM_FLAG_Update);   //
14     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //
15  
16     TIM_Cmd(TIM2, ENABLE);  //
17                               
18 }
19  
20 void TIM2_IRQHandler(void)  
21 {
22     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //
23         {
24             TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //
25             Timersys.TIM2systick++;
26             if(Timersys.TIM2systick>=6)//3s
27             {
28                 Timersys.TIM2systick=0;
29                 Timersys.TIM2RespFlag=1;//3S
30             }
31         }
32 }
33  
34 void TIM3_Int_Init(u16 arr,u16 psc)
35 {
36   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
37     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //
38     //TIM_DeInit(TIM3);//w 
39     TIM_TimeBaseStructure.TIM_Period = arr; // 
40     TIM_TimeBaseStructure.TIM_Prescaler =psc; //
41     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
42     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //
43     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //
44          

01         TIM_ClearFlag(TIM3, TIM_FLAG_Update);   //w
02     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //
03  
04     TIM_Cmd(TIM3, ENABLE);  //                  
05 }
06  
07 void TIM3_IRQHandler(void)   //TIM3
08 {
09     static u16 SysTickadd;
10     if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 
11         {
12         TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); 
13          
14             Get_AdsData();
15             while(Kprocond.K1ShortDown)
16             {
17                 Single_Segled_Ctrl(DS18B20_Get_Temp()/10);
18                 if(Timersys.TIM2RespFlag)
19                     {
20                         Timersys.TIM2RespFlag=0;
21                         break;
22                     }
23                  
24                 }
25         }
26 }
27  
28  
29  
30  
31 int main(void)
32 {
33  
34 RCC_Configuration();
35 delay_init(72);
36 NVIC_Configuration();
37 TIM2_Int_Init(4999,7199);
38 TIM3_Int_Init(49,7199); //程序执行到此处或下一行,就无法运行。如果仅一个定时器就没问题
39 AdsConfig();
40 Key_GPIOinit();
41 while(1)
42 {;}
43 }


问题就是,如果按上面的MAIN函数的初始化顺序,程序走到TIM3_Int_Init(49,7199)就停止了,
因为TIM3中断函数调用了  Get_AdsData(); 而这个函数初始化是在下面的AdsConfig()中;这也就是说程序执行完TIM3
初始化就进了TIM3中断了,中断内执行的函数 Get_AdsData();还没有初始化造成程序无法继续运行。是不是这个原因。是不是把
TIM2_Int_Init(4999,7199);

TIM3_Int_Init(49,7199); /
这两句初始化放在所有其它初始化语句的下面(如下所示),才最合适。还有其它办法吗。就是第一次不让它进中断之类的。
31 int main(void)
32 {
33  
34 RCC_Configuration();
35 delay_init(72);
36 NVIC_Configuration();
39 AdsConfig();
40 Key_GPIOinit();
37 TIM2_Int_Init(4999,7199);
38 TIM3_Int_Init(49,7199); //
41 while(1)
{;}
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-13 12:18:22 | 显示全部楼层
没耐心看下去,帮顶吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-11-13 14:22:50 | 显示全部楼层
你把NVIC_Configuration();放在while(1)前面,最后初始化不就ok了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 02:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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