历史上的今天
返回首页

历史上的今天

今天是:2025年06月30日(星期一)

正在发生

2020年06月30日 | msp430F5438A 的中断初步

2020-06-30 来源:eefocus

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


中断的定义:出现需要时,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灯。

推荐阅读

史海拾趣

Aptina (ON Semiconductor)公司的发展小趣事

随着市场竞争的加剧和行业发展的需要,Aptina最终被半导体巨头ON Semiconductor收购。这一收购使得Aptina得以借助ON Semiconductor的资源和平台,实现更快速的发展。ON Semiconductor对Aptina的收购也进一步提升了其在图像传感器领域的市场地位,为公司未来的发展注入了新的动力。

Dynex公司的发展小趣事

在快速发展的同时,Aptina注重技术研发与专利布局。公司投入大量资源用于研发,不断推出具有创新性的图像传感器产品。这些产品不仅提升了公司的市场竞争力,还为Aptina积累了大量的技术专利。这些专利成为了公司宝贵的资产,为公司的长期发展奠定了坚实基础。

Dalian Dlicap Corporation公司的发展小趣事

2023年12月29日,大连达利凯普科技股份公司在深圳证券交易所创业板正式挂牌上市,股票代码为301566。这一里程碑式的事件标志着公司进入了一个新的发展阶段。上市融资将为达利凯普提供更多的资金支持和发展机遇,公司将继续加大研发投入和市场拓展力度,不断推动技术创新和产业升级。同时,达利凯普也将积极履行社会责任和义务,为电子行业的发展做出更大的贡献。

请注意,这些故事概要基于现有信息整理而成,具体细节可能因时间、环境等因素而有所不同。

Daco Semiconductor Co Ltd公司的发展小趣事

Daco深知人才是企业发展的核心动力。因此,公司一直注重人才培养和团队建设。Daco为员工提供了良好的工作环境和发展机会,鼓励员工不断学习和创新。同时,公司也建立了完善的激励机制和福利制度,确保员工能够全身心地投入到工作中。这种注重人才培养和团队建设的做法,使得Daco能够吸引和留住一批优秀的员工,为公司的持续发展提供了有力的保障。

Advanced Optoelectronic Technology Corp公司的发展小趣事

为了进一步提高竞争力,AOTC开始寻求与上下游企业的合作。通过与原材料供应商、生产设备制造商以及销售渠道商建立紧密的合作关系,公司成功实现了产业链的整合,降低了生产成本,提高了生产效率。此外,公司还与其他科技公司开展战略合作,共同研发新产品,拓展新市场。

西博臣(CYBERSEN)公司的发展小趣事

广州西博臣科技有限公司(简称西博臣)成立于2001年,从创立之初就专注于湿度传感器的研发和生产。公司是国内最早从事高分子湿度传感器研发并进行规模化生产的厂家之一,凭借其独特的技术实力和对行业的深刻理解,逐渐在市场中崭露头角。

问答坊 | AI 解惑

怎样获得进程加载了哪些模块(dll)?

怎样获得进程加载了哪些模块(dll)?有没有相关的API或者例子程序? 请知道的朋友说一下,非常紧急! 谢谢!…

查看全部问答>

大家好 求助

大家好 我是个菜鸟 最近在公司实习 老板要做些驱动 我是以前一点都没有接触过WINCE 也不知道怎么入手 没一点头绪 何况也没时间慢慢看书了 希望达人们给些意见 另外我用VS05+6.0R3 该装的补丁都装了  自己定制系统 为什么还会有1个错误 ...…

查看全部问答>

各位大虾,给小弟指条明路吧

    小弟06年毕业以来一直是做应用软件的开发(类似于管理系统)一类的软件, 但总感觉现在做计算机软件的门槛比较低,薪酬也不高,时间长了,没什么新鲜感了, 现在想做嵌入式开发,但一时也不知道从何开始,请各位大虾指点迷津吧…

查看全部问答>

key

key扫描…

查看全部问答>

【挖电源】打造EEWORLD最全电源集锦

下面展示我的劳动成果: 1、纽扣电池电源和通用5号电池电源结合,这是eeworld送给我的奖品---NXP时钟小音箱,还是很漂亮的   2、镍镉电池电源,忘记是什么时候收藏的了,貌似是剃须刀上宝贝   3、我的小车用的工业级的镍氢电池 ...…

查看全部问答>

uCos II 内核结构

内核中主要包含以下的文件:   1.uCOS-II Source->source:(与处理器类型无关的代码) OS_CORE.C 系统初始化,开启多任务环境等的代码 OS_CPU_C.C 多任务栈初始化等与处理器有关的代码 OS_FLAG .C 事件标志组 ...…

查看全部问答>

学习《DLP 微型投影业务及技术应用介绍》第一课--学习心得

学习完第一课我认识到DLP技术确实很震撼,从结构上来说是有微镜阵列,微镜阵列下集成了大约25万个镜子,深究内部结构,其实是有CMOS存储单元组成的,一个DLP芯片有数以万计的像素点。DLP其实是数字光学处理技术,1987年由德州仪器发明,1996年德州 ...…

查看全部问答>

单片机求助

自己在做车辆动态秤系统设计,现在需要单片机软件编程,哪位大神能不能帮帮忙?小弟感激不尽…

查看全部问答>

EEWORLD大学堂----Altera 2014技术巡展(8)Arria 10 SoC简介

Altera 2014技术巡展(8)Arria 10 SoC简介:https://training.eeworld.com.cn/course/2038Altera 2014技术巡展(8)Arria 10 SoC简介…

查看全部问答>

℃的问题

写LCD16032显示程序,显示温度,单位是℃ LCD是带字库的,可是我从WORD里拷贝一个℃符号到KEIL里,变成问号了。 请问高手,这个怎么显示℃呢?谢谢!…

查看全部问答>