原创
为什么在中断函数中改变的变量不能传递到主函数
外部中断函数
#include "stm32f10x_it.h"
extern uint8_t flag1;
extern uint8_t flag2;
extern uint8_t flag3;
extern uint8_t flag4;
extern void display(void) ;
void EXTI15_10_IRQHandler(void) //注意中断函数的名称
{
if(EXTI_GetITStatus(EXTI_Line10)!=RESET) {EXTI_ClearITPendingBit(EXTI_Line10);flag1=~flag1;}
if(EXTI_GetITStatus(EXTI_Line11)!=RESET) {EXTI_ClearITPendingBit(EXTI_Line11);flag2=~flag2;}
if(EXTI_GetITStatus(EXTI_Line14)!=RESET) {EXTI_ClearITPendingBit(EXTI_Line14);flag3=~flag3;}
if(EXTI_GetITStatus(EXTI_Line15)!=RESET) {EXTI_ClearITPendingBit(EXTI_Line15);flag4=~flag4;}
display();
}
、、、、、、、、、、、、、、、、、、、、、、
为什么我不能站在外部中断函数中改变全局变量
主函数。。。。。。。
#include "stm32f10x.h"
volatile uint8_t flag1=0;
volatile uint8_t flag2=0;
volatile uint8_t flag3=0;
volatile uint8_t flag4=0;
void delay(void)
{ uint8_t x,y;
for(x=0;x<100;x++)
for(y=0;y<300;y++) ;
}
////////////////////////////
void Gpio_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure ;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure); //初始化GPIOE0,1,2,3为推挽输出
/////////////////////////////////////中断口设置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE15,14为浮空
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB10,11为浮空
}
///////////////////////////////////////
void Exti_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource14);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource15);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
//分别配置各个中断线路 选择GPIO管脚用作外部中断线路
EXTI_InitStructure.EXTI_Line = EXTI_Line14 | EXTI_Line15|
EXTI_Line10 |EXTI_Line11;
//选择10,11,14,15用作外部中断源输入
EXTI_ClearITPendingBit(EXTI_Line10|EXTI_Line11|EXTI_Line14|EXTI_Line15);
//复位各中断挂起位
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_SetPriorityGrouping(NVIC_PriorityGroup_0);
//所有4位用于指定响应优先级确定以下每个中断的取值范围
NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn; //指定通道10-15中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// 抢占式优先级为0相当于C51的IP寄存器
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//响应中断优先级为0相当于interrupt x
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//响应中断优先级为0相当于IE中设置ET/X
NVIC_Init(&NVIC_InitStructure);
//初始化嵌套中断的结构体
}
///////////////////////////////////////////
void display()
{
if(!flag1)
GPIO_SetBits(GPIOE,GPIO_Pin_0);
else GPIO_ResetBits(GPIOE,GPIO_Pin_0);
if(!flag2)
GPIO_SetBits(GPIOE,GPIO_Pin_1);
else GPIO_ResetBits(GPIOE,GPIO_Pin_1);
if(!flag3)
GPIO_SetBits(GPIOE,GPIO_Pin_3);
else GPIO_ResetBits(GPIOE,GPIO_Pin_3);
if(!flag4)
GPIO_SetBits(GPIOE,GPIO_Pin_2);
else GPIO_ResetBits(GPIOE,GPIO_Pin_2);
}
int main(void)
{
SystemInit();//STM32系统初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);
Gpio_Init();
Exti_Init();
NVIC_Config();//外部中断一定要配置嵌套中断向量
while (1)
{
//display();
//delay();
}
}
用户377235 2014-10-3 23:18