如果ProteusSTM32仿真无法进入定时器中断,可能是因为定时器中断的配置问题造成的。请检查定时器中断的中断优先级是否已正确设置,并且中断函数是否已正确添加到中断向量表中,最后再检查中断是否已正确使能,这样就可以保证定时器中断的正常运行了。
我希望你学会一步一步地调试程序,而不是一上来就一股脑的把代码都加进去,结果出问题了,就很主观地认为是哪里哪里出问题。
你的思路是没问题的,但是你看不到实际的结果就以为是中断出了问题。
我建议你这样,
1、先查找一下你所使用的芯片数据手册,看一下外中断接口是哪一个IO。
2、只做外中断功能,检测到下降沿之后让一个连接LED的IO电平翻转,观察中断是否成功。
3、只做定时器功能,定时时间到让连接LED的IO电平翻转,观察定时器是否成功。
4、在定时器中的服务函数里,做AD采样功能,观察AD是否成功采样。
5、把上述的功能联合起来。
/*我不知道你之前的程序,没法判断你错在哪。试试我调试成功的吧,你对照着看看有什么错误。正常情况PB5678循环亮,中断EXTI0_IRQHandler()发生后PB56循环亮,EXTI1_IRQHandler()发生后PB78循环亮,EXTI0的优先级高于EXTI1*/
#include "stm32f10x.h"
extern void Delay(vu32 nCount);
extern void delay(uint);
void RCC_Config(void);
void GPIO_Config(void);
void EXTI_Config(void);
void NVIC_Config(void);
int main(void)
{
//SystemInit();
RCC_Config();
GPIO_Config();
EXTI_Config();
NVIC_Config();
while (1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_8);//GPIOB.8=1
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//GPIOB.8=0
Delay(0xfffff);
}
}
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
/*开时钟*/
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;/*LED为B 5678*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//KEY为A 01
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, GPIO_InitStructure);
}
void EXTI_Config(void)
{
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //将A0接EXTI0
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能
EXTI_Init(EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);//将A1接EXTI1
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
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_Config(void)//中断嵌套优先级设置
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//1组
/* Enable the EXTI0_IRQn Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(NVIC_InitStructure);
/* Enable the EXTI1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(NVIC_InitStructure);
}
extern void Delay(vu32 nCount) //简单的长时间延时函数
{
int i; //声明内部递减变量
for(; nCount!= 0; nCount--) //递减变量计数
{
for (i=0; i0xffff; i++);
}
}
/*以下为中断函数,加到stm32f10x_it.c文件中*/
#include "stm32f10x_it.h"
void EXTI0_IRQHandler(void)
{
int i;
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line0);//清中断标志位
for(i=0;i2;i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=1
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=0
Delay(0xfffff);
}
}
}
void EXTI1_IRQHandler(void)
{
int i;
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line1);//清中断标志位
for(i=0;i2;i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_8);//GPIOC.8=1
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//GPIOB.8=0
Delay(0xfffff);
}
}
}
如果你的硬件上是上拉,下面这条语句就不对。
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
下面是关于STM32的技术博客,希望找到你的答案:
stm32f10x_it.c中点中断服务函数调用其他文件的函数能通过编译但会出现警告,最好把相关的头文件添加进去就可以。使用其他文件的全局变量一定要添加外部变量声明extern,如:在AAA.c中声明unsignedchara=0;在BBB.c中要调用该变量的话要也要声明externunsignedchara;
外部中断的配置不是很难,但是要细心。
我给一个例程给你,这个我测试过,是可以的。
中断配置程序:
void EXT5_Init( )
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable Button GPIO clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
/* Configure Button pin as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init( GPIOB, GPIO_InitStructure);
/* Connect Button EXTI Line to Button GPIO Pin */
GPIO_EXTILineConfig( GPIO_PortSourceGPIOB, GPIO_PinSource5 );
/* Configure Button EXTI line */
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(EXTI_InitStructure);
/* Enable and set Button EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(NVIC_InitStructure);
}
中断程序:
u32 System_Second = 0;
void EXTI9_5_IRQHandler(void)
{
RTC_Update++;
System_Second++;
//light the LED
if( GPIOC-ODR GPIO_Pin_13 )
{
GPIOC-BRR = GPIO_Pin_13;
}
else
{
GPIOC-BSRR = GPIO_Pin_13;
}
EXTI_ClearITPendingBit( EXTI_Line5 );
}
我用的是老的STM32库,你使用的时候注意一下。
本文标签:stm32外部中断进入不