msp430捕获测频率ADC10-捕获的方式怎样配置

电设工作小结之——MSP430G2553学习笔记——2
我无语了,好好的一篇博客由于太长,非要我分开发,&
接上一篇:
(四),ADC10
&1,ADC10是十位的AD,在g2553上有A0~A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的VCC或GND上。因为是10为的AD所以计算公式如下:
2 ,ADC参考电压的选择:ADC的参考电压可以为:
由ADC控制寄存器0
ADC10CTL0控制。但是要提高ADC的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。例如我在使用时遇到的情况如下:
Vref设为2.5V& 但实际的值大概为2.475V,
选择VCC& VSS作为参考,用电压表测得大概为3.58V&
还是不小的偏差的。
另外,在有可能的情况下,尽量采用较大的VR+和VR-,以减小纹波对采样结果的影响。
3,ADC10的采样方式有:单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。
4,DTC:因为ADC10只有一个采样结果存储寄存器ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用DCT,否则转换结果会不停地被新的结果给覆盖。
DTC是转换结果传送控制,也就是转换结果可以不用CPU的干预,就可以自动地存储在指定的存储空间内。使用这种方式转换速度快,访问方便,适用于高速采样模式中。DTC的使用可以从下面的例子中很容易看明白:
#include &msp430g2553.h&
#include "ser_12864.h"
uchar s1[]={"DTC:"};
uchar s2[]={"2_cha_2_time_DTC"};
void ADC_init()
&ADC10CTL1 = CONSEQ_3 +
INCH_1;&&&&
// 2通道多次转换, 最大转换通道为A1
& ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON +
ADC10IE; // ADC10ON, interrupt enabl&
参考电压选默认值VCC和VSS
& //采样保持时间为16 x
ADC10CLKs,ADC内核开,中断使能&&
MSC多次转换选择开
//如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行& 中断使能
& //使用DTC时,当一个块传送结束,产生中断
& //数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止
& ADC10DTC1 = 0x04; //数据传送控制寄存器1 4
conversions& 定义在每块的传送数目& 一共采样4次
所以单块传送4次
& //以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次
& ADC10AE0 |=
BIT0+BIT1;&&&&&&&&
// P1.0 P1.1 ADC option select 使能模拟输入脚A0 A1
//不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,
& //采样是相同的
void main(void)
adc_sample[8]={0};&&&
//存储ADC序列采样结果
WDTCTL = WDTPW+WDTHOLD;
&&& BCSCTL1 =
CALBC1_12MHZ;& //设定cpu时钟DCO频率为12MHz
&&& DCOCTL =
CALDCO_12MHZ;
|=BIT3+BIT4;&&&&&
//液晶的两条线
init_lcd();
ADC_init();
wr_string(0,0,s1);
wr_string(0,3,s2);
&&& for (;;)
ADC10CTL0 &=
//ADC不使能&
其实这句话可以放在紧接着CPU唤醒之后的,因为CPU唤醒了,说明我们想要的
//转换数据传送完成了,如果ADC继续转换,那么转换结果也不再传输,是无用的。所以紧接着放在CPU唤醒之后
//计时关闭ADC,有利于降低功耗
while (ADC10CTL1 &
BUSY);&&&&&&&&&&&&&&
// Wait if ADC10 core is active& 等待忙
ADC10SA = (unsigned
int)adc_&&
//数据传送开始地址寄存器& 设置DTC的开始地址& Data
buffer start
//设置数据开始传送的地址为数组adc_sample[]的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把
//地址强制转换为16位的int或unsigned int
//应该也可以用指针直接访问DTC的存储区,还没试过
//例如:前面定义了单块传送4次数据,所以每次传送完成了一个块,也就是4次,就会把中断标志位置位,产生中断
//因为上面设置的地址为数组adc_sample[]的首地址,所以每次转换的结果就会传送到该数组的前4位上,所以如果
//一切正常的话,数组里应该是前4位为转换的结果,后4位为初始值0&
通过下面的显示,验证转换是正确的
//一次触发首先对A1、A0采样,放入a[0]和a[1]中,再对A1、A0采样,放入a[2]和a[3]中。如此循环下去。
//验证得知,当多通道采样时,先采高的通道,再采低的通道。如上面每次采样时,先采A1 再A0
//因为一共采样传送4次,所以数组的后4位为初始值0
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion
start&& ADC使能,开始转换
ADC10SC为采样触发源
//不需要cpu的干预,DTC就可以把采样结果存储到指定的存储区中
__bis_SR_register(CPUOFF +
GIE);&&& //
LPM0, ADC10_ISR will force exit& 如果转换结果传送完成,
//就会进入中断,CPU唤醒 继续往下运行
wr_int(2,0,adc_sample[0]);&&
//显示转换结果& A1
wr_int(6,0,adc_sample[1]);&&
wr_int(0,1,adc_sample[2]);&&
wr_int(3,1,adc_sample[3]);&&
wr_int(6,1,adc_sample[4]);
wr_int(0,2,adc_sample[5]);
wr_int(3,2,adc_sample[6]);
wr_int(6,2,adc_sample[7]);
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)&
//中断响应以后,中断标志位自动清零
__bic_SR_register_on_exit(CPUOFF);&&&&&&&
// Clear CPUOFF bit from 0(SR)
上面的例子是把存储结果存储在了uint型的数组中。也可以用指针直接指定要存放的地址,然后再用指针进行访问(理论上可以,但还没有试过)。也可以把存储结果直接存放在一个16位的寄存器中,如:
ADC10SA = (unsigned
int)&TACCR1;&&&&&&&
// Data transfer location& 把转换结果存储在TACCR1所在的
//位置处,就相当于存储在TACCR1中 因为ADC转换结果和寄存器TACCR1都是16位的,所以要把地址强制转换为16位的
&&& //int 或
unsigned int型
&5,ADC采样注意事项:用片上的ADC10进行采样,如果外部分压电路的电阻过大(比如几K以上),AD引脚会把电压拉高,使采样结果发生很大的偏差。应换成小电阻(几十~几百欧),如果要求更精确的话,要加运放进行电压跟随。
& 6,AD采样交流信号:
一般是50Hz,100Hz,1000Hz。方法是在交流信号的一个周期内采样多次(如40次,30次等),然后利用公式可以求出交流信号的有效值,平均值等。
& 7,片上温度传感器
ADC的A10通道接片上的温度传感器,MSP430内嵌的温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管。
当使用片上温度传感器时,采样周期必须大于30us&&&
片上温度传感器的偏移很大,所以精确测量需要
进行校准。选择片上温度传感器INCH_10,ADC其他的设置都和外部通道的设置相同,包括参考电压源的选择和转换存储的选择
选择了片上温度传感器,会自动地打开片上参考电压源发生器作为温度传感器的电压源,但是这并不会时能VREF+输出,也不会
影响AD转换参考源的选择,转换参考源的选择和其他通道的选择相同
公式为:VTEMP=0.00355(TEMPC)+0.986
片上温度传感器的校准,可以参见我的温度传感器校准程序,也可以参考其他的论文。下面只给出程序的一部分:
void ADC_init()
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON,
interrupt enabled 参考电压选默认值VCC和VSS
//采样保持时间为16 x ADC10CLKs,ADC开,中断使能
ADC10CTL1 =
INCH_10;&&&&&&
// ADC输入通道选择A10,为内部的温度传感器
//其他是默认,采样触发输入源选择为ADC10SC,采样输入信号不翻转,转换时钟选择内部时钟源:ADC10OSC,3.7~6.3MHz
//不分频,单通道单次转换
//ADC10AE0 |=
0x02;&&&&&&&&&&&&&&&&&&&&&&&&
// PA.1 ADC option select 使能模拟输入脚A1
//P1DIR |=
0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Set P1.0 to output direction
& //所以是P11为ADC输入脚,P10控制led
(五),通用串行通信接口(USCI)
1,USCI_A:支持UART,& IrDA,& SPI
USCI_B:支持I2C, SPI
这个模块没什么好说的,和其他的一写处理器如S12,ARM等差不多。只要设置好几个控制寄存器,波特率,写几个收发函数就可以了。下面就给出msp430g2553于PC用UART通信的基本程序:
#include& "msp430g2553.h"
char *string1="Helloworld!";
char string2[]="Get
it!\n";&&&
//\n是换行符
void putchar(unsigned char
//发送字符函数
(!(IFG2&UCA0TXIFG));&&&&&&&&&&&&&&&
// USCI_A0 TX buffer ready? 等待TX buffer为空
UCA0TXBUF =
c;&&&&&&&&&&&&&&&&&&&
// TX -& RXed character& 发送字符c
void putstr(char *s)&&
//发送字符串函数
~UCA0RXIE;&& //发送时先关闭接收中断,不接收
while((*s)!='\0')&&&
//如果没有发完,就继续循环发送
putchar(*s);
putchar('\n');&&&&
//发送换行符
UCA0RXIE;&&&
//发送完了打开接收中断
void main(void)
& WDTCTL = WDTPW +
WDTHOLD;&&&&&&&&&&&&&&&&
// Stop WDT
& P1DIR=BIT0;
& BCSCTL1 =
CALBC1_1MHZ;&&&&&&&&&&&&&&&&&&&
// Set DCO 为1MHz
& DCOCTL = CALDCO_1MHZ;
& P1SEL = BIT1 + BIT2
;&&&&&&&&&&&&&&&&&&&&
// P1.1 = RXD, P1.2=TXD
& P1SEL2 = BIT1 +
//第二外围模式选择
//& UCA0CTL1 |=
UCSSEL_2;&&&&&&&&&&
// SMCLK 其他默认:软件复位使能 USCI逻辑保持在复位状态,用于设置串口
& //UCA0CTL0全部为默认状态:无奇偶校验,LSB
first,8bit_data,一位停止位,UART模式,异步模式
//& UCA0BR0 =
8;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SMCLK 1MHz
115200&&& 8
//& UCA0BR1 =
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 1MHz 115200
//& UCA0MCTL = UCBRS2 +
UCBRS0;&&&&&&&&&&&&&&
// Modulation UCBRSx = 5
& //下面是选择ACLK,波特率设置为固定的
& UCA0CTL1 |=
UCSSEL_1;&&&&&
& UCA0BR0 =
3;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// ACLK 32768Hz 9600&&
32768Hz/9600 = 3.41
& UCA0BR1 =
0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 32768Hz 9600
& UCA0MCTL = UCBRS1 +
UCBRS0;&&&&&&&&&&&&&&
// Modulation UCBRSx = 3
& UCA0CTL1 &=
~UCSWRST;&&&&&&&&&&&&&&&&&&&&
// **Initialize USCI state machine**&
初始化释放,可以操作
UCA0RXIE;&&&&&&&&&&&&&&&&&&&&&&&&&
// Enable USCI_A0 RX interrupt& 接收中断使能
& __bis_SR_register(LPM0_bits +
GIE);&&&&&&
// Enter LPM0, interrupts enabled
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
(!(IFG2&UCA0TXIFG));&&&&&&&&&&&&&&&
// USCI_A0 TX buffer ready? 等待TX buffer为空
& UCA0TXBUF =
UCA0RXBUF;&&&&&&&&&&&&&&&&&&&
// TX -& RXed character&
发送接收到是数据
& rev=UCA0RXBUF;
& if(rev&0x01)
& P1OUT |= BIT0;
& putstr(string1);
& putstr(string2);
& P1OUT &= ~BIT0;
注意:关于波特率的设置这一块还没有看懂,但上面的例子总的设置是对的
值得说明的是:可以用定时器来实现串口通信功能,例子还没有看。
3,对于SPI和I2C,有时有可能会用于g2553和其他的一些芯片、设备的通信用,还没没仔细看。
(六),比较器A&& Comparator_A+
1,是一个模拟电压比较器,主要功能是指出两个输入电压CA0和CA1的大小关系,然后由输出信号CAOUT输出。
2,输出:如果正端输入电压大于负端输入电压,输入为1。如果负端输入电压大于正端输入电压,输出为0;
3,最终输出信号的上升沿或下降沿可以设置为具有中断能力,中断响应后,硬件会自动清除中断标志位CAIFG,也可以被软件清除。
4,Comparator_A+支持精密的斜坡AD转换,供电电压检测和监视外部模拟信号。
& 5,比较器的其中一路可以接参考电压,有0.25VCC, 0.5VCC,
三极管的阀值电压0.55V
也可以两路信号都接外部的模拟信号。
6,更详细的内容,参见用户只能,下面的例子是简单的用比较器A比较两个输入模拟电压的高低,有CAOUT输出:
//主要功能是比较两个输入信号的大小关系
&msp430g2553.h&
delay(void);&&&&&&&&&&&&&&&&&&&&&&&&&&
// Software delay
void main (void)
& WDTCTL = WDTPW +
WDTHOLD;&&&&&&&&&&&&&&&&
// Stop WDT
& CACTL2 =
P2CA4;&&& //
CA1/P1.1 = +comp 正输入端信号选择CA1,负输入端信号不连接外部输入信号
& //其他位的设置为默认:比较器输出不滤波 , CAOUT为比较器的输出结果
CCIE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// CCR0 interrupt enabled
& TACTL = TASSEL_2 + ID_3 +
MC_2;&&&&&&&&&&
// SMCLK/8, cont-mode
_EINT();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// enable interrupts
(1)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//比较器A控制寄存器1
CACTL1采用的是默认设置:参考电压源VCAREF加到比较器的正输入端,内部参考源关,比较器关,
//中断不使能
&&& CACTL1 =
0x00;&&&&&&&&&&&&&&&&&&&&&&&&&
// No reference voltage
_BIS_SR(LPM0_bits);&&&&&&&&&&&&&&&&&&&&
// Enter LPM0
&&& CACTL1 =
CAON;&&&&&&&&&&&&&&&&
// 参考源为0.25*Vcc, Comp. on
_BIS_SR(LPM0_bits);&&&&&&&&&&&&&&&&&&&&
// Enter LPM0
&&& CACTL1 =
CAON;&&&&&&&&&&&&&&&&
// 参考源为0.5*Vcc, Comp. on
_BIS_SR(LPM0_bits);&&&&&&&&&&&&&&&&&&&&
// Enter LPM0
&&& CACTL1 =
CAREF1 + CAREF0 +
CAON;&&&&&&&
//参考源为三极管的阀值电压 0.55V, Comp. on
_BIS_SR(LPM0_bits);&&&&&&&&&&&&&&&&&&&&
// Enter LPM0
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
_BIC_SR_IRQ(LPM0_bits);&&&&&&&&&&&&&&&&
// Clear LPM0 bits from 0(SR)
7,也可以用比较器A监视供电电压,用0.25VCC和三极管的阀值电压0.55V进行比较,从而监视供电电压的高低,如果电压低于某个值时,可以做某种动作比如报警电池电量过低等。
(七),低功耗模式
msp430单片机是一个特别强调超低功耗的单片机系列。对于低功耗的实现,丰富的中断和合理的时钟系统是必须的,另外相对独立的外设,可以不在CPU的干预下独立地工作,这样减小了CPU的工作时间,也大幅降低了系统功耗。
2,msp430能够用中断迅速把CPU从低功耗模式中唤醒,唤醒时间小于1us。这就保证了系统的低功耗。让CPU工作在脉冲状态,最大限度地让CPU处于休眠状态,只有在一些需要CPU干预的操作或计算时,才把CPU唤醒。另外,把一些无关的外围模块也都关闭,使一些需要的模块尽量单独工作,从而可以把CPU休眠。合理地利用中断,在需要的时间唤醒cpu。
3,msp430应用系统价格和电流消耗等因素会影响CPU与外围模块对时钟的需求,所以系统使用不同的时钟信号:ACLK, MCLK,
SMCLK。用户通过程序可以选择低频或高频,这样可以根据实际需要来选择合适的系统时钟频率,这3种不同的频率的时钟输出给出不同的模块,从而更合理地利用系统的电源,实现整个系统的超低功耗。
4,单片机的工作模式有:活动模式是(AM),低功耗模式0(LPM0)~低功耗模式4(LPM4)。不同的低功耗模式禁止不同的模块,适应不同的需求。
5,各种低功耗模式的配置有控制位:SCG1,SCG2,OscOff,
CPUOff由软件来配置。而各种低功耗模式又可通过中断的方式会到活动模式。
在CCS的编译系统中,已经做好了各种低功耗模式的宏定义,在软件中直接调用就可以了,宏定义如下:
#ifdef __ASM_HEADER__
LPM0&&&&&&&&&&&&&&&&&&
LPM1&&&&&&&&&&&&&&&&&&
(SCG0+CPUOFF)
LPM2&&&&&&&&&&&&&&&&&&
(SCG1+CPUOFF)
LPM3&&&&&&&&&&&&&&&&&&
(SCG1+SCG0+CPUOFF)
LPM4&&&&&&&&&&&&&&&&&&
(SCG1+SCG0+OSCOFF+CPUOFF)
LPM0_bits&&&&&&&&&&&&&
LPM1_bits&&&&&&&&&&&&&
(SCG0+CPUOFF)
LPM2_bits&&&&&&&&&&&&&
(SCG1+CPUOFF)
LPM3_bits&&&&&&&&&&&&&
(SCG1+SCG0+CPUOFF)
LPM4_bits&&&&&&&&&&&&&
(SCG1+SCG0+OSCOFF+CPUOFF)
#include "in430.h"
LPM0&&&&&&&&
_bis_SR_register(LPM0_bits)&&&&&&&&
LPM0_EXIT&&&
_bic_SR_register_on_exit(LPM0_bits)
LPM1&&&&&&&&
_bis_SR_register(LPM1_bits)&&&&&&&&
LPM1_EXIT&&&
_bic_SR_register_on_exit(LPM1_bits)
LPM2&&&&&&&&
_bis_SR_register(LPM2_bits)&&&&&&&&
LPM2_EXIT&&&
_bic_SR_register_on_exit(LPM2_bits)
LPM3&&&&&&&&
_bis_SR_register(LPM3_bits)&&&&&&&&
LPM3_EXIT&&&
_bic_SR_register_on_exit(LPM3_bits)
LPM4&&&&&&&&
_bis_SR_register(LPM4_bits)&&&&&&&&
LPM4_EXIT&&&
_bic_SR_register_on_exit(LPM4_bits)
6,具体的例子就不再举了,就是在CPU不需要工作的时候进入低功耗模式,在需要工作的时候,通过中断唤醒。
下面说说一般的低功耗的原则:
(1),最大化LPM3的时间,用32KHz晶振作为ACLK时钟,DCO用于CPU激活后的突发短暂运行。
& (2),用接口模块代替软件驱动功能。
& (3),用中断控制程序运行。
& (4),用可计算的分支代替标志位测试产生的分支。
& (5),用快速查表代替冗长的软件计算。
& (6),在冗长的软件计算中使用单周的CPU寄存器。
& (7),避免频繁的子程序和函数调用。
& (8),尽可能直接用电池供电。
此外,在设计外设时还有一些常规原则:
& (1),将不用的FETI输入端连接到Vss。
& (2),JTAG端口TMS, TCK和TDI不要连接到Vss。
& (3),CMOS输入端不能有浮空节点,将所有输入端接适当的电平。
(4),不论对于内核还是对于各外围模块,选择尽可能低的运行频率,如果不影响功能应设计自动关机。
(八),看门狗定时器
1,单片机的看门狗定时器的原始功能是防止程序出错跑飞,但是在系统的研发阶段,一般不使用看门狗的。
2,msp的看门狗可以工作在看门狗模式和间隔定时器模式,在间隔定时器模式下,就可以当一个普通的定时器使用。其中工作模式的宏定义如下:
__MSP430_HAS_WDT__&&&&&&&&&&&&&&&&&&&
SFR_16BIT(WDTCTL);&&&&&&&&&&&&&&&&&&&&&&&&&&&
WDTIS0&&&&&&&&&&&&&&&&
WDTIS1&&&&&&&&&&&&&&&&
WDTSSEL&&&&&&&&&&&&&&&
WDTCNTCL&&&&&&&&&&&&&&
WDTTMSEL&&&&&&&&&&&&&&
WDTNMI&&&&&&&&&&&&&&&&
WDTNMIES&&&&&&&&&&&&&&
WDTHOLD&&&&&&&&&&&&&&&
WDTPW&&&&&&&&&&&&&&&&&
WDT_MDLY_32&&&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL)&&&&&&&&&&&&&&&&&&&&&&&&
WDT_MDLY_8&&&&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)&&&&&&&&&&&&&&&&&
WDT_MDLY_0_5&&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)&&&&&&&&&&&&&&&&&
WDT_MDLY_0_064&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)&&&&&&&&&&
WDT_ADLY_1000&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)&&&&&&&&&&&&&&&&
WDT_ADLY_250&&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)&&&&&&&&&
WDT_ADLY_16&&&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)&&&&&&&&&
WDT_ADLY_1_9&&&&&&&
(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)&&
WDT_MRST_32&&&&&&&&
(WDTPW+WDTCNTCL)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WDT_MRST_8&&&&&&&&&
(WDTPW+WDTCNTCL+WDTIS0)&&&&&&&&&&&&&&&&&&&&&&&&&&
WDT_MRST_0_5&&&&&&&
(WDTPW+WDTCNTCL+WDTIS1)&&&&&&&&&&&&&&&&&&&&&&&&&&
WDT_MRST_0_064&&&&&
(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)&&&&&&&&&&&&&&&&&&&
WDT_ARST_1000&&&&&&
(WDTPW+WDTCNTCL+WDTSSEL)&&&&&&&&&&&&&&&&&&&&&&&&&
WDT_ARST_250&&&&&&&
(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)&&&&&&&&&&&&&&&&&&
WDT_ARST_16&&&&&&&&
(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)&&&&&&&&&&&&&&&&&&
WDT_ARST_1_9&&&&&&&
(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)&&&&&&&&&&&
下面举一个看门狗工作于间隔定时器模式下的例子:
#include &msp430g2553.h&
void main(void)
& WDTCTL =
WDT_MDLY_32;&&&&&&&&&&&&&&&&&&&&
// Set Watchdog Timer interval to ~30ms&
WDTIE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Enable WDT interrupt 间隔定时器模式中断使能
& P1DIR |=
0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Set P1.0 to output direction
& _BIS_SR(LPM0_bits +
GIE);&&&&&&&&&&&&&&&&
// Enter LPM0 w/ interrupt
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void
watchdog_timer(void)&&
//WDTIFG中断标志自动清除
& P1OUT ^=
0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Toggle P1.0 using exclusive-OR
3,上电以后看门狗默认是打开的,如果不用的话就将其关闭:
WDTCTL = WDTPW + WDTHOLD;
4,看门狗控制寄存器还控制着RST/NMI管脚的功能,可以选择它为复位管脚,也可以选择它产生不可屏蔽中断,例子如下:
//第16脚是RST/NMI/SBWTDIO&
在本程序中,如果按下RESER键,会进入非可屏蔽中断,使P10 led闪烁
&msp430g2553.h&
void main(void)
& WDTCTL = WDTPW + WDTHOLD + WDTNMI +
WDTNMIES;& // WDT off NMI hi/lo
& //WDTHOLD停止看门狗定时器&
WDTNMI选择RST/NMI pin为NMI功能&&
WDTNMIES选择下降沿触发NMI
& P1DIR |=
0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Set P1.0 to output direction
& P1OUT &=
~0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&
// Clear P1.0 LED off
NMIIE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Enable NMI& 不可屏蔽中断使能
_BIS_SR(LPM0_bits);&&&&&&&&&&&&&&&&&&&&&&
// Enter LPM0&&&
因为是非可屏蔽中断,所以不用打开总中断
#pragma vector=NMI_VECTOR
__interrupt void nmi_ (void)
& P1OUT |=
0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Set P1.0 LED on
& for (i = 20000; i & 0;
i--);&&&&&&&&&&&&&
& P1OUT &=
~0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&
// Clear P1.0 LED off
~NMIIFG;&&&&&&&&&&&&&&&&&&&&&&&&&
// Reclear NMI flag in case bounce
& //NMI中断标志位必须要软件清除
NMIIE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// Enable NMI
//当非可屏蔽中断被相应,所有的NMI使能位都会自动地被复位,所以NMI相应之后,用户必须软件重新使能需要的NMI
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。MSP430G2的一段程序代码求解释_百度知道
MSP430G2的一段程序代码求解释
if (ADC10MEM &lt,对应P1; Clear P1.1口)
ADC10AE0 |= 0x02;
/ / ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
__bic_SR_register_on_exit(CPUOFF);msp430g2231.1模拟输入)
P1DIR |= 0x01; input A1(选择输入通道A1;/
&#47.1 ADC option select (使能P1;&#47.0 LED on
/&#47.0 LED off
P1OUT |= 0x01;
/ Sampling and conversion start (ADC10开始采样转换)
__bis_SR_register(CPUOFF + GIE);/ Set P1; Set P1; PA;
//&#47#include &
&#47,低功耗模式)
&#47, ADC10_ISR will force exit (开总中断;
/ LPM0;//
/ 转换时钟选择 ADC10ON(打开ADC10).0口状态******/.0为输出模式)
for (.h&&#47, interrupt enabled(使能中断)
ADC10CTL1 = INCH_1.0 to output direction (P1;/ 0x1FF)
P1OUT &= ~0x01; Clear CPUOFF bit from 0(SR)
其中ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE;
ADC10CTL0 |= ENC + ADC10SC; Stop WDT
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE;/开始大多看不懂;
void main(void)
WDTCTL = WDTPW + WDTHOLD;*******翻转P1
ADC10CTL0 应该是寄存器ADC10SHT_2 , ADC10ON , ADC10IE 应该是对应的控制位,你要结合mcu的datasheet看
其他类似问题
为您推荐:
其他1条回答
你会有所发现的,IAR也卸载掉了, ADC10ON应该是打开10位AD功能的意思,首先IAR FOR MSP430里面关于MSP430G2的H文件肯定会有ADC10CTL0这个寄存器的地址映射。因为我已经不玩430了, 而 ADC10IE应该是ADC使能,搜索ADC10CTL0,具体要去查看MSP430G2的DATA SHEET,ADC10SHT_2这个我不懂 这个不难
您可能关注的推广
程序代码的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁msp430 ADC10单通道多次转换_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
msp430 ADC10单通道多次转换
上传于||文档简介
&&T​I​杯​电​子​设​计​大​赛​ 3单​片​机​自​己​编​的​各​模​块​小​程​序
大小:2.96KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢2514人阅读
MSP430学习笔记(5)
1.ADC12功能模块
(1)参考电压发生器:ADC需要一个基准信号,ADC的数字输出表示模拟输入相对于它的基准的比率。
& &MSP430内置参考电源,有6种可编程选择,分别为VR+和VR-的组合。
& &VR+: AVCC(模拟电源正端),VREF+(AD转换内部参考电源的输出正端),VEREF+(外部参考源的正输入端)
& &VR-: AVSS(模拟电源负端),VREF-/VEFER-(AD参考电源负端)。
(2)模拟多路器
ADC12用一个转换内核,分时的接通多个模拟信号。其中8路外部模拟信号输入,4路内部通道可以将VEREF+,VREF-/VEREF-, (AVCC-AVSS)/2, 片内温度传感器的输出。
(3)转换器内核
& 具有采样和保持功能,把结果存放在转换存储器中。
& 输入的模拟电压最终转换结果:N_ADC = 4095 * (V_IN-(VR-)) / ((VR+)-(VR-)),VR+和VR-限定了输入的范围,凡是大于VR+的都输出满量程值0FFFH,小于VR-则输出0.
& 通常通过ADC12ON 在不需要ADC时关闭转换内核。
(4)采样机转换所需的时序控制电路:各种时钟。
(5)转换结果缓存:ADC12共有12个转换通道设置了16个转换存储器ADC12MEMx。
2.ADC的转换寄存器
CSSTARTADD:转换存储器地址位,共四位表示二进制数0~15分别对应ADC12MEM0~15.
SHS:采样触发输入源。0(ADC12SC),1(Timer_A.OUT1),2(Timer_B.OUT0),3(Timer_B.OUT1).
如图所示,在打开ADC12ON之后怎样进入采样保持阶段,要看SHS的设置。如果SHS=0,那么软件修改ADC12SC就可以使得ADC开始采样START SAMPLING。而如果SHS不是1,那么就需要WAIT FOR TRIGGER,当收到别的采样触发信号之后SAMPCON才跳变,开始采样保持。
SHP:采样信号(SAMPCON)选择控制位。0(SAMPCON来自采样触发输入信号),1(SAMPCON来自采样定时器).
SHP=1:采样触发输入信号只作为一个trigger,上升沿通知SAMPCON开始采样。SAMPCON结束采样时由采样定时器控制的。
SHP=0:SAMPCON直接由采样输入信号控制。
ISSH:输入信号是否为同向输入。
ADC12DIV:ADC12时钟源分频因子选择位。
ADC12SSEL:内核时钟源选择。0(ADC12内部时钟源ADC12OSC).
CONSEQ:转换模式选择位。单通道/序列通道,单次/多次。
ADC12BUSY:0(没有活动的操作),1(正处於采样期间转换期间)
SHT1,SHT0:采样保持定时器1,采样保持定时器0:定义了结果寄存器ADC12MEM8-15及ADC12MEM0-7中的转换采样时序与采样时钟ADC12CLK的关系。采样周期是ADC12CLK周期乘以4的整数倍。SHTx的&#2)决定了n(1-256)的大小。
MSC:当CONSEQ设为多次转换模式时,SHP=1即SAMPCON来自采样定时器时,MSC决定了采样定时器的触发条件。
2.5V:内部参考电压选择:0(1.5v),1(2.5v)
REFON:参考电压打开或关闭
ADC12ON:内核打开或关闭
ADC12OVIE:溢出中断允许位:ADC12MEMx原有数据没有读出就有新的转换结果需要写入时。
ADC12TVIE:转换时间溢出中断允许位:当前转换还没有完成又发生一次采样请求。
ENC:转换允许位。只有ENC=0时才能修改ADC12CTLx的高位。只有当BUSY标志为0时才能清零ENC,否则会使ADC立马停止,转换结果不可靠。
& 0: ADC为初始状态,不能启动AD转换。
& 1: 首次转换由SAMPCON上升沿启动。
ADC12SC:SHP=0保持高电平采样,SHP=1保持由0变1时启动转换。
3.存储及其控制寄存器:ADC12MEM0-15,ADC12MCTL0-15
控制寄存器ADC12MCTLx:EOS表示序列有没有结束。SREF表示参考电源选择。INCH表示模拟输入通道的选择。
4.ADC和中断:因为ADC转换时间比较长,在转换期间,MSP430可以去处理其他事情提高效率。所以ADC用转换结束信号作为中断请求,CPU就会来读取结果。
ADC12IFG:0-15.对应着ADC12MEM0-15.作为中断标志寄存器置位表示转换结束,并且结果已经装入转换存储寄存器。IFG复位表示ADC12MEM被访问。
ADC12IE0-15:中断使能允许相应的IFG在置位时发生中断请求服务。
ADC12IV:由于ADC12是一个多源中断,有18个中断标志(ADC12IFG0-15,ADC12TOV,ADC12OV),但只有一个中断向量。因此需要设置这18个标志的优先级顺序,按照优先级来安排中断标志的响应。各中断标志会产生一个0-36的偶数。位于ADC12IV中的数字将加在PC上,用于实现自动进入相应中断服务程序。
5.ADC12转换模式:
(1)单通道单次转换模式:每次转换必须回到ENC=0----&ENC=1这个WAIT FOR ENABLE过程。
SHS:选择触发源。如果用ADC12SC直接控制就直接进入采样保持状态。否则进入等待触发状态,只有触发到来进入采样保持状态。
SHP:选择采样结束方式。是由采样触发信号SHI直接控制结束,还是由采样定时器控制结束。
采样保持状态结束后进入CONVERSION转换状态。
转换完成后进入存储数据,并把IFG置位。
(2)单通道多次转换:转换完成后可以回到WAIT FOR TRIGGER或SAMPLEING状态。
MCS:SHP=1才有意义。MCS=1,就是采样转换将在上一次转换结束之后马上进行。
& & & & & & & & & MCS=0,就是采样转换要等待下一次SHI触发采样定时器。
(3)序列通道单词转换,序列通道多次转换之间的区别跟以上相同。
& &序列通道的意思是:EOS标识了序列是否结束。在单次转换时只有结束才回到WAIT FOR ENABLE 状态。但是如果没有设置EOS=1的序列。即使复位ENC也不能停止转换。
6.ADC的电压VCC,VSS,VRER等需要并联两个电容。详见USER'S GUIDE。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17170次
排名:千里之外
原创:32篇
(1)(1)(15)(17)

我要回帖

更多关于 msp430捕获模式 的文章

 

随机推荐