新手入门
- 积分
- 4
- 金钱
- 4
- 注册时间
- 2018-11-24
- 在线时间
- 1 小时
|
8金钱
本帖最后由 东方白 于 2018-11-24 21:28 编辑
用mini的板子做一个温度实时显示系统,使用定时器3做采样频率的控制。
在中断初始化的时候程序总是卡死在NVIC_Init(&NVIC_InitStructure);这里!
程序如下:
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
LED1=!LED1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE);
}
LED1=!LED1;在 NVIC_Init(&NVIC_InitStructure); 前灯可以点亮,在他之后就不能被点亮。
我判断程序卡死在了 NVIC_Init(&NVIC_InitStructure); 这里
中断服务函数:
void TIM3_IRQHandler(void) //
{
/* unsigned int tp;
unsigned char i;
unsigned int D;
unsigned char DisplayData[5];
unsigned char smgduan[10]=
{
'0','1','2','3','4','5','6','7','8','9'
}; */
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
/* TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
tp=DS18B20_Get_Temp(); //
LED1=!LED1; //
D=282-tp/20;
DisplayData[0]=smgduan[tp/1000]; //
DisplayData[1]=smgduan[tp%1000/100];
DisplayData[2]='.';
DisplayData[3]=smgduan[tp%100/10];
DisplayData[4]=smgduan[tp%10];
GUI_sprintf_char(138,50, '+', 0xf800,0);
GUI_sprintf_string(90,50,"TEMP:", 0xffe0,0x7bef);
for(i=0;i<5;i++)
{
GUI_sprintf_char(146+8*i,50,DisplayData, 0xf800,0);
}
sprintf_zhizhen(37,D,WHITE);
}
}
注释掉中断服务函数if内的内容,程序依旧会卡死。
主函数:
int main(void)
{
unsigned int x,y;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //·Ö×é
//USAT_Init();
LED_Init();
LCD_Init();
LCD_Scan_Dir();
TIM3_Int_Init(4999,7199);
delay_ms(20);
GUI_clearscreen(WHITE);
GUI_sprintf_HZ(25, 30, 0x07ff,WHITE);
delay_ms(500);
delay_ms(500);
delay_ms(500);
GUI_clearscreen(WHITE);
while(1)
{
此处省略;
}
}
不知道如何解决!希望有人可以指出问题。
|
|