STM32 外部 按键中断 问题

2019-07-21 04:24发布

各位大佬 是这样的 我想做一个 基于STM32F103C8T6 的按键外部中断 以GPIOB Pin 0 作为中断 选择 0中断线  ,GPIOA Pin 0 作为led 输出 主程序中 led 为灭的状态 ,监测到中断后 进行亮灯操作,经过操作,可以实现功能,但是测试的时候 发现 我按GPIOB 的Pin 1 引脚外连的按键 也可以引起中断,请问这是为什么呢,如何解决这个问题呢?

  1. [mw_shl_code=c,true]#include "stm32f10x.h"                  // Device header
  2. #include "stm32f10x_gpio.h"             // Keil::Device:StdPeriph Drivers:GPIO
  3. #include "stm32f10x_exti.h"             // Keil::Device:StdPeriph Drivers:EXTI

  4. void delay(u32 t)
  5. {
  6.   while(--t);
  7. }

  8. void ledGpioInitConfig()  //led初始化 选择GPIOA Pin_0 作为推挽输出
  9. {
  10.   GPIO_InitTypeDef GPIO_InitStructure;
  11.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  12.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. }

  17. void nvicInitConfig() //初始化 嵌套向量中断控制器
  18. {
  19.   NVIC_InitTypeDef NVIC_Initstructure;

  20.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  21.   NVIC_Initstructure.NVIC_IRQChannel = EXTI0_IRQn;
  22.   NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = 0;
  23.   NVIC_Initstructure.NVIC_IRQChannelSubPriority = 1;
  24.   NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE;
  25. }

  26. void extiGpioBPin1InitConfig() //初始化 外部中断配置 选择 GPIOA Pin 0 作为外部按键 且下降沿有效
  27. {
  28.   GPIO_InitTypeDef GPIO_InitStructure;
  29.   EXTI_InitTypeDef EXTI_InitStructure;

  30.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  31.   nvicInitConfig();

  32.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  33.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  34.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  35.   EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  36.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  37.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  38.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  39.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);
  40. }

  41. void EXTI0_IRQHandler() //中断服务程序控制 led亮
  42. {
  43.   if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  44.   {
  45.     GPIO_SetBits(GPIOA, GPIO_Pin_0);
  46.     delay(0xFFFFF);
  47.     EXTI_ClearFlag(EXTI_Line0);
  48.   }
  49.   EXTI_ClearITPendingBit(EXTI_Line0);
  50. }

  51. int main()
  52. {
  53.   ledGpioInitConfig();
  54.   extiGpioBPin1InitConfig();
  55.   while(1)
  56.   {
  57.     GPIO_ResetBits(GPIOA, GPIO_Pin_0);
  58.     delay(0xFFFFF);
  59.   }
  60. }
  61. [/mw_shl_code]
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
翼行园子
1楼-- · 2019-07-21 05:38
仿真 全速运行 在中断函数打断点  触发相应IO  看程序如何运行
1655510098
2楼-- · 2019-07-21 08:09
翼行园子 发表于 2019-3-13 10:14
仿真 全速运行 在中断函数打断点  触发相应IO  看程序如何运行

好 已解决 哎呀 还是自己的语法问题 233333333. 得多练练 谢谢了老哥

一周热门 更多>