msp430 adc 参考电压10 dtc模块有什么用处?adc10的哪几种采用模式必须使用dtc

单片机(6)
定义一个指针,让它指向内存的某个地址,然后通过指针就可以访问。如果需要访问地址为0x210的内存单元(MSP430的ram起始地址是0x200),则可以这样:
*p=90;//在地址为0x210的内存单元存入一个数字90
a= *p;//将地址为0x210的内存单元中的数字读出赋值给a其实不光是430单片机,其他各种单片也是如此操作,这是由C语言决定的,与具体CPU无关,但各种单片机内存的地址范围不同,这个需要注意。
==============以上内容引自“百度知道”==================
地址空间的0x0200为起始地址,往高地址增长是RAM占用的地址空间,RAM占用空间的大小跟具体的器件直接相关。RAM部分可以用来存储数据和指令。
MSP430F1232的ADC10转换结果存放在ADC10SA指定的起始地址中,地址是连续的,每个地址中存放多大的数据?ADC10转换结果先放在16位MEM中,那么这16位怎么放在内存中,怎么取出来?
第一个问题:每个地址中存放8位数据第二个问题:应该是MEM中的低八位放在sa指定的初始地址a0中,高八位放在下一个地址,也就是a0+1中,到底是不是这么放的,因为手册中并没有明确的写出来,也或者自己没有找到,所以最有效的方法是通过一个例程,单步调试程序,看一下a0和a0+1地址取出的数据到底是什么样的,这是最有效的方式,所以不要嫌麻烦。
个人感觉上述来自百度知道的方法应该是有效的,但是经过实验发现该内存读写代码无法实现读取内存的目的,经过查找别的资料,发现使用AD10的ADT+SA采样转换的内存读取方案:
MSP430的ADC10的DTC功能确实强大,它支持将ADC10MEM中的内容自动存放到任意地址。经过上面的学习,我们已经知道必须要设置ADC10SA来确认传送的目标地址,然后通过设置ADC10DTC1来确认传送的数据大小(字节数),另外还可以通过设置ADC10DTC0中的ADC10TB来选择传输一块或者两块数据、设置ADC10CT来选择是否连续传递数据。
因为大家现在还没有学习flash模块,为了避免覆盖flash中的重要数据(比如我们每次用到的CALBC1_16MHZ和CALDCO_16MHZ都是在flash中存放的),我们只在RAM中做文章。我们可以给定一个固定的地址,比如0x0200,但是我们如何保证这些地址不会被别的程序覆盖呢,确实很难保证。Cloud也不推荐用这种方式。那么我们能不能利用DTC直接将数据存放到我们的变量中呢?
答案是肯定的。学习过指针的同学都知道,在程序中,所有的变量都是有其地址的,通过这个思想,我们让ADC10SA指向某个变量的地址,然后再将ADC10DTC1的大小和变量长度相匹配就好了。
#include &msp430.h&
unsigned char
unsigned short
ushort temp0, temp1;
uchar temp0_L, temp0_H;
uchar temp1_L, temp1_H;
ushort array[2] = (0);
int main(void)
WDTCTL = WDTPW + WDTHOLD;
// Stop WDT
BCSCTL1 |= DIVA_2;
// ACLK = LFXT1CLK/8
ADC10CTL1 = ADC10SSEL_1 + INCH_1 + CONSEQ_1;
// A1/A0, single sequence, 选择ACLK作为时钟源
ADC10CTL0 = MSC + ADC10ON + ADC10IE + REFON + REF2_5V;
//时钟源分频+连续
ADC10DTC1 = 0x02;
// 2 conversions
ADC10AE |= 0x03;
// P2.1,0 ADC10 option select
P3SEL |= 0x30;
// P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10;
// P3.4为输出
ME2 |= UTXE0 + URXE0;
// Enabled USART0 TXD/RXD
UCTL0 |= CHAR;
// 8-bit character
UTCTL0 |= SSEL1;
// UCLK = SMCLK, 选择SMCLK作为时钟源
UBR00 = 0xD0;
// 2MHz 9600
UBR10 = 0x00;
UMCTL0 = 0x00;
// no modulation
UCTL0 &= ~SWRST;
// Initalize USART state machine
IE2 |= URXIE0;
// Enabled USART0 RX interrupt
ADC10CTL0 &= ~ENC;
while (ADC10CTL1 & BUSY);
// Wait if ADC10 core is active
ADC10SA = (short) (array);
// Data buffer start
ADC10CTL0 |= ENC + ADC10SC;
// Sampling and conversion start
__bis_SR_register(CPUOFF + GIE);
// LPM0, ADC10_ISR will force exit
//AD把两路转换完成,而且给了ADC10SA控制将长度为2的数据块放到某个地址中,那么可以从地址中取出转换完成的数据
//一个块放着两个转换完的数据,每个转换完的数据长度是2个字节,一个地址是一个字节,现在的地址是在0x200的基础上加4
//但是这个地址是个什么意思不太明白
//对于中断来说,当每次两个整个数据块都传递完成时,中断标志置1,此时产生中断,让CPU跳出低功耗状态,继续执行上面的for循环
//继续开始转换,由于AD转换独立于CPU,所以CPU又进入低功耗状态,当转换完成时再次跳出低功耗,这样不断进入跳出,实现低功耗。
//所以低功耗跳出之后,以下应该写串口传输的代码,将转换完的数字量给USART
//很简单,模数转换之后,结果自然保存到了array数组中,数组每个元素的大小是2字节,因为ADC是10位,采样结果先放在2字节的MEM寄存器中
//所以一次转换结果在内存中占用两个连续的地址,也就是2字节大小
temp0_L = array[1] & 0x00
temp0_H = (array[1]&&8) & 0x00
temp1_L = array[0] & 0x00
temp1_H = (array[0]&&8) & 0x00
//array[1]对应着A0的数字输出;array[0]对应着A1的数字输出
while (!(IFG2 & UTXIFG0));
TXBUF0 = 0xC0;
while (!(IFG2 & UTXIFG0));
TXBUF0 = temp0_H;
while (!(IFG2 & UTXIFG0));
TXBUF0 = temp0_L;
while (!(IFG2 & UTXIFG0));
TXBUF0 = temp1_H;
while (!(IFG2 & UTXIFG0));
TXBUF0 = temp1_L;
while (!(IFG2 & UTXIFG0));
TXBUF0 = '\n';
// ADC10 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC10_VECTOR))) ADC10_ISR (void)
#error Compiler not supported!
__bic_SR_register_on_exit(CPUOFF);
// Clear CPUOFF bit from 0(SR)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:37399次
积分:1214
积分:1214
排名:千里之外
原创:76篇
评论:14条
(1)(2)(1)(2)(1)(19)(1)(1)(1)(2)(30)(1)(1)(3)(8)(7)(1)(1)(1)ADC10模块使用DTC功能时,为何ADC10SA起始地址只能设置为0x200? - 利尔达技术论坛
注册日期: Nov 2005
现金: 225 金币
资产: 225 金币
ADC10模块使用DTC功能时,为何ADC10SA起始地址只能设置为0x200?
昨天发的一篇帖子如下:
一直调试不通,今天来什么都没有修改,只是将ADC10SA的起始地址设置为0x200,输出数据就很正常,修改成其余的地址,输出都不正确,请问这是为何?
注册日期: Nov 2005
现金: 225 金币
资产: 225 金币
大虾们,请赐教!
请输入出现在右边图片上的六位数字或字母(不区分大小写)
[QUOTE=224544]昨天发的一篇帖子如下:
[url]/showthread.php?t=91958[/url]
一直调试不通,今天来什么都没有修改,只是将ADC10SA的起始地址设置为0x200,输出数据就很正常,修改成其余的地址,输出都不正确,请问这是为何?[/QUOTE]
当前查看此主题的会员: 1 (0 位会员和 1 位游客)
您不可以发表新主题
您不可以回复主题
您不可以上传附件
您不可以编辑您的帖子
论坛禁用 HTML 代码
用户控制面板
会员在线状态
【A】利尔达互动区
利尔达活动场
【B】技术在线:排难解疑 技术讨论
MSP430微控制器与32位微处理器
物联网技术应用专区
【C】采购区:小批量采购
采购销售讨论区
【D】休闲区:放松精神,轻松聊天
【E】论坛管理区:提出建议和意见关于论坛
所有时间均为北京时间。现在的时间是 。
版权所有(C) 利尔达科技有限公司 电话:86-571- 传真:86-571-
邮编:310011
地址:杭州市登云路425号利尔达科技大厦msp430 学习经验总结
我的图书馆
msp430 学习经验总结
最近学习MSP430,把自己的一些经验分享下,这是我在网上发现的一篇很不错的文章,归纳得很好,简洁明了。
1.MSP430开发环境建立
1.安装IAR&dor&msp430&软件,软件带USB仿真器的驱动。
2.插入USB仿真器,驱动选择安装目录的/drivers/TIUSBFET
3.建立一个工程,选择"option"选项,设置
&&a、选择器件,在"General"项的"Target"标签选择目标器件
&&b、选择输出仿真,在"Linker"项里的"Output"标签,选择输出"Debug&information&for&C-SPY",以输出调试
&&&&&信息用于仿真。
&&c、若选择"Other",Output下拉框选择"zax-m"即可以输出hex文件用以烧录,注意,此时仿真不了。
&&d、选择"Debugger"项的"Setup"标签,"Driver"下拉框选择"FET&Debugger"
&&e、选择"FET&Debugger"项的"Setup"标签,"Connection"下拉框选择"Texas&Instrument&USB-I"
4.仿真器的接口,从左到右分别为&"&GND,RST,TEST,VCC"
数字输入/输出端口有下列特性:□&每个输入/输出位都可以独立编程。□&允许任意组合输入、输出。□&P1&和&P2&所有&8&个位都可以分别设置为中断。□&可以独立操作输入和输出数据寄存器。□&可以分别设置上拉或下拉电阻。
&在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
(以下x为1表示P1,为2表示P2,如此类推)
1.选择引脚功能&--&PxSEL,PxSEL2
&&PxSEL2&&&&&&&&PxSEL&&&&&&管脚功能&&0&&&&&&&&&&&&&0&&&&&&&&&&用作IO口&&0&&&&&&&&&&&&&1&&&&&&&&&&用作第一功能引脚&&1&&&&&&&&&&&&&0&&&&&&&&&&保留,参考具体型号的手册&&1&&&&&&&&&&&&&1&&&&&&&&&&用作第二功能引脚
&&设置引脚用作外设功能时,芯片不会自动设置该引脚输入输出方向,要根据该功能,用户自己设置方向寄存器
2.选择引脚输入/输出方向&--&PxDIR
&&Bit&=&0:&输入&&Bit&=&1:&输出
3.选择引脚是否使能上下拉电阻&--&PxREN
&&Bit&=&0:&不使能&&Bit&=&1:&使能
4.输出寄存器&--&PxOUT
&&Bit&=&0:&输出低电平或者下拉&&Bit&=&1:&输出高电平或者上拉5.管脚状态寄存器&--&PxIN
&&Bit&=&0:&管脚当前为低&&Bit&=&1:&管脚当前为高
& 你说的“第二功能”应该是指外围模块功能吧,用模块就选“第二功能”,不用模块就选“第一功能”。 可通过设置PxSEL寄存器进行选择,某位写“0”为I/O;写“1”为“第二功能”。 用到比较器(片内外围模块)时要设置为第二功能。 当然你如果是用片外的比较器,将其输出的高低电平(1或0)送给MSP430,那就选“第一功能”。
3.Base&clock&模块
一、4个时钟振荡源
&&&1、LFXT1CLK:&&外部晶振或时钟1&低频时钟源&低频模式:32768Hz&高频模式:(400KHz-16MHz)
&&&2、XT2CLK:&&&&外部晶振或时钟2&高频时钟源(400KHz-16MHz)&&&3、DCOCLK:&&&&内部数字RC振荡器,复位值1.1MHz&&&4、VLOCLK:&&&&内部低功耗振荡器&12KHz
&&&注:MSP430x20xx:&LFXT1&不支持&HF&模式,&XT2&不支持,&ROSC&不支持.
二、3个系统时钟
&&&1、ACLK:&&辅助时钟
&&&&&&复位:&&LFXT1CLK的LF模式,内部电容6pF
&&&&&&分频:&&1/2/4/8
&&&&&&时钟源:LFXT1CLK/VLOCLK.
&&&&&&用途:&&独立外设,一般用于低速外设
&&&2、MCLK:&&主时钟
&&&&&&复位:&&DCOCLK,1.1MHz
&&&&&&分频:&&1/2/4/8
&&&&&&时钟源:LFXT1CLK/VLOCLK/XT2CLK/DCOCLK
&&&&&&用途:&&CPU,系统
&&&3、SMCLK:&子系统时钟
&&&&&&复位:&&DCOCLK,1.1MHz
&&&&&&分频:&&1/2/4/8
&&&&&&时钟源:LFXT1CLK/VLOCLK/XT2CLK/DCOCLK
&&&&&&用途:&&独立外设,一般用于高速外设
三、寄存器
&&&1、DCOCTL:DCO控制寄存器(读写)
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
&&&&&&DCOx:定义8种频率之一,可分段调节DCOCLK的频率,相邻两种频率相差10%。而频率又注入直流发生器
&&&&&&&&&&&&的电流定义。
&&&&&&MODx:&位调节器选择。这几位决定在&32&个&DCOCLK&周期内插入高1段频率&fDCO+1的次数。当
&&&&&&&&&&&&&DCOX=7,已为最高段频率,此时不能用MODx作为频率调整。
&&&2、BCSCTL1:基础时钟系统控制寄存器1
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
&&&&&XT2OFF:是否关闭XT2
&&&&&&&&&&&&&0:打开XT2&,1:关闭XT2
&&&&&XTS:&&&XT2模式选择
&&&&&&&&&&&&&0:LF&mode&(低频模式)&,1:HF&mode&(高频模式)
&&&&&DIVA:&&ACLK的分频选择&0-3&对应&1/2/4/8&分频
&&&&&RSELx:&选择DCO中16种标称的频率,实际对应16个内部电阻
&&&&&&&&&&&&&0-15&对应的频率&从&低到高,当&DCOR=1&时,表示选用外接电阻,所以RSELx无效
&&&3、BCSCTL2:基础时钟系统控制寄存器2
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
&&&&&&SELMx:选择MCLK的时钟源
&&&&&&&&&&&&&0:DCOCLK
&&&&&&&&&&&&&1:DCOCLK
&&&&&&&&&&&&&2:当&XT2&振荡器在片内时采用&XT2CLK。当&XT2&振荡器不在片内时采用&LFXT1CLK&或&VLOCLK
&&&&&&&&&&&&&3:LFXT1CLK&或&VLOCLK
&&&&&&DIVMx:&MCLK的分频选择&0-3&对应&1/2/4/8&分频
&&&&&&SELS:&选择SMCLK的时钟源
&&&&&&&&&&&&&0:DCOCLK&&&&&&&&&&&&&1:当&XT2&振荡器存在时选用&XT2CLK,当&XT2&振荡器不存在时采用&LFXT1CLK&或&VLOCLK
&&&&&&DIVSx:&SMCLK的分频选择&0-3&对应&1/2/4/8&分频
&&&&&&DCOR:&&0:DCOCLK使用内部电阻、&1:DCOCLK使用外接电阻
&&&4、BCSCTL3:基础时钟系统控制寄存器3
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
&&&&&XT2Sx:XT2范围选择
&&&&&&&&&&&&0:0.4-1MHz&晶体或振荡器
&&&&&&&&&&&&1:1-3MHz&晶体或振荡器
&&&&&&&&&&&&2:3-16MHz&晶体或振荡器
&&&&&&&&&&&&3:0.4-16MHz外部数字时钟源
&&&&&LFXT1Sx:&低频时钟选择和&LFXT1&范围选择。当&XTS=0&时在&LFXT1&和&VLO之间选择。当&XTS=1&时选
&&&&&&&&&&&&&&&择&LFXT1&的频率范围。
&&&&&&&&&&&&0:LFXT1上的&32768Hz&晶体
&&&&&&&&&&&&1:保留
&&&&&&&&&&&&2:VLOCLK(MSP430X21X1&器件上保留)
&&&&&&&&&&&&3:外部数字时钟信源
&&&&&XCAPx:振荡器电容选择。这些位选择当&XTS=0&时用于&LFXT1&的有效电容。
&&&&&&&&&&&&0:1pF
&&&&&&&&&&&&1:6pF
&&&&&&&&&&&&2:10pF
&&&&&&&&&&&&3:12.5pF
&&&&&XT2OF:XT2振荡器是否失效&&&&&&&&&&&&&0:有效,正在工作&&&&&&&&&&&&1:无效,未正常工作&&&&&&LFXT1OF:LFXT1振荡器是否失效&&&&&&&&&&&&&0:有效,正在工作&&&&&&&&&&&&1:无效,未正常工作&
&&&5、IE1:中断使能寄存器&1
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
&&&&&&OFIE:振荡器失效中断使能。该位使&OFIFG&中断使能。由于&IE1&的其它位&&&&&&&&&&&&用于其它模块,因此采用&BIS.B&或&BIC.B&指令来设置或清零该位比&&&&&&&&&&&&用&MOV.B&或&CLR.B&更合适。
&&&6、IFG1:中断标志寄存器&1
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
&&&&&&OFIFG:振荡器失效中断标志。由于&IFG1&的其它位用于其它模块,因此&&&&&&&&&&&&&采用&&BIS.B&&或&&BIC.B&&指令来设置或清零该位比用&&MOV.B&&或&&&&&&&&&&&&&CLR.B&更合适。
&&&&&&&&&&&&&0:没有未被响应的中断
&&&&&&&&&&&&&1:有未被响应的中断
四、DCO频率
&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=33 height=33&
4种频率经校准精度为±1%
&4.&定时器TA
一、时钟源
&&&&1、时钟源:ACLK/SMCLK&外部TACLK/INCLK
&&&&2、分频:1/2/4/8&当&(注:TACLR&置位时,分频器复位)
二、计数模式
&&&&&通过设置MCx可以设置定时器的计数模式
&&&&1、停止模式:停止计数
&&&&2、单调增模式:定时器循环地从0增加到TACCR0值
&&&&&&&周期&&&&&&:TACCR0
&&&&&&&CCIFG&&&&&:Timer计到TACCR0值时触发
&&&&&&&TAIFG&&&&&:Timer计到0时触发
&&&&3、连续模式&&:定时器循环从0连续增加到0xFFFF
&&&&&&&周期&&&&&&:0x10000
&&&&&&&TAIFG&&&&&:Timer计到0时触发
&&&&4、增减模式&&:定时器增计数到TACCR0&再从&TACCR0&减计数到&0
&&&&&&&周期&&&&&&:TACCR0值的2倍
&&&&&&&CCIFG&&&&&:Timer计到TACCR0值时触发
&&&&&&&TAIFG&&&&&:Timer计到0时触发
三、定时器A&TACCRx&比较模式&(用于输出和产生定时中断)
&&&&1、设置:CAP=0选择比较
&&&&2、输出信号:比较模式用于选择&PWM&输出信号或在特定的时间间隔中断。当&TAR&计数
&&&&到&TACCRx&的值时:
&&&&&&&a、中断标志&CCIFG=1;&&&&&&&&b、内部信号&EQUx=1;&&&&&&&&c、EQUx&根据输出模式来影响输出信号&&&&&&&&d、输入信号&CCI&锁存到&SCCI
&&&&&&&每个捕获比较模块包含一个输出单元。输出单元用于产生如&PWM&这样的信号。每个输出单元可以根据
&&&&&&&EQU0&和&EQUx&产生&8&种模式的信号。
&&&&3、中断
&&&&&&&TimerA&有&2&个中断向量:&&&&&&&&a、TACCR0&CCIFG&的&TACCR0&中断向量
&&&&&&&b、所有其他&CCIFG&和&TAIFG&的&TAIV&中断向量&&&&&&&&&&在捕获模式下,当一个定时器的值捕获到相应的&TACCRx&寄存器时,&&CCIFG&标志置位。&&&&&&&&&&在比较模式下,如果&TAR&计数到相应的&TACCRx&值时,CCIFG&标志置位。软件可以清除或置&&&&&&&&&&位任何一个&CCIFG&标志。当响应的&CCIE&和&GIE&置位时,&CCIFG&标志就会产生一个中断。
&&&&&&&c、TACCR0&CCIFG&&标志拥有定时器&A&的最高中断优先级,并有一个专用的中断向量,
&&&&&&&&&&当进入&TACCR0&中断后,TACCR0&CCIFG&标志自动复位。
&&&&&&&d、TACCR1&CCIFG,&TACCR2&CCIFG,&&和&TAIFG&标志共用一个中断向量。中断向量寄存器&TAIV&&&&&&&&&&用于确定它们中的哪个要求响应中断。最高优先级的中断在&TAIV&寄存器中产生一个数字(见&&&&&&&&&&寄存器说明),这个数字是规定的数字,可以在程序中识别并自动进入相应的子程序。禁止定时&&&&&&&&&&器&A&中断不会影响&TAIV&的值。&&&&&&&&&&&对&TAIV&的读写会自动复位最高优先级的挂起中断标志。如果另一个中断标志置位,在结&&&&&&&&&&束原先的中断响应后会,该中断响应立即发生。例如,当中断服务子程序访问&TAIV&时,如果&&&&&&&&&&TACCR1&和&TACCR2&CCIFG&标志位置位,TACCR1&CCIFG&自动复位。在中断服务子程序的&RETI&&&&&&&&&&命令执行后,TACCR2&CCIFG&标志会产生另一个中断。
四、TimerA的捕获模式
&&&&1、设置:CAP=1选择捕获,&CCISx位设置捕获的信号源,CMx位选择捕获的沿,上升,下降,或上升下降都
&&&&&&&&&&&&&捕获。
&&&&2、如果一个第二次捕获在第一次捕获的值被读取之前发生,捕获比较寄存器就会产生一个溢出逻辑,COV
&&&&&&&位在此时置位,如图&8-11,COV&位必须软件清除。
五、寄存器
&&&1、TACTL:TimerA控制寄存器
&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=30 height=30&
&&&&&&TASSELx:TA时钟源选择
&&&&&&&&&&&&0:TACLK;1:ACLK;2:SMCLK;3:INCLK
&&&&&&IDx:&&&&输入分频,分时钟源分频再输入TimerA
&&&&&&&&&&&&0/1/2/3:1/2/4/8&分频
&&&&&&MCx:&&&&模式控制
&&&&&&&&&&&&0:停止定时器;1:增模式,定时器计数到TACCR0;
&&&&&&&&&&&&2:连续模式,定时器计数到0xFFFF;3:增减模式,0-&TACCR0-&0
&&&&&&TACLR:&&定时器清零位。该位置位会复位&TAR,时钟分频和计数方向。TACLR位会自动复位并读出值为0
&&&&&&TAIE:&&&TA&中断允许。该位允许&TAIFG&中断请求&&&&&&&&&&&&0:中断禁止;1:中断允许
&&&&&&TAIFG:&&TA中断标记
&&&&&&&&&&&&0:无中断挂起;1:中断挂起
&&&2、TAR:TimerA计数寄存器
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=30 height=30&
&&&3、TACCTLx:捕获比较控制寄存器
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=30 height=30&
&&&&&&CMx:捕获模式
&&&&&&&&&&&0:不捕获&;1:上升沿捕获;2:下降沿捕获&;3:上升和下降沿都捕获
&&&&&&CCISx:捕获比较选择,该位选择&TACCRx&的输入信号
&&&&&&&&&&&0:CCIxA;1:CCIxB;2:GND;3:VCC
&&&&&&SCS:同步捕获源,该位用于将捕获通信和时钟同步&&&&&&&&&&&0:异步捕获;1:同步捕获
&&&&&&SCCI:同步的捕获/比较输入,所选择的&CCI&输入信号由&EQUx&信号锁存,并可通过该位读取
&&&&&&CAP:捕获模式
&&&&&&&&&&&0:比较模式;1:捕获模式
&&&&&&OUTMODx:输出模式位。由于在模式&2,3,6&和&7&下&EQUx=&EQU0,因此这些模式对&TACCR0&无效
&&&&&&&&&&&0:OUT&&位的值;1:置位;2:翻转/复位;3:置位/复位&&&&&&&&&&&&4:翻转;5:复位;6:翻转/置位;7:复位/置位
&&&&&&CCIE:捕获比较中断允许位,该位允许相应的&CCIFG&标志中断请求&&&&&&&&&&&0:中断禁止;1:中断允许
&&&&&&CCI:捕获比较输入。所选择的输入信号可以通过该位读取
&&&&&&OUT:对于输出模式&0,该位直接控制输出状态&&&&&&&&&&&0:输出低电平;1:输出高电平
&&&&&&COV:捕获溢出位。该位表示一个捕获溢出发生。COV&必须由软件复位。
&&&&&&&&&&&0:没有捕获溢出发生;1:有捕获溢出发生
&&&&&&CCIFG:捕获比较中断标志位
&&&&&&&&&&&0:没有中断挂起;1:有中断挂起
&&&4、TAIV:TimerA中断向量寄存器
&&&&&&&学习经验总结】" alt="[转载]【msp430&学习经验总结】" width=30 height=30&
&&&&&&寄存器的值:
&&&&&&0:无中断挂起;
&&&&&&2:捕获比较1&TACCR1&CCIFG;
&&&&&&4:捕获比较2&TACCR2&CCIFG;
&&&&&&0xA:定时器溢出&TAIFG
5.MSP430中断嵌套机制
(1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT。(2)当进入中断程序时,只要不在中断中再次开中断,刚总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行。(3)若在中断A中开了总中断,刚可以响应后来的中断B(不管B的优先级比A高还是低),B执行完现继续执行。注意:进入中断B生总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后中跳出中断程序进入A程序时,总中断会自动打开。(4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来才起做用!中断服务不执行抢先原则。(5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断必须先清标志现打开中断开关。
6.关于MSP430中断机制--我的理解
因DC的邀请写一个有关中断的东东,我也接触430不久只能以自己的心得体会更大家分享,若有纰漏恳请见谅。MSP430用户手册上有的中断介绍我就不赘述了,大家可以看User&Guider.我讲的主要是书上没有的,或者是点的不透的。希望对大家有用。1.中断嵌套,优先级430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的则要求查询某个寄存器后中断标志位才会清零。由于大多数人接触的第一款单片机通常是51,51单片机CPU在响应低优先级的中断程序过程中若有更高优先级的中断发生,单片机就会去执行高优先级,这个过程已经产生了中断嵌套。而430单片机则不同,如果在响应低优先级中断服务程序的时候,即使来了更高优先级的中断服务请求,430也会置之不理,直至低优先级中断服务程序执行完毕,才会去响应高优先级中断。这是因为430在响应中断程序的时候,总中断GIE是复位状态的,如果要产生类似51的中断嵌套,只能在中断函数内再次置位GIE位。2.定时器TATimerA有2个中断向量。TIMERA0,TIMERA1TIMERA0只针对CCR0的计数溢出TIMERA1再查询TAIV后可知道是CCR1,还是CCR2,亦或TAIFG引起的,至于TAIFG是什么情况下置位的,则要看TA工作的模式具体看用户手册。还有一点TA本身有PWM输出功能,无须借用中断功能。在这个问题上经常出现应用弯路的是如何结合TA和AD实行定时采样的问题,很多人都是在TA中断里打开AD这样来做。这是不适宜的,因为430&的ADC10,ADC12(SD16不熟悉,没发言权)模块均有脉冲采样模式和扩展采样模式。只要选择AD是由TA触发采样,然后把TA设置成PWM输出模式,当然输出PWM波的都是特殊功能脚,但是在这里它是不需要输出的,所以引脚设置不必理会。值得关心的就是PWM的频率,也就是你AD的采样率。3.看门狗复位看门狗有2种工作模式:定时器&,看门狗定时器工作模式下WDTIFG在响应中断服务程序有标志位自动复位,而在看门狗模式下,该标志位只能软件清零。但是怎么判断复位是由于WDT工作在看门狗模式下的定时溢出引起的,还是看门狗写密钥错误引起的呢?………………………………答案是没有方法,至少我没见过有什么方法,也没见过周边的人有什么方法。若有人知道方法谢谢分享。4.经常有人会问这个语句的MOV.B&&#LPM0,0(SP)的作用。假如你在进入中断函数之前,430是在LPM0下待机,若要求执行完中断函数之后进入LPM3待机,在中断函数里写MOV.B&&#LPM3,SR是无效的。因为在进入中断时430会把PC,SR压栈,(&SR内保存着低功耗模式的设置)即使你写了MOV.B&&#LPM3,SR,在退出中断出栈时SR会被重新设置成低功耗0,要达到这样的目的,只能更改堆栈内SR的设置:MOV.B&&#LPM0,0(SP)。5中断向量:430的中断向量是FFE0H—FFFFH,一共32个字节也就是FLASH的最后一段,430的FLASH有大有小,但是最后地址肯定是FFFFH(大FLASH超过64K的除外)所以它们的起始地址是不一样的,而一般IAR默认编译都是把程序放在FLASH开始的位置(不包括信息段)。有个值得弄清楚的问题是:什么是中断向量?中断向量实际就是保存中断函数入口地址的存储单元空间。就像FFFEH+FFFFH这2个字节是复位中断向量,那么它存储的就是主函数在FLASH内的起始地址,假如主函数保存在以0x1100为起始地址的FLASH块内,那么你会发现FFFFH&内保存的是0x11,&FFFE内保存的是0x00.其他什么TimerA,ADC12,所有的都一样。只是你每次写的程序长短不一,中断函数放的位置不一样。IAR编译器都会给你定好,然后在你用JTAG烧写程序的时候,把这个地址,烧写到相应的中断向量。因为中断函数所处地址可以由用户自定义,也可以让IAR自动编译,所以这个地址除了源代码开发人员知道,其他人是不知道的,BSL就是应用这32个字节的中断向量内的内容的特殊性设置的密码。但是有几个东西在430是不变的,就是触发中断的条件满足后,它到哪个地方去寻址中断服务函数的入口地址,是TI&在做430时就固化好,定死的。比方说上电复位的时候,它知道去FFFE,FFFF单元找地址,而不去FFE0,FFE2找地址,这个映射关系是430固化不变的。可有的时候你就是需要改变“中断向量”,这怎么办?430FLASH程序自升级里有时就会碰到这个问题,方法是在430原来默认的中断向量表内做一个跳转操作,同样以上电复位为例:ORG&&0x2345PowerReset:&mov.w&&&0xFCFE,PC……………………………………………………ORG&&0xFFFEDW&&&PowerReset这样的话0xFCFE就相当是0xFFFE的映射了。这个在430程序自升级的TI应用报告里就有。有点晚,就到这里。有新的内容的话,我会添加。希望大家能够喜欢。
TA的最新馆藏

我要回帖

更多关于 msp430 定时器 adc 的文章

 

随机推荐