msp430F5438A 的中断初步

2020-06-30来源: eefocus关键字:msp430F5438A  中断初步

对于单片机系统,中断是非常重要的一个特性,也是很值得去研究的。


中断的定义:出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。


MSP430F5438A的很多部分都可以产生中断,比如IO口(只有P1,P2口),ADC,Timer_A 等,但是当多种中断在同时等待时,它们之间内部的优先级决定了哪个中断应该先被处理,哪个中断应该后处理。中断处理优先级和中断向量BASEADDRESS如下所示:

 

暂时只检测只有一个中断的情况,即不用考虑中断优先级的情况。以ADC12_A为中断源.

ADC12_A的中断标志位寄存器可以记为ADC12IFGx,ADC12IFG0是ADC12IFGx的最低位,当ADC12MEM0装载了转换结果后,这个位置1,而当ADC12MEM0存取后,这个位被重置,它也可以由软件重置。


在IAR_workbench 里面写入以下代码:

#include "msp430x54x.h"

volatile unsigned int result; // Needs to be global in this example,Otherwise, the compiler removes it

// because it is not used for anything.
void InitADC12_A()
{
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;// Turn on ADC12, set sampling time

ADC12CTL1 = ADC12SHP+ADC12CONSEQ_0; // Use sampling timer, single

ADC12MCTL0 = ADC12SREF_2 + ADC12INCH_3; // ref+=Veref=2.5V, channel = A3

ADC12IE = ADC12IE0; // Enable ADC12IFG.0

ADC12CTL0 |= ADC12ENC; // Enable conversions
}

#pragma vector=ADC12_VECTOR

__interrupt void ADC12ISR (void)

{
switch(__even_in_range(ADC12IV,34))

{

case 0: break; // Vector 0: No interrupt

case 2: break; // Vector 2: ADC overflow

case 4: break; // Vector 4: ADC timing overflow

case 6: // Vector 6: ADC12IFG0

result = ADC12MEM0; // Move results

__bic_SR_register_on_exit(LPM4_bits); // Exit active CPU, SET BREAKPOINT HERE

case 8: break; // Vector 8: ADC12IFG1

case 10: break; // Vector 10: ADC12IFG2

case 12: break; // Vector 12: ADC12IFG3

case 14: break; // Vector 14: ADC12IFG4

case 16: break; // Vector 16: ADC12IFG5

case 18: break; // Vector 18: ADC12IFG6

case 20: break; // Vector 20: ADC12IFG7

case 22: break; // Vector 22: ADC12IFG8

case 24: break; // Vector 24: ADC12IFG9

case 26: break; // Vector 26: ADC12IFG10

case 28: break; // Vector 28: ADC12IFG11

case 30: break; // Vector 30: ADC12IFG12

case 32: break; // Vector 32: ADC12IFG13

case 34: break; // Vector 34: ADC12IFG14

default: break;

}

}

void main(void)

{
InitADC12_A();

WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer

ADC12CTL0 |= ADC12SC; // Start convn - software trigger

__bis_SR_register(LPM4_bits + GIE); // Enter LPM4, Enable interrupts

__no_operation(); // For debugger

}


在A3口接入电压为1.407V,然后debug,在debug页面发现:

 

所以成功转换,而且通过中断将结果写入了result里面。

中断的作用说到底只是用来实现突发事件的检测和运行,例如我们也可以实现,运用ADC12的中断实现P11.0上的红色LED灯实现点亮的操作。


#include "msp430x54x.h"

volatile unsigned int result; // Needs to be global in this example,Otherwise, the compiler removes it

// because it is not used for anything.
void InitADC12_A()
{
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;// Turn on ADC12, set sampling time

ADC12CTL1 = ADC12SHP+ADC12CONSEQ_0; // Use sampling timer, single

ADC12MCTL0 = ADC12SREF_2 + ADC12INCH_3; // ref+=Veref=2.5V, channel = A3

ADC12IE = ADC12IE0; // Enable ADC12IFG.0

ADC12CTL0 |= ADC12ENC; // Enable conversions
}

#pragma vector=ADC12_VECTOR

__interrupt void ADC12ISR (void)

{
switch(__even_in_range(ADC12IV,34))

{

case 0: break; // Vector 0: No interrupt

case 2: break; // Vector 2: ADC overflow

case 4: break; // Vector 4: ADC timing overflow

case 6: // Vector 6: ADC12IFG0

result = ADC12MEM0; // Move results

P11OUT &= ~BIT0; //light red LED

__bic_SR_register_on_exit(LPM4_bits);

case 8: break; // Vector 8: ADC12IFG1

case 10: break; // Vector 10: ADC12IFG2

case 12: break; // Vector 12: ADC12IFG3

case 14: break; // Vector 14: ADC12IFG4

case 16: break; // Vector 16: ADC12IFG5

case 18: break; // Vector 18: ADC12IFG6

case 20: break; // Vector 20: ADC12IFG7

case 22: break; // Vector 22: ADC12IFG8

case 24: break; // Vector 24: ADC12IFG9

case 26: break; // Vector 26: ADC12IFG10

case 28: break; // Vector 28: ADC12IFG11

case 30: break; // Vector 30: ADC12IFG12

case 32: break; // Vector 32: ADC12IFG13

case 34: break; // Vector 34: ADC12IFG14

default: break;

}

}

void main(void)

{
InitADC12_A();

WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer

ADC12CTL0 |= ADC12SC; // Start convn - software trigger

P11DIR |= BIT0; //设置P11.0为输出

P11OUT |= BIT0;

__bis_SR_register(LPM4_bits + GIE); // Enter LPM4, Enable interrupts

__no_operation(); // For debugger

}


结果成功实现了A4通道的转换,将结果写到了result里面,并且点亮了红色LED灯。

关键字:msp430F5438A  中断初步 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic501635.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430F5438学习笔记 TA1溢出中断加比较匹配中断
下一篇:MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430 SD卡SPI读写操作(3) —— SD卡读写实现(以MSP430F5438A为例)
本节提供了MSP430F5438A SPI读写SD卡的示例代码,使用官方函数库msp430_driverlib_2_60_00_02,使用IAR for msp430 6.3通过编译。本节代码未对SD卡进行区分,因此只针对SDHC卡进行操作,程序在金士顿 8GB SDHC microSD卡经过验证可以正常运行。sdhc.h#ifndef _SDHC_H_#define _SDHC_H_ #define SDHC_INIT_CLK 125000#define SDHC_HIGH_CLK 3125000#define SDHC_CS_PORT GPIO_PORT_P9#define SDHC_CS_PIN 
发表于 2020-05-13
MSP430F5438A单片机基于SPI的FatFs移植笔记(一)
_PARERR /* 4: Invalid Parameter */} DRESULT;实际在写程序的时候返回值分得细有助于快速定位问题的所在,但是我移植的时候图省事只用了成功、读写错误、参数错误三个,原因是写保护我没有编写专门的函数去判断,而未准备好出现的概率很低。各个函数的输入参数具体到每个函数再进行一一说明那么下面首先以初始化程序DSTATUS disk_initialize (BYTE pdrv);具体说一下:通过TI的单片机MSP430F5438A进行函数的实现步骤这里需要参考的良心文档以及网站有:1.FatFs官方网站:http://www.elm-chan.org/fsw/ff/00index_e.html说明很浅
发表于 2020-05-13
<font color='red'>MSP430F5438A</font>单片机基于SPI的FatFs移植笔记(一)
MSP430F5438A的时钟系统
现在在做的温控部分算法,需要每隔0.25s采集一次温度数据,然后计算出相应的控制量,并以PWM的形式输出。为了实现这个功能,时钟系统是不可或缺的,现就MSP430F5438A的时钟系统进行研究。MSP430F5438A 里面有三个计时器,如下图所示这三个计时器为TA0,TA1,TB0。TA0有5个capture/compare 寄存器, TA1有3个, TB0 有7个。TA0 is a 16-bit timer/counter (Timer_A type) with five capture/compare registers. It can support multiple capture/compares, PWM
发表于 2020-04-27
<font color='red'>MSP430F5438A</font>的时钟系统
MSP430F5438A无线升级
将我自己在升级过程中的问题记下来。430无线升级,是通过JTAG烧写一个自定义BSL程序,然后通过BSL程序接收应用程序(APP程序)。接收方式多种--UART,IIC,SPI。430手册关于固件升级,也介绍了BSL协议等内容。由于项目需要,采用无线升级,无线模块是SPI接口,也可理解为SPI接收方式。BSL程序和APP程序需作地址空间区分,修改对应的XCL文件。---- APP的XCL文件关于XCL文件,由于我的程序很短,空间设置的很小。升级时,只要程序rebulid时没报错就没问题,如果升级出问题时,可不考虑这方面的原因。也不用考虑高地址空间的问题。---BSL的XCL文件地址空间分配好后,然后编写对应的程序。程序中最关键
发表于 2020-04-23
<font color='red'>MSP430F5438A</font>无线升级
基于MSP430F5438A的ESP8266模块STA模式程序调试成功
ESP8266模块STA模式程序,主控芯片为MSP430F5438A,开发环境为IARMSP430F5438A通过串口,以115200的波特率与ESP8266通信,对ESP8266进行配置,主要完成室内WiFi的连接配置,和连接远端服务器的配置,远端服务器采用USR-TCP232-Test软件进行模拟,USR-TCP232-Test软件打开时自动显示你的电脑IP和所用的端口号,将其直接写入程序中的需要连接的IP和端口号即可。配置完成后可以实现以STA方式与远端服务器进行双向数据传输。在串口发送数据时,以字符型(“AT”)发送出去,指令发送之后,马上发送rn,表示回车换行,完成一条指令的发送操作。硬件上,在ESP8266模块上电时或
发表于 2020-04-23
基于<font color='red'>MSP430F5438A</font>的ESP8266模块STA模式程序调试成功
STM32学习笔记——外部中断初步了解
STM32F103有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级16级可编程的中断优先级。 理解STM32的中断,要从中断优先级哦分组开始。而理解中断优先级分组,就要理解什么是抢占优先级,什么是响应优先级。 所谓: 抢占优先级:如果有两中断先后出发,已经在执行的中断优先级如果没有后出发的中断优先级高,就会先处理抢占优先级高的中断,也就是说有较高的抢占优先级的中断可以打断抢占优先级较低的中断,这是实现中断嵌套的基础。 响应优先级:只在同一抢占优先级的中断同时触发时起作用。抢占优先级相同,则优先执行响应优先级较高的中断。响应优先级不会造成中断的嵌套,如果中断的两个优先级都一致,那么优先执行位于中断向量表中位置
发表于 2016-09-19
STM32学习笔记——外部<font color='red'>中断</font>的<font color='red'>初步</font>了解
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved