原创 为什么在中断函数中改变的变量不能传递到主函数

2011-3-18 17:04 3700 2 3 分类: MCU/ 嵌入式
外部中断函数 #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(); } }
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2014-10-3 23:18

现在我还碰到相同的问题,请问你是什么原因?
相关推荐阅读
我要评论
1
2
关闭 站长推荐上一条 /2 下一条