最近在自学STM32,写了一个按键中断程序,但是中断总是不响应...望大虾赐教,谢谢....程序如下
#include<stm32f10x.h>#include"stm32f10x_exti.h"#include"stm32f10x_gpio.h"#include"stm...
#include <stm32f10x.h>
#include "stm32f10x_exti.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "Delay_nms.h"
void RCC_Configuration(void)
{
SystemInit();
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
/*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7);
GPIO_ResetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_13);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
int main(void)
{
RCC_Configuration();
SysTick_Configuration();
EXTI_Configuration();
NVIC_Configuration();
GPIO_Configuration();
while(1);
}
void EXTI3_IRQHandler(void)
{
if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)
{
Delay(5);
if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOD,GPIO_Pin_6);
}
else
{
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
GPIO_ResetBits(GPIOD,GPIO_Pin_6);
}
}
//EXTI_ClearITPendingBit(EXTI_Line3);
EXTI_ClearFlag(EXTI_Line3);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file,uint32_t line)
{
while(1)
{
}
}
#endif
有人说是因为没开中断的原因,但是我查了很多资料 也不知道中断是在哪开的?还望各位大虾赐教 谢谢 展开
#include "stm32f10x_exti.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "Delay_nms.h"
void RCC_Configuration(void)
{
SystemInit();
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
/*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7);
GPIO_ResetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_13);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
int main(void)
{
RCC_Configuration();
SysTick_Configuration();
EXTI_Configuration();
NVIC_Configuration();
GPIO_Configuration();
while(1);
}
void EXTI3_IRQHandler(void)
{
if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)
{
Delay(5);
if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOD,GPIO_Pin_6);
}
else
{
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
GPIO_ResetBits(GPIOD,GPIO_Pin_6);
}
}
//EXTI_ClearITPendingBit(EXTI_Line3);
EXTI_ClearFlag(EXTI_Line3);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file,uint32_t line)
{
while(1)
{
}
}
#endif
有人说是因为没开中断的原因,但是我查了很多资料 也不知道中断是在哪开的?还望各位大虾赐教 谢谢 展开
2个回答
展开全部
试了一下这个程序。。可以进中断的。。
如果你进不了中断可能是硬件连接的问题吧。。把PE3的GPIO_Mode改成IPU或者IPD再试试
如果你进不了中断可能是硬件连接的问题吧。。把PE3的GPIO_Mode改成IPU或者IPD再试试
更多追问追答
追问
恩 好的 谢谢 我再试试
刚试了下 还是不行....不过 如果把中断服务函数 EXTI3_IRQHandler(); 当成一般的子函数,然后再主函数main前添加函数声明 void EXTI3_IRQHandler(void); 最后 把中断服务函数写入主函数中的 while(1) {EXTI3_IRQHandler(); }
这样确实能达到效果 但是 却失去了中断的意义了....
在你那能实现中断吧 那或许真的是我这硬件连接的问题?
追答
EXTI3_IRQHandler();不需要单独进行声明的,在芯片相应的startup.s文件里已经包括了中断向量表,在中端产生的时候可以直接进入中断处理程序,另外EXTI3_IRQHandler()一般是放在stm32f10x_it.h里声明,stm32f10x_it.c里面写具体内容的,另外可以在void EXTI3_IRQHandler(void)后面加个中断点debug一下,上面的程序我注释掉了delay的几个调用之后仿真运行可以进中断的…………
展开全部
大哥,我不知道我说的对不对,按键中断就是循环时候你扫描到按键的电平是高电平换低电平的时候,触发时间,还有就是,像时间,还有串口那样,配置寄存器时候进入中断,这个就要查单片机手册了。希望对你有帮助。。对了,还有一点,做这个,一定要下载那个单片机的手册。有的里边有例子程序的。。。
大哥刚没看你程序,我又看了一眼,你程序写的挺有意思,建议你下载几个短的例子看看,应该有,比如基于STM32的温湿度传感器程序怎么写的,有可能能在里边找到你想要的代码,这个单片机我没用过,呵呵,我只写过PIC,STC,51,ARM的。希望对你有帮助,没帮助别骂我就可以了
大哥刚没看你程序,我又看了一眼,你程序写的挺有意思,建议你下载几个短的例子看看,应该有,比如基于STM32的温湿度传感器程序怎么写的,有可能能在里边找到你想要的代码,这个单片机我没用过,呵呵,我只写过PIC,STC,51,ARM的。希望对你有帮助,没帮助别骂我就可以了
更多追问追答
追问
谢谢回复 呵呵 我是新手 自学的 我这个程序 就是参考例程写的 你说我的程序写的有意思?请问是哪写的不好嘛?如果是 我下回注意 呵呵 还望赐教....
追答
while(1);
这个有意思,你懂的呵呵。你的是不是所有任务都是中断触发哈?我也就顺着看一眼,好像是这个意思
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |