K1 K2作为中断源控制红色LED灯,实现任意键按一下LED灯亮或者灭

  1 #include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
  2 #include "stm32f10x_gpio.h"
  3 #include "stm32f10x_exti.h"
  4 #include "misc.h"
  5 /*
  6 *K1 K2作为中断源控制红色LED灯,实现任意键按一下LED灯亮或者灭
  7 */
  8 /*GPIO、NVIC、EXTI配置*/
  9 int    peizhi()
 10 {
 11 
 12     /*GPIO配置*/
 13     //   K1配置 PA0
 14 GPIO_InitTypeDef a;
 15 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 16 a.GPIO_Speed=GPIO_Speed_50MHz;
 17 a.GPIO_Pin=GPIO_Pin_5;
 18 a.GPIO_Mode=GPIO_Mode_Out_PP;
 19 GPIO_Init(GPIOB,&a);
 20 
 21     
 22 /*NVIC嵌套向量中断控制器*/
 23 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    
 24 NVIC_InitTypeDef b;
 25 b.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0_IRQn外部中断线0中断
 26 b.NVIC_IRQChannelPreemptionPriority = 1;//0 1 2 3 4 
 27 b.NVIC_IRQChannelSubPriority = 1;//0 1 2 3 4 
 28 b.NVIC_IRQChannelCmd = ENABLE;
 29 NVIC_Init(&b);
 30         
 31     /*外部中断EXTI配置*/
 32 EXTI_InitTypeDef c;
 33 c.EXTI_Line=EXTI_Line0;//外部路线0 和13
 34 c.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
 35 c.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿为中断请求
 36 c.EXTI_LineCmd=ENABLE;//使能
 37 EXTI_Init(&c);//指向结构体EXTI_InitTypeDef的指针a
 38 
 39 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//选择GPIO管脚用作外部中断线路
 40 
 41 
 42 
 43 //K2配置  PC13
 44 //以下K2的配置基于K1配置的,就是说K2很多配置和K1相同的,只是把不同的配置写下来
 45 
 46 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
 47 GPIO_Init(GPIOB,&a);
 48 
 49 b.NVIC_IRQChannel = EXTI15_10_IRQn;
 50 NVIC_Init(&b);
 51 
 52 c.EXTI_Line = EXTI_Line13;
 53 EXTI_Init(&c);
 54 
 55 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
 56 
 57 }
 58 
 59 
 60 /*主函数*/
 61 int main(void)
 62 {
 63     peizhi();
 64     
 65 }
 66 
 67 /*中断服务函数*/
 68 void EXTI0_IRQHandler(void)
 69 {
 70     //确保是否产生EXTI line中断
 71     if(EXTI_GetITStatus(EXTI_Line0)!=RESET) // 检查指定的EXTI线路触发请求发生与否
 72     {
 73         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)//
 74         {
 75         GPIO_SetBits(GPIOB,GPIO_Pin_5);
 76         }
 77         else
 78         {    
 79         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
 80         }
 81         EXTI_ClearITPendingBit(EXTI_Line0);
 82     }
 83 }
 84 
 85     void EXTI15_10_IRQHandler(void)
 86 {
 87     //确保是否产生EXTI line中断
 88     if(EXTI_GetITStatus(EXTI_Line13)!=RESET) // 检查指定的EXTI线路触发请求发生与否
 89     {
 90         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)//
 91         {
 92         GPIO_SetBits(GPIOB,GPIO_Pin_5);
 93         }
 94         else
 95         {    
 96         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
 97         }
 98         EXTI_ClearITPendingBit(EXTI_Line13);
 99     }        
100 }

 

posted @ 2017-10-23 15:21  徐景祥  阅读(2454)  评论(0编辑  收藏  举报