初级会员

- 积分
- 118
- 金钱
- 118
- 注册时间
- 2019-7-17
- 在线时间
- 29 小时
|
1金钱
大家好我最近编程时遇到了一个奇怪的现象,我打算编程让战舰V3实现如下内容:led绿灯每五秒变化一次(定时器中断原理),同时按下wake_up按键时led绿灯会立刻变亮(如果是熄灭状态就变亮,亮的状态则保持不变,这个我用的是外部中断实验),同时按下wake_up按键后绿灯还是每五秒变一次(即定时器中断没有受到影响)
同时我在各个中断处也做了“print”记号,方便用Xcom查看,下载到开发板的时候一开始实验效果很不错符合我的预计效果,可之后程序却卡住了,xcom上面显示程序没有自己在跑,我之后又自己多按了几次wake_up按键结果程序自己又可以跑了,总之来来去去就是我按按键的时候有一定概率程序会跑死,后来我用硬件调试,发现了卡住的地方(下方图片标注),可我是初学者也不知道为什么会卡在这里,大佬们解释一下,顺便看看我的代码,谢谢
main函数
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
BEEP_Init();
KEY_Init();
EXTIX_Init();
TIM3_Int_Init(49999,7199);
LED0=0;
while(1)
{
printf("OK\r\n");
delay_ms(1000);
}
}
外部中断函数
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
KEY_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitStruct.EXTI_Line=EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(& NVIC_InitStruct);
}
void EXTI0_IRQHandler()
{
delay_ms(10);
if(WK_UP==1)
{
LED1=1;
printf("OKSADASDSA\r\n");
TIM3_Int_Init(49999,7199);
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
定时器中断函数
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
//ÖжÏÓÅÏȼ¶NVICÉèÖÃ
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); //ʹÄÜTIMx
}
//¶¨Ê±Æ÷3ÖжϷþÎñ³ÌÐò
void TIM3_IRQHandler(void) //TIM3ÖжÏ
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
LED1=!LED1;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
}
其余函数没有改过,附上源码希望求解,谢谢
实验5 外部中断实验.rar
(2.71 MB, 下载次数: 0)
|
|