外部中断部分

msp430的IO有几组寄存器,输入寄存器(只读),输出寄存器,方向控制,复用控制,实际上跟stm32比较,结构还是简单多了。结构图先不记。。
外部中断多达16位,P1和P2口的引脚全部可以用来做外部中断使用。只能响应边沿事件,不能产生电平中断,当然本来电平中断就很鸡肋,一般用不上,边沿中断也足够灵活以应对不同应用场景。需要留意的寄存器也不多,跟51基本一致:中断允许,类型选择(上升沿还是下降沿),中断标志寄存器。最后还有总的中断允许控制位要注意打开。

看了官方的三个程序。

①第一个程序没有中断,在循环中检测按键键值,来对应LED灯的亮灭。
然而失败了,实际上刚试的时候还好的,再试就不灵了。。。用其他程序检查一下,发现灯和按键好像都没问题。。。那就加个防抖试试,防抖需要延时函数,百度了一下头文件里是有这个的:
__delay_cycles(100);
延时100个时钟周期,还是不行,1000个10000个也不行orz。。。算了

②第二个是利用按键中断让LED灯闪烁,只需要在主函数配置好中断和IO,在中断函数里清标志位和翻转灯就可以了。
P1REN |= BIT4; // Enable P1.4 internal resistance
P1OUT |= BIT4; // Set P1.4 as pull-Up resistance
配置里出现这两行代码,有点看不懂,没见过这PxREN,查了一下是控制电阻上下拉的配置。
但这里又没有配置1.4的方向,实际上这是一个输入端口,却配置了输出寄存器,可能是配合使用,对应中断时的外部输入,先记住用法。
最最头大的来了,中断服务函数的写法有点难受:
// Port 1 interrupt service routine
#if defined(TI_COMPILER_VERSION) || defined(IAR_SYSTEMS_ICC)
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
#elif defined(GNUC)
void attribute ((interrupt(PORT1_VECTOR))) Port_1 (void)
#else
#error Compiler not supported!
#endif

试着读一读:如果括号里的两个东西有定义,那么把port1的中断向量赋给vector,否则如果那么。。。。算了反正以后就照抄就可以了

效果还不错,按一次按键,灯就翻转,但偶尔按一次会翻转两次,设置一下防抖:
if(!(P1IN & BIT1))
因为是下降沿跳变触发的中断,那么就进了中断再检测一下是否为低。
发现还是有点抖,可能需要延时时间再长一点把。
照着网上的延时函数,延时了1毫秒:
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
还要照着cpu频率改一下数值,我当然不会改了,直接用了,虽然不知道延时了多久,但有延时就可以了,
delay_ms(1);
然后就完美控制了
值得注意的是,这里开启了低功耗模式。

③这个有一点复杂,因为并不熟悉低功耗模式什么什么的。
主函数进行IO和中断配置,然后循环。
循环里是进入低功耗模式、翻转LED灯,改变触发方式,并势能中断
中断函数里是清中断标志位,清中断允许,退出低功耗模式

百度一下是这样的:
低功耗执行的一个过程:程序从main函数入口开始执行程序,当遇到进入低功耗程序时,如:_BIS_SR(LPM1_bits + GIE);此时相当于下面的程序处于停止状态不再执行,当有一个中断来到,则会进入中断处理程序,自动退出低功耗,如果在中断中没有没有退出低功耗,当中断服务程序执行完成后,又会重新进入低功耗。

于是整个过程:
中断和IO配置,进入循环,第一句就是进入低功耗模式,后面的程序不会执行,直到有了中断,中断中清空中断请求,又关闭了中断允许,然后退出低功耗模式,此时循环中的程序将继续执行,翻转灯,改变触发方式,开启中断允许,再进入低功耗模式。
效果就是无外部信号时,系统在低功耗模式,按了按键,灯就会灭,按键按完,灯又亮。
结果居然很完美,抖都不抖orz,可能是因为又开闭中断允许的这一步?

总之中断就可以了,开启中断允许,设置上下拉,关闭复用。
还有中断函数的格式。

接下来看看定时器,然后整理一下资料。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值