金牌会员
 
- 积分
- 1366
- 金钱
- 1366
- 注册时间
- 2014-3-27
- 在线时间
- 358 小时
|
5金钱
首先麻烦原子哥看看下面的配置是否有问题,我用了TIM2 TIM3两个定时器中断。
void NVIC_Configuration(void)
|
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);
|
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); //
|
01
|
void TIM2_Int_Init(u16 arr,u16 psc)
|
03
|
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
05
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //
|
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); //
|
13
|
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //
|
14
|
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //
|
16
|
TIM_Cmd(TIM2, ENABLE); //
|
20
|
void TIM2_IRQHandler(void)
|
22
|
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //
|
24
|
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //
|
25
|
Timersys.TIM2systick++;
|
26
|
if(Timersys.TIM2systick>=6)//3s
|
28
|
Timersys.TIM2systick=0;
|
29
|
Timersys.TIM2RespFlag=1;//3S
|
34
|
void TIM3_Int_Init(u16 arr,u16 psc)
|
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); //
|
01
|
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //w
|
02
|
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //
|
04
|
TIM_Cmd(TIM3, ENABLE); //
|
07
|
void TIM3_IRQHandler(void) //TIM3
|
09
|
static u16 SysTickadd;
|
10
|
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
|
12
|
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
|
15
|
while(Kprocond.K1ShortDown)
|
17
|
Single_Segled_Ctrl(DS18B20_Get_Temp()/10);
|
18
|
if(Timersys.TIM2RespFlag)
|
20
|
Timersys.TIM2RespFlag=0;
|
37
|
TIM2_Int_Init(4999,7199);
|
38
|
TIM3_Int_Init(49,7199); //程序执行到此处或下一行,就无法运行。如果仅一个定时器就没问题。
|
问题就是,如果按上面的MAIN函数的初始化顺序,程序走到TIM3_Int_Init( 49,7199)就停止了,
因为TIM3中断函数调用了 Get_AdsData(); 而这个函数初始化是在下面的AdsConfig()中;这也就是说程序执行完TIM3
初始化就进了TIM3中断了,中断内执行的函数 Get_AdsData();还没有初始化造成程序无法继续运行。是不是这个原因。是不是把
TIM2_Int_Init(4999,7199);
|
|
TIM3_Int_Init(49,7199); /
|
这两句初始化放在所有其它初始化语句的下面(如下所示),才最合适。还有其它办法吗。就是第一次不让它进中断之类的。
37
|
TIM2_Int_Init(4999,7199);
|
38
|
TIM3_Int_Init(49,7199); //
|
{;}
}
|
|