野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9907|回复: 3

作业:第18章GPIO外部中断作业:使用KEY2产生中断

[复制链接]
发表于 2022-2-28 11:30:44 | 显示全部楼层 |阅读模式
本帖最后由 嵌入式小明 于 2022-2-28 11:44 编辑

视频:【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili 野火论坛202202281134167895..png 作业1



我根据老师讲课的内容修改了代码,发现KEY2一直没有反应(派出按键损坏的可能),然后我参考了老师给出的例程代码,感觉没啥区别,但是我还是按照老师的方式修改了自己 的代码,和老师不同的地方在于,老师的例程,硬件相关部分都是使用了宏定义,而我没有使用。发现还是KEY2的中断无法产生。
希望老师或者其他小伙伴能帮我看看问题出在哪里。感谢大家。一下是我的代码

  1. //bsp_led.c代码

  2. //bsp:board support package  板级支持包
  3. #include "bsp_led.h"

  4. void LED_GPIO_Congig(void)
  5. {       
  6.         GPIO_InitTypeDef GPIO_InitStruct;
  7.         RCC_APB2PeriphClockCmd(LED_GPIO_CLK ,  ENABLE);

  8.         GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
  9.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  10.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  11.         GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);

  12.         GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN;
  13.         GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStruct);
  14.         //关闭所有灯
  15.         GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);               
  16.         GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);               
  17.        
  18. }
复制代码
  1. //bsp_led.h代码
  2. #ifndef __BSP_LED_H
  3. #define __BSP_LED_H

  4. #include "stm32f10x.h"

  5. #define LED_GPIO_CLK            RCC_APB2Periph_GPIOB

  6. #define LED_G_GPIO_PIN          GPIO_Pin_0
  7. #define LED_G_GPIO_PORT         GPIOB

  8. #define LED_B_GPIO_PIN          GPIO_Pin_1
  9. #define LED_B_GPIO_PORT         GPIOB

  10. #define  ON   1
  11. #define  OFF  0


  12. #define  LED_G(a)  if(a)         GPIO_ResetBits(LED_G_GPIO_PORT,  LED_G_GPIO_PIN); \
  13.                                                                                 else         GPIO_SetBits(LED_G_GPIO_PORT,  LED_G_GPIO_PIN);

  14. #define LED_G_TOGGLE   {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}
  15. #define LED_B_TOGGLE   {LED_B_GPIO_PORT->ODR ^= LED_B_GPIO_PIN;}

  16. void LED_GPIO_Congig(void);


  17. #endif  /* __BSP_LED_H*/
复制代码
  1. //bsp_exti.c代码
  2. //bsp : board support package 板级支持包

  3. #include "bsp_exti.h"

  4. static void NVIC_Config(void)
  5. {
  6.         NVIC_InitTypeDef NVIC_InitStruct;
  7.        
  8.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1 );//需要先配置中断优先级分组
  9.        
  10.         NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//配置中断源
  11.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  12.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  13.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  14.         NVIC_Init(&NVIC_InitStruct);
  15.        
  16.         //配置按键2中断源
  17.         NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  18.         NVIC_Init(&NVIC_InitStruct);
  19. }

  20. void EXTI_Key_Config(void)
  21. {
  22.         GPIO_InitTypeDef GPIO_InitStruct;
  23.         EXTI_InitTypeDef EXTI_InitStruct;       
  24.        
  25.         //配置中断优先级
  26.         NVIC_Config();
  27.        
  28.         //开启时钟
  29.         RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK | KEY2_INT_GPIO_CLK ,  ENABLE);
  30.        
  31.         /**************************KEY1配置********************/
  32.         GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;
  33.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  34.         GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct);
  35.        
  36.         GPIO_EXTILineConfig( GPIO_PortSourceGPIOA,  GPIO_PinSource0);//选择输入线        ,即选择EXTI的信号源
  37.         EXTI_InitStruct.EXTI_Line = EXTI_Line0;
  38.         EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  39.         EXTI_InitStruct.EXTI_Mode =  EXTI_Mode_Interrupt;
  40.         EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
  41.         EXTI_Init(&EXTI_InitStruct);       
  42.        
  43.         /**************************KEY2配置********************/
  44.         GPIO_InitStruct.GPIO_Pin = KEY2_INT_GPIO_PIN;
  45.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  46.         GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStruct);
  47.        
  48.         GPIO_EXTILineConfig( GPIO_PortSourceGPIOC,  GPIO_PinSource13);//选择输入线,即选择EXTI的信号源
  49.         EXTI_InitStruct.EXTI_Line    =  EXTI_Line13;
  50.         EXTI_InitStruct.EXTI_Mode    =  EXTI_Mode_Interrupt;
  51.         EXTI_InitStruct.EXTI_Trigger =  EXTI_Trigger_Falling;//下降沿触发
  52.         EXTI_InitStruct.EXTI_LineCmd =  ENABLE;
  53.         EXTI_Init(&EXTI_InitStruct);
  54.        
  55.        
  56. }

复制代码
  1. //bsp_exti.h代码
  2. #ifndef __BSP_EXTI_H
  3. #define __BSP_EXTI_H
  4. #include "stm32f10x.h"

  5. #define KEY1_INT_GPIO_PIN          GPIO_Pin_0
  6. #define KEY1_INT_GPIO_PORT         GPIOA
  7. #define KEY1_INT_GPIO_CLK          (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)

  8. #define KEY2_INT_GPIO_PIN          GPIO_Pin_13
  9. #define KEY2_INT_GPIO_PORT         GPIOC
  10. #define KEY2_INT_GPIO_CLK          (RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)

  11. void EXTI_Key_Config(void);
  12. #endif /*__BSP_EXTI_H*/
复制代码
  1. //main.c代码
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_exti.h"

  5. void Delay(uint32_t count)
  6. {
  7.         for(;count != 0;count--);
  8. }

  9. int main(void)
  10. {
  11.         LED_GPIO_Congig();
  12.         EXTI_Key_Config();

  13.        
  14.         while(1)
  15.         {
  16.         }
  17. }
复制代码
  1. //stm32f10x_it.c代码。142行处添加
  2. void EXTI0_IRQHandler(void)
  3. {
  4.         if( EXTI_GetITStatus( EXTI_Line0 != RESET))
  5.         {
  6.                 LED_G_TOGGLE;
  7.         }
  8.         EXTI_ClearITPendingBit(EXTI_Line0);

  9. }


  10. void EXTI15_10_IRQHandler(void)
  11. {
  12.         if( EXTI_GetITStatus( EXTI_Line13 != RESET))
  13.         {
  14.                 LED_B_TOGGLE;
  15.         }
  16.         EXTI_ClearITPendingBit(EXTI_Line13);

  17. }
复制代码



回复

使用道具 举报

发表于 2022-2-28 21:48:53 | 显示全部楼层
野火论坛202202282147382553..png

形参错了。。。。括号括错地方了。。。。把判断语句当成形参了。。。。
回复 支持 反对

使用道具 举报

发表于 2022-2-28 21:50:08 | 显示全部楼层
看了俩小时,感觉我快会用EXTI点灯了
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-1 17:33:24 | 显示全部楼层
梦落雨深 发表于 2022-2-28 21:50
看了俩小时,感觉我快会用EXTI点灯了

妈呀,真的太感谢了,我的两个小问题全是你解决的,真的万分感谢。
以后我一定自己先多多检查,避免出现这种问题。
主要是这个代码,第一个中断它竟然鬼使神差的执行了起来,我就直接复制了。
这个问题我算是领教了。
再次万分感谢!
太棒了!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 09:31 , Processed in 0.045184 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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