0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MSP430的外部中断来切换不同的LED

科技观察员 来源:circuitdigest 作者:Surya Siddharth 2022-08-10 16:18 次阅读

考虑一个简单的数字手表,它被编程为只显示时间,现在想象你想改变它的时区。你会怎么做?您只需按下一个按钮,即可更改为使您能够更改时区的菜单。在这里,系统无法预测您对其计时过程的外部中断,也无法要求您等待,因为它正忙于增加您手表上的秒值。这就是中断派上用场的地方。

中断不一定是外部的;它也可以是内部的。大多数情况下,嵌入式中断还有助于 CPU 的两个外设之间的通信。考虑一个预设定时器被复位,当时间达到定时器寄存器中的值时触发中断。中断处理程序可用于启动其他外设,如 DMA

在本教程中,我们使用了MSP430 上的外部中断来切换不同的 LED。当使用按钮通过状态改变给出外部中断时,控制权被转移(抢占)到 ISR 并且它完成了必要的工作。

为什么我们需要中断?

需要中断来节省嵌入式系统中的轮询开销。当需要通过抢占当前正在运行的任务来执行优先级较高的任务时调​​用它们。它也可用于将 CPU 从低功耗模式唤醒。当通过 GPIO 端口被外部信号的边沿转换唤醒时,执行 ISR 并且 CPU 再次返回低功耗模式。

MSP430 中的中断类型

MSP430 中的中断分为以下类型-

系统重置

不可屏蔽中断

可屏蔽中断

向量和非向量中断

系统重置:

它可能由于电源电压 (Vcc) 和选择了复位模式的 RST/NMI 引脚中的低信号而发生,也可能由于看门狗定时器溢出和安全密钥违规等原因而发生。

不可屏蔽中断:

这些中断不能被 CPU 指令屏蔽。一旦启用了通用中断,不可屏蔽的中断就不能从处理中转移。这是由振荡器故障和手动提供给 RST/NMI(在 NMI 模式下)的边沿等源产生的。

可屏蔽中断:

当中断发生时,如果它可以被 CPU 指令屏蔽,那么它就是可屏蔽中断。它们不必总是外部的。它们还依赖于外围设备及其功能。这里使用的外部端口中断属于这一类。

向量中断和非向量中断:

Vectored:在这种情况下,中断设备通过传递中断向量地址为我们提供中断源。这里ISR 的地址是固定的,控制权转移到该地址,ISR 负责其余的工作。

Non-Vectored: 这里所有的中断都有共同的 ISR。当来自非向量源的中断发生时,控制权被转移到所有非向量中断共享的公共地址。

MSP430 中的中断程序控制

当中断发生时,MCLK 开启,CPU 从关闭状态回调。由于在中断发生后程序的控制权被转移到 ISR 地址,程序计数器和状态寄存器中的值被移入堆栈。

pYYBAGLzaQ6ALFtbAASMPgs7D2w624.png

连续清除状态寄存器,从而清除 GIE 并终止低功耗模式。通过将中断向量地址放入程序计数器来选择并执行具有最高优先级的中断。在我们了解MSP430 GPIO 中断示例代码之前,了解其中涉及的端口寄存器的工作非常重要。

MSP430 上用于 GPIO 控制的端口寄存器:

PxDIR:端口方向控制寄存器。它允许程序员通过写入 0 或 1 来专门选择其功能。如果一个引脚被选择为 1,则它充当输出。将端口 1 视为 8 位端口,如果将引脚 2 和 3 分配为输出端口,则必须将 P1DIR 寄存器的值设置为 0x0C。

PxIN:它是一个只读寄存器,可以使用该寄存器读取端口中的当前值。

PxOUT:此特定寄存器可用于将值直接写入端口。这只有在上拉/下拉寄存器被禁用时才有可能。

PxREN:它是一个 8 位寄存器,用于启用或禁用上拉/下拉寄存器。当一个引脚在 PxREN 和 PxOUT 寄存器中都设置为 1 时,特定引脚被上拉。

poYBAGLzaQqAa4OwAAATDm3VfkA343.png

PxSEL 和 PxSEL2:由于 MSP430 中的所有引脚都是多路复用的,因此在使用它之前必须选择特定的功能。当特定引脚的 PxSEL 和 PxSEL2 寄存器都设置为 0 时,则选择通用 I/O。当 PxSEL 设置为 1 时,选择主要外围功能,依此类推。

PxIE:它启用或禁用端口 x 中特定引脚的中断。

PxIES:它选择产生中断的边沿。为 0,选择上升沿,为 1,选择下降沿。

用于测试 GPIO 中断的 MSP430 电路

用于测试我们的MSP430 中断示例代码的 MSP430 电路如下所示。

poYBAGLzaQSAMRSGAAOp3QZFBAc368.png

电路板的接地用于将 LED 和按钮接地。按钮的对角两侧为常开端子,按下按钮时连接。在 LED 之前连接一个电阻器,以避免 LED 的高电流消耗。通常,使用 100 欧姆 - 220 欧姆范围内的低电阻

我们使用 3 种不同的代码来更好地理解端口中断。前两个代码使用与电路图 1 中相同的电路。让我们深入研究代码。建立连接后,我的设置如下所示。

poYBAGLzaQCAEptwAAbVqy-MhSI614.png

对 MSP430 进行中断编程

完整的MSP430 中断程序可以在本页底部找到,代码解释如下。

下面的行使看门狗定时器停止运行。看门狗定时器通常执行两个操作。一种是通过重置控制器来防止控制器无限循环,另一种是使用内置计时器触发周期性事件。当微控制器复位(或上电)时,它处于定时器模式,并倾向于在 32 毫秒后复位 MCU。此行阻止控制器执行此操作。

WDTCTL = WDTPW + WDTHOLD;

将P1DIR寄存器设置为值 0x07 将 pin0、pin1 和 pin2 的方向设置为输出。将P1OUT设置为 0x30 可将其配置为在 pin4 和 pin5 上启用内部上拉电阻的输入。将P1REN设置为 0x30 会启用这些引脚上的内部上拉电阻。P1IE使能中断,其中 P1IES 选择从高到低的转换作为这些引脚上的中断沿。

P1DIR |= 0x07;

P1OUT = 0x30;

P1REN |= 0x30;

P1IE |= 0x30;

P1IES |= 0x30;

P1IFG &= ~0x30;

下一行启用低功耗模式并启用状态寄存器中的GIE,以便可以接收中断。

__bis_SR_register(LPM4bits+GIE)

程序计数器使用宏设置为端口 1 向量的地址。

PORT1_VECTOR。

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

下面的代码一个接一个地切换连接到 pin0、pin1、pin2 的每个 LED。

if(count%3==0)

{

P1OUT ^= BIT1;

P1IFG &= ~0x30;

计数++;

}

else if(count%3==1) { P1OUT ^= BIT1; P1IFG &= ~0x30; 计数++; } 其他 { P1OUT ^= BIT2; P1IFG &= ~0x30; 计数++; }

电路图2:

同样,让我们​​尝试一个不同的引脚来更好地理解这个概念。所以这里的按钮连接到针脚 2.0 而不是针脚 1.5。修改后的电路如下。该电路再次用于测试MSP430 按钮中断程序。

poYBAGLzaPuAF7cyAAN4yttulzw625.png

这里的端口 2 用于输入。所以必须使用不同的中断向量。P1.4和P2.0接受输入。

由于端口 2 仅用于输入,P2DIR 设置为 0。要将端口 2 的 pin0 设置为输入并启用内部上拉电阻,寄存器 P2OUT 和 P2REN 必须设置为 1。要启用端口 2 的 pin0 上的中断以及选择中断的边沿,P2IE 和 P2IES 的值设置为 1。要重置端口 2 中的标志,P2IFG 被清除,这样标志可以再次设置在中断的发生。

P2DIR |= 0x00;

P2OUT = 0x01;

P2REN |= 0x01;

P2IE |= 0x01;

P2IES |= 0x01;

P2IFG &= ~0x01;

当中断源来自端口 1 时,连接到端口 1 引脚 1 的 LED 会发光。当中断源属于端口 2 时,连接到端口 1 的 pin2 的 LED 会发光。

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{

P1OUT ^= BIT1;

P1IFG &= ~0x10;

for(i=0;i《20000;i++)

{

}

P1OUT ^= BIT1;

}

#pragma vector=PORT2_VECTOR

__interrupt void Port_2(void)

{

P1OUT ^= BIT2;

P2IFG &= ~0x01;

for(j=0;j《20000;j++)

{

}

P1OUT ^= BIT2;

}

从 CCS 上传程序到 MSP430

要将项目加载到启动板并对其进行调试,请选择项目,然后单击工具栏中的调试图标。或者,按 F11 或单击 RunàDebug 进入调试模式。

pYYBAGLzaPWATIdNAAG0G59nTes406.png

进入调试模式后,按下绿色运行按钮即可在 MCU 中自由运行加载的代码。现在,当按下按钮时,边沿的变化触发中断,从而提示 LED 状态的变化。

poYBAGLzaPKAdx9FAAHcZuSKcgs055.png

MSP430 上的中断程序

代码上传成功后,我们可以通过简单的按钮进行测试。每当使用按钮发出中断时,LED 模式将根据我们的程序发生变化。

pYYBAGLzaO6AaEYXAAcbJnFqxbI884.png

#项目1:
#include
整数计数 = 0;
诠释主要(无效)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x07;
P1OUT = 0x30;
P1REN |= 0x30;
P1IE |= 0x30;
P1IES |= 0x30;
P1IFG &= ~0x30;
__bis_SR_register(LPM4_bits + GIE); // 进入带中断的 LPM4

}
// 端口 1 中断服务程序
#pragma 向量=PORT1_VECTOR
__interrupt 无效端口_1(无效)
{
如果(计数%3==0)
{
P1OUT ^= BIT1;
P1IFG &= ~0x30;
计数++;
}
否则 if(count%3==1)
{
P1OUT ^= BIT1;
P1IFG &= ~0x30;
计数++;
}
别的
{
P1OUT ^= BIT2;
P1IFG &= ~0x30;
计数++;
}
}

#项目2:
#include
整数 i, j;
诠释主要(无效)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x06;
P1OUT = 0x10;
P1REN |= 0x10;
P1IE |= 0x10;
P1IES |= 0x10;
P1IFG &= ~0x10;
P2DIR |= 0x00;
P2OUT = 0x01;
P2REN |= 0x01;
P2IE |= 0x01;
P2IES |= 0x01;
P2IFG &= ~0x01;
__bis_SR_register(LPM4_bits + GIE); // 进入带中断的 LPM4
}
// 端口 1 中断服务程序
#pragma 向量=PORT1_VECTOR
__interrupt 无效端口_1(无效)
{
P1OUT ^= BIT1;
P1IFG &= ~0x10;
for(i=0;i<20000;i++)
{
}
P1OUT ^= BIT1;
}
#pragma 向量=PORT2_VECTOR
__interrupt 无效端口_2(无效)
{
P1OUT ^= BIT2;
P2IFG &= ~0x01;
对于(j=0;j<20000;j++)
{
}
P1OUT ^= BIT2;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23134

    浏览量

    658375
  • msp430
    +关注

    关注

    180

    文章

    2393

    浏览量

    229185
  • 外部中断
    +关注

    关注

    1

    文章

    131

    浏览量

    15801
收藏 人收藏

    评论

    相关推荐

    msp430单片机是不是都有io外部中断有效MSP430G2001单片机具有外部中断

    各位前辈好,我是用的MSP430G2001单片机,英文资料看不明白,想知道IO具有外部中断不?是不是所有的MSP430单片机都具有外部中段?
    发表于 02-14 16:11

    msp430中断

    msp430 调试IO中断时,P1.0到P1.3设置输出控制led屏,然后设置P1.4到P1.7为外部中断。但开
    发表于 07-18 00:05

    MSP430外部中断响应时间是多少?

    MSP430外部中断响应时间是多少
    发表于 10-30 08:02

    MSP430单片机中断系统

    中断MSP430单片机的一大特点,有效地利用中断可以简化程序并提高执行效率。在MSP430单片机中,几乎每个片上外设都能够产生中断,为
    发表于 07-15 15:27 0次下载

    MSP430单片机的定时器

    实现MSP430单片机的定时器中断,并在中断中使LED闪烁
    发表于 03-15 16:10 5次下载

    MSP430中断

    MSP430中断分为3种: 1.系统复位、 2.非屏蔽中断、 3.可屏蔽中断。 系统复位指向中断向量表的最高地址0xFFFE。 非屏蔽
    发表于 03-26 09:51 1次下载

    MSP430单片机实践篇之MSP430单片机ADC模数转换操作

    MSP430单片机中断编程;ADC(模数转换)的实现;MSP430单片机低功耗控制(休眠)。
    发表于 04-28 10:46 43次下载
    <b class='flag-5'>MSP430</b>单片机实践篇之<b class='flag-5'>MSP430</b>单片机ADC模数转换操作

    MSP430单片机ADC模数转换操作

    学习要点:MSP430单片机中断编程;ADC(模数转换)的实现;MSP430单片机低功耗控制(休眠)。
    发表于 05-08 08:43 45次下载
    <b class='flag-5'>MSP430</b>单片机ADC模数转换操作

    MSP430有哪些可屏蔽中断_MSP430中断的优先级

    MSP430有哪些可屏蔽中断,中断很大程度上体现了一款单片机的性能,从这一点将MSP430中断方面做得很不错,主要是提供了非常丰富的
    发表于 05-29 15:41 2906次阅读

    MSP430中断分为哪3种?MSP430中断优先级顺序是什么样的?

    MSP430中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断
    的头像 发表于 07-16 17:10 1.9w次阅读
    <b class='flag-5'>MSP430</b>的<b class='flag-5'>中断</b>分为哪3种?<b class='flag-5'>MSP430</b>的<b class='flag-5'>中断</b>优先级顺序是什么样的?

    MSP430单片机】中断

    MSP430单片机】中断
    发表于 11-19 15:51 12次下载
    【<b class='flag-5'>MSP430</b>单片机】<b class='flag-5'>中断</b>篇

    MSP430学习笔记-低功耗与中断系统

    年前忙于项目都有段时间没更新博客了,趁年后有点时间更新了一篇,在这篇学习笔记里我们探讨一下MSP430系列单片机的低功耗模式与中断系统,从下一篇开始,将会开始更新MSP430外设部分
    发表于 11-19 18:36 9次下载
    <b class='flag-5'>MSP430</b>学习笔记-低功耗与<b class='flag-5'>中断</b>系统

    msp430中断优先级和中断嵌套(及容易理解错误的说明)

    msp430中断优先级和中断嵌套 MSP430中断优先级按所在的向量的大小排列,中断
    发表于 11-19 19:06 11次下载
    <b class='flag-5'>msp430</b>的<b class='flag-5'>中断</b>优先级和<b class='flag-5'>中断</b>嵌套(及容易理解错误的说明)

    MSP430中断MSP430的IO口中断/中断特性

    MSP430学习笔记之七:IO口中断 MSP430中断嵌套机制 (1) 430默认的是关闭
    发表于 12-16 16:56 9次下载
    【<b class='flag-5'>MSP430</b><b class='flag-5'>中断</b>】<b class='flag-5'>MSP430</b>的IO口<b class='flag-5'>中断</b>/<b class='flag-5'>中断</b>特性

    MSP430单片机中断系统课件ppt

    中断MSP430单片机的一大特点,有效地利用中断可以简化程序并提高执行效率。在MSP430单片机中,几乎每个片上外设都能够产生中断,为
    发表于 08-01 15:13 8次下载