微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32单片机中断程序运行不了

stm32单片机中断程序运行不了

时间:10-02 整理:3721RD 点击:
前两天谢了一个中断程序,检查,编译什么的都没有问题。可是下到单片机后操作没反应。哪位能帮忙看看什么问题。
键盘通过PA0口控制PE7口LED灯闪烁。键盘接有上拉电阻,按下开关时PA0口为高电平。
#include <stm32f10x_lib.h>
u32 LED;
//#define KEY GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
//#define LED0 GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_4)
void RCC_Configuration()    //配置STM32的时钟 & 打开IO口时钟
{
   ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
   RCC_DeInit();//复位RCC外部设备寄存器到默认值
   RCC_HSEConfig(RCC_HSE_ON);//打开外部高速晶振
   HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
   if(HSEStartUpStatus==SUCCESS)//外部高速时钟已经准备好
   {
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //选择FLASH预取指缓存的模,预取指缓存使能
   FLASH_SetLatency(FLASH_Latency_2);      //设置FLASH存储器延时时钟周期数  FLASH_Latency_2  2延时周期
   RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟=SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB2(PCLK2)时钟=AHB时钟
   RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)时钟=AHB 1/2时钟
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//配置PLL时钟=外部高速晶体时钟*9
   RCC_PLLCmd(ENABLE);//使能PLL时钟
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL时钟就绪
   {}
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟=PLL时钟
   while(RCC_GetSYSCLKSource()!=0x08)//检查PLL时钟是否作为系统时钟
   {}
   }
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE,ENABLE); //允许GPIOA、GPIOE时钟 这里根据要输出的IO口设置         
}
void GPIO_Configuration(void)     //配置STM32的GPIO口功能
{
GPIO_InitTypeDef GPIO_InitStructure;   //定义GPIO初始化结构
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;    //指定IOA口的引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //指定IOA口的模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //指定速度
GPIO_Init(GPIOA,&GPIO_InitStructure);    //设置使之有效(真正的初始化IO端口和端口设置)
/* GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;    //指定IOE口的引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //指定IOE口的模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//指定速度    */
GPIO_Init(GPIOE,&GPIO_InitStructure);       //设置使之有效(真正的初始化IO端口和端口设置)
}
void delay_ms(u16 T)
{
    u16 i,j;
for(i=0;i<T;i++)
for(j=0;j<6000;j++);
}
void EXTIX_Init()
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
    u32 KEY0;
KEY0=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
delay_ms(10);
if(KEY0==1)
{
  LED=!LED;
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
int main()
{
RCC_Configuration();
    GPIO_Configuration();                  //对IO口进行初始化
EXTIX_Init();
GPIO_SetBits(GPIOE,GPIO_Pin_7);
LED=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7);
while(1);
}

小编的E端口的2脚配置为输出推挽了,改为输入上拉模式。

是这问题么?

配置问题再查查

你这程序乱的可以看出你完全不懂啊,你要用PA0读入键盘就该配置成输入模式,然后GPIO_EXTILineConfig这里选择GPIO管脚用作外部中断线路,就应该是GPIO_PortSourceGPIOA,GPIO_PinSource0,EXTI_Line 选择外部中断线应该是 EXTI_Line0,优先级组别你也没设置NVIC_PriorityGroupConfig,最后就是中断函数里面                EXTI_ClearFlag( EXTI_Line0),清除中断标志这是必须的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top