打印

PA0口按键无法进入中断函数,求助

[复制链接]
413|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰糖炖雪梨|  楼主 | 2020-4-13 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x.h"

void RCC_Configuration()//设置系统各部分时钟函数
{
                ErrorStatus HSEStartUPStatus;                 //定义枚举型变量HSEStartUPStatus
                RCC_DeInit();                                 //系统时钟复位
                RCC_HSEConfig(RCC_HSE_ON);                    //开启HSE
                HSEStartUPStatus=RCC_WaitForHSEStartUp();      //等待HSE起振稳定
  if(HSEStartUPStatus==SUCCESS)                    //判断HSE是否起振 //SUCCESS在stm32f10x.h里面为枚举的一个值
                                {
                                        RCC_HCLKConfig(RCC_SYSCLK_Div1);          //选择HCLK(AHB)时钟源为SYSCLK 1分频
                                        RCC_PCLK2Config(RCC_HCLK_Div1);           //选择PCLK2时钟源为CLK(AHB) 1分频
                                        RCC_PCLK1Config(RCC_HCLK_Div2);           //选择PCLK1时钟源为CLK(AHB) 2分频
                                        FLASH_SetLatency(FLASH_Latency_2);        //设置FLASH延时周期数为2
                                        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //使能FLASH预取缓存
                                        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     //选择PLL时钟源为HSE 1分频,倍频数为9,则PLL=8MHZ*9=72MHZ
                                        RCC_PLLCmd(ENABLE);                                      //使能PLL
                                        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);        //等待PLL输出稳定
                                        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);               //选择SYSCLK时钟源为PLL
                                        while(RCC_GetSYSCLKSource()!=0x08);                             //等待PLL成为SYSCLK时钟源
                                }
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA ,ENABLE);   //打开APB2总线上的GPIOC和GPIOA的时钟
                        
}

void GPIO_Configuration()   //GPIO设置函数
{
        GPIO_InitTypeDef GPIO_InitStructure;   //在stm32f10x_gpio.h里面的结构体,GPIO_InitStructure是结构体标识
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;   //设置使用GPIOC.2和GPIOC.3
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //设置GPIOC.2和GPIOC.3的翻转频率为50MHZ
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //设置GPIOC.2和GPIOC.3的输出方式为推挽
        GPIO_Init(GPIOC, &GPIO_InitStructure);             //GPIOC初始化,&是取地址        
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
        GPIO_Init(GPIOA, &GPIO_InitStructure);         //GPIOA初始化,&是取地址        //以上三行是设置GPIOA.0口,作为按键检测输入口,对3.3V接按键
}


void NVIC_Config(void)
                        {
                                NVIC_InitTypeDef NVIC_InitTStruct;

                                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        /* 第一步:配置中断优先级的分组 */
                                /* 第二步:配置NVIC的初始化结构体 */
                                NVIC_InitTStruct.NVIC_IRQChannel =  EXTI0_IRQn;            //使能按键外部中断通道
                                NVIC_InitTStruct.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
                                NVIC_InitTStruct.NVIC_IRQChannelSubPriority = 0;         //子优先级0
                                NVIC_InitTStruct.NVIC_IRQChannelCmd = ENABLE;           //使能外部中断通道
                                
                                NVIC_Init(&NVIC_InitTStruct);                /* 第三步:调用NVIC初始化函数把配置好的结构体成员写到寄存器里面 */
                        }

void EXTI_KEY_Config(void)
{
        EXTI_InitTypeDef EXTI_InitTStruct;
  NVIC_Config();

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开引脚复用AFIO时钟
               
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);        //中断线配置
        
        EXTI_InitTStruct.EXTI_Line = EXTI_Line0;               //中断线0
        EXTI_InitTStruct.EXTI_Mode = EXTI_Mode_Interrupt;      //中断模式
        EXTI_InitTStruct.EXTI_Trigger = EXTI_Trigger_Rising;   //上升沿触发
        EXTI_InitTStruct.EXTI_LineCmd = ENABLE;                //使能
        EXTI_Init(&EXTI_InitTStruct);                                // 初始化,调用中断初始化函数把配置好的结构体成员写到寄存器里面
}




void delay(u32 z)
{
        u32 x,y;
        for(x=z;x>0;x--)
          for(y=300;y>0;y--);
}


int main(void)
{
        u8 i;
        RCC_Configuration(); //设置系统各部分时钟函数
        GPIO_Configuration(); //GPIO设置函数
        EXTI_KEY_Config();
        
        
        for(i=0;i<5;i++)
          {
                GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);//GPIOC.2和GPIOC.3输出高电平,灯灭
          delay(10000);        
          GPIO_ResetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);//GPIOC.2和GPIOC.3输出低电平,灯亮
          delay(10000);               
          }        
               
     GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);//GPIOC.2和GPIOC.3输出高电平,灯灭
               
                while(1);

               
}


void XTI0_IRQHandler()
{
        if( EXTI_GetITStatus(EXTI_Line0) != RESET )
  {
        GPIO_ResetBits(GPIOC,GPIO_Pin_2);//GPIOC.2输出低电平,灯亮
        delay(500);        
        GPIO_SetBits(GPIOC,GPIO_Pin_2);
  delay(500);        
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

430

主题

436

帖子

0

粉丝