野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10337|回复: 3

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

[复制链接]
发表于 2019-9-1 19:17:53 | 显示全部楼层 |阅读模式
#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);
}



回复

使用道具 举报

发表于 2019-9-1 20:17:10 | 显示全部楼层
把引脚配置为下拉试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-1 20:29:38 | 显示全部楼层
野火MINI开发板的PA0口本身外置下拉电阻的,R64(4.7K)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-2 13:46:54 | 显示全部楼层
感谢大家!问题在QQ群里被一位热心的网友点拨了一下搞定了,原来中断名称写漏了一个字。应该是:void EXTI0_IRQHandler()
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 21:50 , Processed in 0.028578 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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