完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在学习msp430系列单片机,用的是IAR 环境 ,然后刚开始就郁闷了,调用中断给一个全局变量赋值发现不会改变 这是为什么呢?
代码如下: unsigned int flag=0; void GPIO_Inint(void); void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; set_clock(MCLK_8_SMCLK_8_NON_ACLK); GPIO_Inint(); _BIS_SR(LPM0_bits+GIE); __enable_interrupt(); //使能总中断 LPM3; //进入低功耗模式3 while(1) { if(flag == 1) { P1OUT ^= BIT6; P1OUT ^= BIT0; flag = 0; } } } void GPIO_Inint(void) { P1DIR |= BIT0+BIT6; //配置P1.0,P1.6为输出 P1OUT |= BIT0; P1OUT &= ~BIT6; P1REN |= BIT3; //配置P1.3挂上拉或下拉电阻 P1OUT |= BIT3; //配置P1.3上拉 P1DIR &=~BIT3; //配置P1.3为输入 P1IES |= BIT3; //P1.3下降沿中断 P1IE |= BIT3; //开启P1.3的外部中断 } #pragma vector = PORT1_VECTOR //外部中断 __interrupt void PORT1_ISR(void) { unsigned int temp; temp = P1IN & BIT3; __delay_cycles(10000); if((temp & P1IN)==0) { // P1OUT ^= BIT6; // P1OUT ^= BIT0; flag=1; } while((BIT3 & P1IN)==0); P1IFG=0; } 就是那个flag 中断能正常进去,就是没有赋值 为什么? |
|
相关推荐
3个回答
|
|
|
|
|
|
这是因为进入中断前,会将该变量的值被压入了堆栈,在退出中断时,从堆栈中弹出恢复原来的值。
所以你在中断中操作这个变量实际是可以的,只不过中断返回后,又被恢复为原来的数值。 正如2楼老兄说的,加上volatile关键字可以解决这个问题,这是因为volatile会告诉编译器,这个变量不要被优化,每次读写操作都是操作内存。 |
|
2 条评论
|
|
你这个while语句应该是一直执行不了吧,你中断里面没有退出低功耗吧
|
|
|
|
只有小组成员才能发言,加入小组>>
2937个成员聚集在这个小组
加入小组2680 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3003 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2273 浏览 1 评论
4703 浏览 1 评论
2484 浏览 1 评论
952浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3004浏览 2评论
2681浏览 1评论
1082浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-2 00:01 , Processed in 1.255716 second(s), Total 91, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191