OpenEdv-开源电子网

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

STM32外部中断问题:外部中断函数0 把消抖代码去掉可以正常向串口打印数据,中断函数3和4有无消抖都不行但下载正点的源码就可以

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-11-17
在线时间
5 小时
发表于 2017-11-17 21:27:06 | 显示全部楼层 |阅读模式
#include"stm32f10x.h"
#include"stdio.h"
#include"delay.h"

#if 1
#pragma import(__use_no_semihosting)            
               
struct __FILE
{
int handle;
};
FILE __stdout;      

_sys_exit(int x)
{
x = x;
}

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
return ch;
}
#endif
#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)


void EXTI_LIYA()
{
     GPIO_InitTypeDef GPIO_InitTypeDefStruture;
     EXTI_InitTypeDef EXTI_InitTypeDefStruture;
     NVIC_InitTypeDef NVIC_InitTypeDefStruture;

     GPIO_InitTypeDefStruture.GPIO_Mode=GPIO_Mode_IPD;
     GPIO_InitTypeDefStruture.GPIO_Pin=GPIO_Pin_0;
     GPIO_InitTypeDefStruture.GPIO_Speed=GPIO_Speed_10MHz;

      GPIO_Init(GPIOA,&GPIO_InitTypeDefStruture);

     GPIO_InitTypeDefStruture.GPIO_Mode=GPIO_Mode_IPU;
     GPIO_InitTypeDefStruture.GPIO_Pin=GPIO_Pin_3;

     GPIO_Init(GPIOE,&GPIO_InitTypeDefStruture);

     GPIO_InitTypeDefStruture.GPIO_Mode=GPIO_Mode_IPU;
     GPIO_InitTypeDefStruture.GPIO_Pin=GPIO_Pin_4;

     GPIO_Init(GPIOE,&GPIO_InitTypeDefStruture);
////////////////////////////////////////////////////////////////////////////////////
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
   
     EXTI_InitTypeDefStruture.EXTI_Line=EXTI_Line4;
   EXTI_InitTypeDefStruture.EXTI_LineCmd=ENABLE;
   EXTI_InitTypeDefStruture.EXTI_Mode=EXTI_Mode_Interrupt;
   EXTI_InitTypeDefStruture.EXTI_Trigger=EXTI_Trigger_Falling;   
     EXTI_Init(&EXTI_InitTypeDefStruture);
      
   EXTI_InitTypeDefStruture.EXTI_Line=EXTI_Line3;
   EXTI_InitTypeDefStruture.EXTI_LineCmd=ENABLE;
      EXTI_InitTypeDefStruture.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitTypeDefStruture);
   
      EXTI_InitTypeDefStruture.EXTI_Line=EXTI_Line0;
   EXTI_InitTypeDefStruture.EXTI_Trigger=EXTI_Trigger_Rising;   
     EXTI_Init(&EXTI_InitTypeDefStruture);


   NVIC_InitTypeDefStruture.NVIC_IRQChannel=EXTI0_IRQn;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelCmd=ENABLE;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelPreemptionPriority=2;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelSubPriority=1;
   
   NVIC_Init(&NVIC_InitTypeDefStruture);
   
   NVIC_InitTypeDefStruture.NVIC_IRQChannel=EXTI3_IRQn;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelCmd=ENABLE;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelPreemptionPriority=2;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelSubPriority=0;
   
   NVIC_Init(&NVIC_InitTypeDefStruture);
   
   NVIC_InitTypeDefStruture.NVIC_IRQChannel=EXTI4_IRQn;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelCmd=ENABLE;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelPreemptionPriority=2;
   NVIC_InitTypeDefStruture.NVIC_IRQChannelSubPriority=2;
   
   NVIC_Init(&NVIC_InitTypeDefStruture);
   
   
   
}
void USART_Init_LIYA()
{
    GPIO_InitTypeDef GPIO_InitTypeDefStruture;
     USART_InitTypeDef USART_InitTypeDefStruture;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
////////////////////////////////////////////////////////////////////////////


    GPIO_InitTypeDefStruture.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitTypeDefStruture.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitTypeDefStruture.GPIO_Speed=GPIO_Speed_10MHz;

    GPIO_Init(GPIOA,&GPIO_InitTypeDefStruture);
//////////////////////////////////////////////////////////////////////

    GPIO_InitTypeDefStruture.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_InitTypeDefStruture.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitTypeDefStruture.GPIO_Speed=GPIO_Speed_10MHz;

    GPIO_Init(GPIOA,&GPIO_InitTypeDefStruture);
//////////////////////////////////////////////////////////////////////


    USART_InitTypeDefStruture.USART_BaudRate=115200;
    USART_InitTypeDefStruture.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitTypeDefStruture.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_InitTypeDefStruture.USART_Parity=USART_Parity_No;
     USART_InitTypeDefStruture.USART_StopBits=USART_StopBits_1;
    USART_InitTypeDefStruture.USART_WordLength=USART_WordLength_8b;
   

     USART_Init(USART1,&USART_InitTypeDefStruture);
   
   USART_Cmd(USART1,ENABLE);
///////////////////////////////////////////////////////////////////////   
}


void EXTI0_IRQHandler(void)
{
delay_ms(10);
if(WK_UP==1)
{     
     printf("\r\n\r\n某某某\r\n\r\n");
}
EXTI_ClearITPendingBit(EXTI_Line0);
}

void EXTI3_IRQHandler()
{
  delay_ms(10);
  if(KEY1==0)
  {
  printf("\r\n\r\n你是大傻逼\r\n\r\n");
  }
    EXTI_ClearITPendingBit(EXTI_Line3);
}
void EXTI4_IRQHandler()
{
   delay_ms(10);
  if(KEY0==0)
  {
   printf("\r\n\r\n你就是大傻逼");
  }
  EXTI_ClearITPendingBit(EXTI_Line4);
}

int main()
{
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  USART_Init_LIYA();
  EXTI_LIYA();
  while(1);
  
  
}




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

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-11-20 17:27:50 | 显示全部楼层
哎,又是在中断中延时的......这种做法非常不好,虽然没有bug,但是影响整个系统的实时性。按键消抖很简单,做一个定时器,当检测到外部中断时开启定时器,定时10~20ms,定时时间到了以后检测按键是不是还是被按下,这样就避免在中断中延时了
坚持不懈的努力!
回复 支持 1 反对 0

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-11-17
在线时间
5 小时
 楼主| 发表于 2017-11-17 21:29:40 | 显示全部楼层
这是什么问题啊,按键key0,key1和key_up的配置代码一摸一样的啊,而且板子下载官方的代码正常啊。。。蒙蔽一下午。而且中断函数0加了消抖代码居然不行了。。。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-11-17
在线时间
5 小时
 楼主| 发表于 2017-11-27 22:11:51 | 显示全部楼层
meimengxing2014 发表于 2017-11-20 17:27
哎,又是在中断中延时的......这种做法非常不好,虽然没有bug,但是影响整个系统的实时性。按键消抖很简单 ...

不太懂你的意思,初始化外部中断后,如果检测到相应io电平变化就直接进入中断函数了,然后在中断消抖,而且上面的消抖延时函数使用systick定时器延时的。在中断外延时这怎么解释
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-11-17
在线时间
5 小时
 楼主| 发表于 2017-11-27 22:13:23 | 显示全部楼层
meimengxing2014 发表于 2017-11-20 17:27
哎,又是在中断中延时的......这种做法非常不好,虽然没有bug,但是影响整个系统的实时性。按键消抖很简单 ...

你是否有stm32 f1开发板下载到你的板子看看有没问题。我实在找不出我的问题在哪,也没发现我的程序有问题
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2020-6-7
在线时间
18 小时
发表于 2020-7-13 22:10:59 | 显示全部楼层
楼主找到原因没啊
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2020-6-7
在线时间
18 小时
发表于 2020-7-13 22:13:53 | 显示全部楼层
楼主,解决了吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 11:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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