7.27

今日学习任务

1、复习昨天内容

2、实现4个按键分别控制4个彩灯亮灭

今日任务完成情况基本完成
今日开发问题汇总

今日未解决问题

基本解决

今日开发收获通过自主学习,消化了前两天的学习内容,对stm32单片机的理解加深了
  
部分代码
 
  1. #include "bsp_key.h"

  2.  
  3.  
  4. /**********按键与中断线对应关系******

  5. | |

  6. key1 = PA0 | LED1 = PC1 |

  7. key2 = PC13 | LED2 = PC2 |

  8. key3 = PA2 | LED3 = PC3 |

  9. key4 = PB5 | LED4 = PC4 |

  10. | |

  11. ************************************/

  12.  
  13.  
  14.  
  15.  
  16.  
  17. void Key_Exit_Config(void)

  18. {

  19. //结构体变量声明

  20. GPIO_InitTypeDef GPIO_InitStructure;

  21. EXTI_InitTypeDef EXTI_InitStructure;

  22. NVIC_InitTypeDef NVIC_InitStructure;

  23.  
  24. /********************************************

  25. 使能I/O口时钟,选择GPIOA,GPIOB,GPIOC三个口

  26. 开启SYSCFG时钟

  27. ********************************************/

  28. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB |

  29. RCC_AHB1Periph_GPIOA, ENABLE);

  30. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  31.  
  32.  
  33.  
  34. /*****************************

  35. 初始化I/O口为输入浮空模式,

  36. 根据指定的参数初始化GPIOX外设

  37. *****************************/

  38.  
  39. //浮空模式

  40. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13); //PC13

  41. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

  42. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  43. //根据指定的参数初始化GPIOX外设

  44. GPIO_Init(GPIOC, &GPIO_InitStructure);

  45.  
  46.  
  47. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_5); //PB5

  48. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

  49. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  50. GPIO_Init(GPIOB, &GPIO_InitStructure);

  51.  
  52. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_2); //PA0和PA2

  53. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

  54. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  55. GPIO_Init(GPIOA, &GPIO_InitStructure);

  56.  
  57.  
  58.  
  59. /***************************

  60. 配置GPIO口与中断线的映射关系

  61. 相当于把GPIOx口与中断线连起来

  62. ***************************/

  63. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);

  64. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5);

  65. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);

  66. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

  67.  
  68.  
  69. /**************************

  70. 初始化中断线

  71. 配置触发条件,模式等参数

  72. **************************/

  73.  
  74. EXTI_InitStructure.EXTI_Line = (EXTI_Line13 | EXTI_Line5 |

  75. EXTI_Line0 | EXTI_Line2); //选择需要用到的中断线

  76. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  77. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /* 上升沿触发 */

  78. EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  79. EXTI_Init(&EXTI_InitStructure);

  80.  
  81.  
  82. /*************************

  83. 配置中断分组,并使能中断

  84. 配置中断通道,中断优先级等参数

  85. **************************/

  86.  
  87. //PC13

  88. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键外部中断通道

  89. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E; //抢占优先级0x0e

  90. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E; //相应优先级0x0e

  91. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  92. NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化

  93.  
  94. //PB5

  95. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //IRQ指的是中断请求

  96. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E;

  97. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;

  98. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  99. NVIC_Init(&NVIC_InitStructure);

  100.  
  101. //PA0

  102. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //IRQ指的是中断请求

  103. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E;

  104. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;

  105. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  106. NVIC_Init(&NVIC_InitStructure);

  107.  
  108. //PA2

  109. NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //IRQ指的是中断请求

  110. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E;

  111. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;

  112. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  113. NVIC_Init(&NVIC_InitStructure);

  114.  
  115. }

  116.  
  117.  
  118. /***********中断服务函数*********************

  119. 不同中断线对应不同中断函数,可根据需要写多个

  120. 中断函数

  121. ********************************************/

  122.  
  123.  
  124. void EXTI0_IRQHandler(void)

  125. {

  126. if (EXTI_GetITStatus(EXTI_Line0) != RESET)

  127. {

  128. //PA0,KEY1按下

  129. GPIO_ToggleBits(GPIOC,GPIO_Pin_1);

  130. EXTI_ClearITPendingBit(EXTI_Line0);

  131. printf("PA0 中断\r\n");

  132. }

  133. }

  134.  
  135. void EXTI15_10_IRQHandler(void)

  136. {

  137. /* PC13, K2按下*/

  138. if (EXTI_GetITStatus(EXTI_Line13) != RESET)

  139. {

  140. GPIO_ToggleBits(GPIOC,GPIO_Pin_2);

  141. EXTI_ClearITPendingBit(EXTI_Line13);

  142. printf("PC13 中断\r\n");

  143. }

  144. }

  145.  
  146. void EXTI2_IRQHandler(void)

  147. {

  148. //PA2,K3按下

  149. if (EXTI_GetITStatus(EXTI_Line2) != RESET)

  150. {

  151. GPIO_ToggleBits(GPIOC,GPIO_Pin_3);

  152. EXTI_ClearITPendingBit(EXTI_Line2);

  153. printf("PA2 中断\r\n");

  154. }

  155. }

  156.  
  157. void EXTI9_5_IRQHandler(void)

  158. {

  159. //PB5,K4按下

  160. if (EXTI_GetITStatus(EXTI_Line5) != RESET)

  161. {

  162. GPIO_ToggleBits(GPIOC,GPIO_Pin_4);

  163. EXTI_ClearITPendingBit(EXTI_Line5);

  164. printf("PB5中断\r\n");

  165. }

  166. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值