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);
}
键盘通过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),清除中断标志这是必须的