OpenEdv-开源电子网

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

正常实验做着做着卡住的问题

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-7-17
在线时间
29 小时
发表于 2020-2-21 16:45:00 | 显示全部楼层 |阅读模式
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  );  

  }
}


其余函数没有改过,附上源码希望求解,谢谢




急急急.jpg 实验5 外部中断实验.rar (2.71 MB, 下载次数: 0)

最佳答案

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

在中断服务函数里面,先判断SR,再进行KEY判断。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-2-21 16:45:01 | 显示全部楼层
在中断服务函数里面,先判断SR,再进行KEY判断。
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-7-17
在线时间
29 小时
 楼主| 发表于 2020-2-22 10:24:15 | 显示全部楼层
正点原子 发表于 2020-2-21 23:18
在中断服务函数里面,先判断SR,再进行KEY判断。

谢谢谢谢原子哥解决了,但是我又遇到了另一个真的我自己都觉得奇葩的问题,代码还是原来的代码,只不过我想把led改成蜂鸣器,于是我在中断服务函数中调整了一下,就只是把led换成了PBout(8),结果发现一开机蜂鸣器居然不听使唤的乱叫,后来debug了一下居然发现在NVIC_Init中居然自动把PBout(8)变成了高电平,我就郁闷了我又没动NVIC_Iint,更何况NVIC_Init似乎和PBout(8)并没有什么关系,为什么会出现这种情况?为什么换成led又可以了?真的百思不得其解@正点原子 蜂鸣器问题.png LED.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 23:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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