用PA0上接的按钮控制PC13上接的led灯(中断方式)

2019-08-14 00:06发布

本帖最后由 lmon 于 2017-9-20 22:31 编辑

mark一下:程序总共需要配置三个地方,一个void NVIC_PZ( )配置中断优先级啥的,一个void GPIO_PZ( )配置IO口,一个void EXTI_PZ( )配置外部中断。最后再写一个外部中断0中断函数void EXTI0_IRQHandler(void)

#include "STM32f10x.h"
void delay(unsigned int u)
{
  unsigned int i=0,j=0;
        for(i=0;i<u;i++)
          for(j=0;j<12000;j++);
}
void NVIC_PZ(void)
{
        NVIC_InitTypeDef n;        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置2位为抢占式优先级,2位为响应式优先级        
        n.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0中断
        n.NVIC_IRQChannelPreemptionPriority=2;// 抢占优先级为2
        n.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
        n.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能,开总中断开关
        NVIC_Init(&n);        //根据上面指定的参数初始化NVIC寄存器
        NVIC_EnableIRQ(EXTI0_IRQn);//开EXTI0中断
}
void GPIO_PZ( )
{   //PC13配置为推挽输出
       GPIO_InitTypeDef g;
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
       g.GPIO_Pin=GPIO_Pin_13;
       g.GPIO_Speed=GPIO_Speed_50MHz;
       g.GPIO_Mode=GPIO_Mode_Out_PP;
       GPIO_Init(GPIOC,&g);
   //PA0配置为上拉输入
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       g.GPIO_Pin=GPIO_Pin_0;
       g.GPIO_Speed=GPIO_Speed_50MHz;
       g.GPIO_Mode=GPIO_Mode_IPU;
       GPIO_Init(GPIOA,&g);
}

void EXTI_PZ( )
{
       EXTI_InitTypeDef e;
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟        
       e.EXTI_Line=EXTI_Line0;
       e.EXTI_Mode=EXTI_Mode_Interrupt;
       e.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
       e.EXTI_LineCmd=ENABLE;
       EXTI_Init(&e);
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//PA0映射到EXTI0
}
int main()
{
       SystemInit( );//时钟初始化到72mhz
       NVIC_PZ();
       GPIO_PZ();
       EXTI_PZ();        
       while(1)
        {
     //
        }
}
void EXTI0_IRQHandler(void)
{
        delay(10);//消抖
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)                  //PA0按键
        {               
         GPIO_ResetBits(GPIOC,GPIO_Pin_13);                        
        }
        else GPIO_SetBits(GPIOC,GPIO_Pin_13);
        EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
}



0条回答

一周热门 更多>