MSP430G2553学习笔记

更新时间:2024-04-03 14:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MSP430G2553 崔峰

学习笔记

MSP430G2553性能参数(DIP-20)

工作电压范围:1.8~3.6V。 5种低功耗模式。

16位的RISC结构,62.5ns指令周期。 超低功耗:

运行模式-230μA; 待机模式-0.5μA; 关闭模式-0.1μA;

可以在不到1μs的时间里超快速地从待机模式唤醒。 基本时钟模块配置:

具有四种校准频率并高达16MHz的内部频率; 内部超低功耗LF振荡器; 32.768KHz晶体; 外部数字时钟源。

两个16 位Timer_A,分别具有三个捕获/比较寄存器。 用于模拟信号比较功能或者斜率模数(A/D)转换的片载比较器。

带内部基准、采样与保持以及自动扫描功能的10位200-ksps 模数(A/D)转换器。 16KB闪存,512B的RAM。 16个I/O口。

注意:MSP430G2553无P3口!

MSP430G2553的时钟

基本时钟系统的寄存器

DCOCTL-DCO控制寄存器

DCOx

DCO频率选择控制1 MODx

DCO频率校正选择,通常令MODx=0

注意:在MSP430G2553上电复位后,默认RSEL=7,DCO=3,通过数据手册查得DCO频率大概在0.8~1.5MHz之间。

BCSCTL1-基本时钟控制寄存器1

XT2OFF

不用管,因为MSP430G2553内部没有XT2提供的HF时钟 XTS

不用管,默认复位后的0值即可 DIVAx

设置ACLK的分频数 00 01 10 11 RSELx

DCO频率选择控制2

/1 /2 /4 /8

BCSCTL2-基本时钟控制寄存器2

SELMx

MCLK的选择控制位 00 01 10 11 DIVMx

设置MCLK的分频数 00 01 10 11 SELS

SMCLK的选择控制位 0 1 DIVSx

设置SMCLK的分频数 00 01 10 11 DCOR

DCO直流发生电阻选择,此位一般设0

0 1

内部电阻 外部电阻 /1 /2 /4 /8

DCOCLK

LFXT1CLK或者VLOCLK /1 /2 /4 /8 DCOCLK DCOCLK

LFXT1CLK或者VLOCLK LFXT1CLK或者VLOCLK

BCSCTL3-基本时钟控制寄存器3

XT2Sx

不用管

LFXT1Sx

00 01 10 11 XCAPx

LFXT1晶振谐振电容选择

00 01 10 11

1pF 6pF 10pF 12.5pF

LFXT1选为32.768KHz晶振 保留 VLOCLK 外部数字时钟源

msp430g2553.h中基本时钟系统的内容

/************************************************************ * Basic Clock Module

************************************************************/

#define __MSP430_HAS_BC2__ /* Definition to show that Module is available */

SFR_8BIT(DCOCTL); /* DCO Clock Frequency Control */ SFR_8BIT(BCSCTL1); /* Basic Clock System Control 1 */ SFR_8BIT(BCSCTL2); /* Basic Clock System Control 2 */ SFR_8BIT(BCSCTL3); /* Basic Clock System Control 3 */

#define MOD0 (0x01) /* Modulation Bit 0 */ #define MOD1 (0x02) /* Modulation Bit 1 */ #define MOD2 (0x04) /* Modulation Bit 2 */ #define MOD3 (0x08) /* Modulation Bit 3 */ #define MOD4 (0x10) /* Modulation Bit 4 */ #define DCO0 (0x20) /* DCO Select Bit 0 */ #define DCO1 (0x40) /* DCO Select Bit 1 */ #define DCO2 (0x80) /* DCO Select Bit 2 */

#define RSEL0 (0x01) /* Range Select Bit 0 */ #define RSEL1 (0x02) /* Range Select Bit 1 */ #define RSEL2 (0x04) /* Range Select Bit 2 */

#define RSEL3 (0x08) /* Range Select Bit 3 */ #define DIVA0 (0x10) /* ACLK Divider 0 */ #define DIVA1 (0x20) /* ACLK Divider 1 */

#define XTS (0x40) /* LFXTCLK 0:Low Freq. / 1: High Freq. */ #define XT2OFF (0x80) /* Enable XT2CLK */

#define DIVA_0 (0x00) /* ACLK Divider 0: /1 */ #define DIVA_1 (0x10) /* ACLK Divider 1: /2 */ #define DIVA_2 (0x20) /* ACLK Divider 2: /4 */ #define DIVA_3 (0x30) /* ACLK Divider 3: /8 */

#define DIVS0 (0x02) #define DIVS1 (0x04) #define SELS (0x08) 1:XT2CLK/LFXTCLK */#define DIVM0 (0x10) #define DIVM1 (0x20) #define SELM0 (0x40) #define SELM1 (0x80)

#define DIVS_0 (0x00) #define DIVS_1 (0x02) #define DIVS_2 (0x04) #define DIVS_3 (0x06)

#define DIVM_0 (0x00) #define DIVM_1 (0x10) #define DIVM_2 (0x20) #define DIVM_3 (0x30)

#define SELM_0 (0x00) #define SELM_1 (0x40) #define SELM_2 (0x80) */

#define SELM_3 (0xC0)

#define LFXT1OF (0x01) Flag */

#define XT2OF (0x02) */

#define XCAP0 (0x04) #define XCAP1 (0x08) #define LFXT1S0 (0x10) #define LFXT1S1 (0x20) #define XT2S0 (0x40) #define XT2S1 (0x80)

/* SMCLK Divider 0 */ /* SMCLK Divider 1 */

/* SMCLK Source Select 0:DCOCLK / /* MCLK Divider 0 */ /* MCLK Divider 1 */ /* MCLK Source Select 0 */ /* MCLK Source Select 1 */ /* SMCLK Divider 0: /1 */ /* SMCLK Divider 1: /2 */ /* SMCLK Divider 2: /4 */ /* SMCLK Divider 3: /8 */ /* MCLK Divider 0: /1 */ /* MCLK Divider 1: /2 */ /* MCLK Divider 2: /4 */ /* MCLK Divider 3: /8 */ /* MCLK Source Select 0: DCOCLK */ /* MCLK Source Select 1: DCOCLK */ /* MCLK Source Select 2: XT2CLK/LFXTCLK /* MCLK Source Select 3: LFXTCLK */ /* Low/high Frequency Oscillator Fault /* High frequency oscillator 2 fault flag /* XIN/XOUT Cap 0 */ /* XIN/XOUT Cap 1 */

/* Mode 0 for LFXT1 (XTS = 0) */ /* Mode 1 for LFXT1 (XTS = 0) */ /* Mode 0 for XT2 */ /* Mode 1 for XT2 */

#define XCAP_0 (0x00) /* XIN/XOUT Cap : 0 pF */ #define XCAP_1 (0x04) /* XIN/XOUT Cap : 6 pF */ #define XCAP_2 (0x08) /* XIN/XOUT Cap : 10 pF */ #define XCAP_3 (0x0C) /* XIN/XOUT Cap : 12.5 pF */

#define LFXT1S_0 (0x00) /* Mode 0 for LFXT1 : Normal operation */ #define LFXT1S_1 (0x10) /* Mode 1 for LFXT1 : Reserved */ #define LFXT1S_2 (0x20) /* Mode 2 for LFXT1 : VLO */

#define LFXT1S_3 (0x30) /* Mode 3 for LFXT1 : Digital input signal */

#define XT2S_0 (0x00) /* Mode 0 for XT2 : 0.4 - 1 MHz */ #define XT2S_1 (0x40) /* Mode 1 for XT2 : 1 - 4 MHz */ #define XT2S_2 (0x80) /* Mode 2 for XT2 : 2 - 16 MHz */ #define XT2S_3 (0xC0) /* Mode 3 for XT2 : Digital input signal */

基本时钟系统例程(DCO)

MSP430G2553在上电之后默认CPU执行程序的时钟MCLK来自于DCO时钟。TI提供的Launch Pad上,P1.0和P1.6分别接了红色和绿色的LED灯,下面写一个程序让它们交替闪烁;之后我们来改变DCO的频率,进而使软延时时间变化,可以看到LED闪烁间隔有变化。

#include \ void main(void) { }

WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0 + BIT6; while(1) { }

P1OUT ^= BIT0 + BIT6; __delay_cycles(100000);

这段程序采用430上电后默认的DCO频率,假设是1MHz的话,则延时100000个DCO提供的MCLK大概是0.1s左右。

下面一段程序,将DCOx设置为1,RSELx设置为1,通过数据手册查得DCO频率大概在0.06~0.14MHz之间,所以明显MCLK要慢得多了,因此LED闪烁时间延长。

#include \ void main(void) { }

WDTCTL = WDTPW + WDTHOLD; DCOCTL |= DCO0;

DCOCTL &=~(DCO1 + DCO2); BCSCTL1 |= RSEL0;

BCSCTL1 &=~ (RSEL1 + RSEL2 + RSEL3); P1DIR |= BIT0 + BIT6; while(1) { }

P1OUT ^= BIT0 + BIT6; __delay_cycles(100000);

MSP430G2553的I/O口

MSP430G2553共有2组数字I/O口:P1和P2,每组各有8个引脚,每个引脚都能够响应中断,接受外部输入的上升沿或者下降中断请求。

所有I/O口均与单片机内部外设的特殊功能引脚复用,当我们选用I/O功能时,要作为通用I/O口来使用,这需要相应的寄存器来进行控制。

I/O头文件内容

/************************************************************ * DIGITAL I/O Port1/2 Pull up / Pull down Resistors

************************************************************/

#define __MSP430_HAS_PORT1_R__ /* Definition to show that Module is available */

#define __MSP430_HAS_PORT2_R__ /* Definition to show that Module is available */

SFR_8BIT(P1IN); /* Port 1 Input */ SFR_8BIT(P1OUT); /* Port 1 Output */ SFR_8BIT(P1DIR); /* Port 1 Direction */ SFR_8BIT(P1IFG); /* Port 1 Interrupt Flag */

SFR_8BIT(P1IES); /* Port 1 Interrupt Edge Select */ SFR_8BIT(P1IE); /* Port 1 Interrupt Enable */ SFR_8BIT(P1SEL); /* Port 1 Selection */ SFR_8BIT(P1SEL2); /* Port 1 Selection 2 */ SFR_8BIT(P1REN); /* Port 1 Resistor Enable */

SFR_8BIT(P2IN); /* Port 2 Input */ SFR_8BIT(P2OUT); /* Port 2 Output */ SFR_8BIT(P2DIR); /* Port 2 Direction */ SFR_8BIT(P2IFG); /* Port 2 Interrupt Flag */

SFR_8BIT(P2IES); /* Port 2 Interrupt Edge Select */ SFR_8BIT(P2IE); /* Port 2 Interrupt Enable */ SFR_8BIT(P2SEL); /* Port 2 Selection */ SFR_8BIT(P2SEL2); /* Port 2 Selection 2 */ SFR_8BIT(P2REN); /* Port 2 Resistor Enable */

P1口

P1.0、P1.1、P1.2

P1.3

P1.4

P1.5、P1.6、P1.7

P2.0、P2.1、P2.2、P2.3、P2.4、P2.5

P2.6

P2.7

P1DIR用来选择I/O口是输入还是输出,0为输入,1为输出。 P1IN为输入寄存器,外部的电平输入状态可从此寄存器相应的位读取。 P1OUT为输出寄存器,向外输出的电平状态可从此寄存器送出。 P1SEL和P1SEL2为引脚功能选择。

MSP430G2553的Timer_A

Timer_A的工作原理

MSP430G2553内部有两个Timer_A模块,分别是Timer0_A3和Timer1_A3。“3”表示每个Timer_A模块有3组“捕获/比较”寄存器。Timer_A的主要特性包括:

(1) 具有16位定时/计数功能,3种计数模式可选 (2) 16位定时计数器时钟源可选

(3) 可在CPU不介入的情况下,产生PWM波 (4) 计数器溢出可产生中断

Timer_A又两部分组成:主计数器和比较捕获模块。其中主计数器如下图。

TAR为16主计数器的当前计数值,可对TAR赋初值。主计数器计数时钟有4种来源,通过TASSELx来进行选择。IDx可对输入时钟进行分频,TACLR为主计数器的清零控制位,MCx用来选择主计数器的4种计数模式,TAIFG为主计数器中断标志位。

■TASSELx:00=外部管脚时钟输入 01=ACLK 10=SMCLK 11=TACLK取反 ■IDx:00=不分频 01=2分频 10=4分频 11=8分频

■TACLR:0=不清零 1=清零

Timer_A一共有三种计数模式,分别是:增计数、连续增计数和增减计数。

增计数模式下,每个时钟周期计数值TAR加1,当TAR值超过TACCR0时,TAR自动清零,并且置位TAIFG标志位。而后TAR从0值重新开始加1。改变TACCR0的值即可改变定时周期。

连续增计数模式下,TAR从零加1,加到溢出值0xFFFF为止,之后自动归零重新开始。通常我们利用该计数模式进行信号的捕捉,利用TACCRx寄存器存储捕获发生的时刻。

增减计数模式下,TAR的值从零加到TACRR0,而后再减到零,如此循环。通常我们利用该计数模式产生对称、可加死区延时的PWM波。

Timer_A的另一重要组成部分,是捕获/比较模块,每个Timer_A均有3个捕获/比较模块,它的作用主要有两方面。一是在比较模式下,每个捕获/比较模块都拿自身捕获/比较寄存器TACCRx的值与主计数器TAR的值比较,一旦相等,就自动的改变某个引脚的输出电平,一共有8种电平变化规律可选,这样可以在无CPU干预的情况下产生PWM波;二是在捕获模式下,从某个指定引脚的输入电平跳变可以触发捕获电路,并将此时主计数器的数值自动保存到相应的捕获值寄存器TACCRx中,这个过程纯硬件实现,无CPU干预,可以用来测量频率、占空比等。捕获/比较模块结构图如下:

CAP用来切换选择捕获/比较工作模式;CCISx选择捕获输入源;CMx选择捕获触发沿状态,COV为捕获溢出标志位,如果前一次的捕获值未被读取而新的捕获已经产生,则溢出标志位会置位;捕获引脚的电平状态可以实时的通过CCI读出;由于捕获信号可能与时钟信号不同步,从而产生数字电路竞争,我们可以置位SCS进行同步捕获,假设实际信号的发生时刻值为N,那么同步捕捉到的值将为N+1,建议均采用同步捕捉。

在比较模式下,我们可以通过程序填写TACCRx的值,硬件会自动的将该值与TAR的值进行比较,一旦相等,即产生EQU信号,则通过输出引脚产生电平变化,其中OUTMODEx可以选择电平变化的8种方式,这样就可以产生不同种类的PWM波。OUT可以控制引脚的输出电平(高、低的选择)。

已Timer0_A3为例,其捕获/比较引脚均与I/O口复用,具体复用引脚参加数据手册。

在比较输出模式0下,输出引脚的状态由OUT位控制。其余7种模式下,引脚电平的变化如下图:

增计数模式下

连续增计数模式下

增减计数模式下

Timer_A头文件内容

/************************************************************ * Timer0_A3

************************************************************/

#define __MSP430_HAS_TA3__ /* Definition to show that Module is available */

SFR_16BIT(TA0IV); /* Timer0_A3 Interrupt Vector Word */ SFR_16BIT(TA0CTL); /* Timer0_A3 Control */

SFR_16BIT(TA0CCTL0); /* Timer0_A3 Capture/Compare Control 0 */ SFR_16BIT(TA0CCTL1); /* Timer0_A3 Capture/Compare Control 1 */ SFR_16BIT(TA0CCTL2); /* Timer0_A3 Capture/Compare Control 2 */

SFR_16BIT(TA0R); /* Timer0_A3 */

SFR_16BIT(TA0CCR0); /* Timer0_A3 Capture/Compare 0 */ SFR_16BIT(TA0CCR1); /* Timer0_A3 Capture/Compare 1 */ SFR_16BIT(TA0CCR2); /* Timer0_A3 Capture/Compare 2 */

/* Alternate register names */

#define TAIV TA0IV /* Timer A Interrupt Vector Word */ #define TACTL TA0CTL /* Timer A Control */

#define TACCTL0 TA0CCTL0 /* Timer A Capture/Compare Control 0 */ #define TACCTL1 TA0CCTL1 /* Timer A Capture/Compare Control 1 */ #define TACCTL2 TA0CCTL2 #define TAR TA0R #define TACCR0 TA0CCR0 #define TACCR1 TA0CCR1 #define TACCR2 TA0CCR2 #define TAIV_ TA0IV_ #define TACTL_ TA0CTL_ #define TACCTL0_ TA0CCTL0_ #define TACCTL1_ TA0CCTL1_ #define TACCTL2_ TA0CCTL2_ #define TAR_ TA0R_ #define TACCR0_ TA0CCR0_ #define TACCR1_ TA0CCR1_ #define TACCR2_ TA0CCR2_

/* Alternate register names 2 */

#define CCTL0 TACCTL0 #define CCTL1 TACCTL1 #define CCTL2 TACCTL2 #define CCR0 TACCR0 #define CCR1 TACCR1 #define CCR2 TACCR2 #define CCTL0_ TACCTL0_ #define CCTL1_ TACCTL1_ #define CCTL2_ TACCTL2_ #define CCR0_ TACCR0_ #define CCR1_ TACCR1_ #define CCR2_ TACCR2_

#define TASSEL1 (0x0200) #define TASSEL0 (0x0100) #define ID1 (0x0080) #define ID0 (0x0040) #define MC1 (0x0020) #define MC0 (0x0010) #define TACLR (0x0004)

/* Timer A Capture/Compare Control 2 */ /* Timer A */

/* Timer A Capture/Compare 0 */ /* Timer A Capture/Compare 1 */ /* Timer A Capture/Compare 2 */ /* Timer A Interrupt Vector Word */ /* Timer A Control */

/* Timer A Capture/Compare Control 0 */ /* Timer A Capture/Compare Control 1 */ /* Timer A Capture/Compare Control 2 */ /* Timer A */

/* Timer A Capture/Compare 0 */ /* Timer A Capture/Compare 1 */ /* Timer A Capture/Compare 2 */ /* Timer A Capture/Compare Control 0 */ /* Timer A Capture/Compare Control 1 */ /* Timer A Capture/Compare Control 2 */ /* Timer A Capture/Compare 0 */ /* Timer A Capture/Compare 1 */ /* Timer A Capture/Compare 2 */

/* Timer A Capture/Compare Control 0 */ /* Timer A Capture/Compare Control 1 */ /* Timer A Capture/Compare Control 2 */ /* Timer A Capture/Compare 0 */ /* Timer A Capture/Compare 1 */ /* Timer A Capture/Compare 2 */ /* Timer A clock source select 1 */ /* Timer A clock source select 0 */ /* Timer A clock input divider 1 */ /* Timer A clock input divider 0 */ /* Timer A mode control 1 */ /* Timer A mode control 0 */ /* Timer A counter clear */

#define TAIE (0x0002) /* Timer A counter interrupt enable */ #define TAIFG (0x0001) /* Timer A counter interrupt flag */

#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */ #define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to CCR0 */

#define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */

#define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */ #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */ #define ID_1 (1*0x40u) #define ID_2 (2*0x40u) #define ID_3 (3*0x40u) #define TASSEL_0 (0*0x100u) */

#define TASSEL_1 (1*0x100u) */

#define TASSEL_2 (2*0x100u) */

#define TASSEL_3 (3*0x100u) */

#define CM1 (0x8000) #define CM0 (0x4000) #define CCIS1 (0x2000) #define CCIS0 (0x1000) #define SCS (0x0800) #define SCCI (0x0400) #define CAP (0x0100) #define OUTMOD2 (0x0080) #define OUTMOD1 (0x0040) #define OUTMOD0 (0x0020) #define CCIE (0x0010) #define CCI (0x0008) #define OUT (0x0004) #define COV (0x0002) #define CCIFG (0x0001)

#define OUTMOD_0 (0*0x20u) #define OUTMOD_1 (1*0x20u) #define OUTMOD_2 (2*0x20u) */

#define OUTMOD_3 (3*0x20u) #define OUTMOD_4 (4*0x20u) #define OUTMOD_5 (5*0x20u) #define OUTMOD_6 (6*0x20u)

/* Timer A input divider: 1 - /2 */ /* Timer A input divider: 2 - /4 */ /* Timer A input divider: 3 - /8 */ /* Timer A clock source select: 0 - TACLK /* Timer A clock source select: 1 - ACLK /* Timer A clock source select: 2 - SMCLK /* Timer A clock source select: 3 - INCLK /* Capture mode 1 */ /* Capture mode 0 */

/* Capture input select 1 */ /* Capture input select 0 */ /* Capture sychronize */

/* Latched capture signal (read) */ /* Capture mode: 1 /Compare mode : 0 */ /* Output mode 2 */ /* Output mode 1 */ /* Output mode 0 */

/* Capture/compare interrupt enable */ /* Capture input signal (read) */ /* PWM Output signal if output mode 0 */ /* Capture/compare overflow flag */ /* Capture/compare interrupt flag */ /* PWM output mode: 0 - output only */ /* PWM output mode: 1 - set */

/* PWM output mode: 2 - PWM toggle/reset /* PWM output mode: 3 - PWM set/reset */ /* PWM output mode: 4 - toggle */ /* PWM output mode: 5 - Reset */ /* PWM output mode: 6 - PWM toggle/set

*/

#define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/set */ #define CCIS_0 (0*0x1000u) /* Capture input select: 0 - CCIxA */ #define CCIS_1 (1*0x1000u) /* Capture input select: 1 - CCIxB */ #define CCIS_2 (2*0x1000u) /* Capture input select: 2 - GND */ #define CCIS_3 (3*0x1000u) /* Capture input select: 3 - Vcc */ #define CM_0 (0*0x4000u) /* Capture mode: 0 - disabled */ #define CM_1 (1*0x4000u) /* Capture mode: 1 - pos. edge */ #define CM_2 (2*0x4000u) /* Capture mode: 1 - neg. edge */ #define CM_3 (3*0x4000u) /* Capture mode: 1 - both edges */

/* T0_A3IV Definitions */

#define TA0IV_NONE (0x0000) /* No Interrupt pending */ #define TA0IV_TACCR1 (0x0002) /* TA0CCR1_CCIFG */ #define TA0IV_TACCR2 (0x0004) /* TA0CCR2_CCIFG */ #define TA0IV_6 (0x0006) /* Reserved */ #define TA0IV_8 (0x0008) /* Reserved */ #define TA0IV_TAIFG (0x000A) /* TA0IFG */

/************************************************************ * Timer1_A3

************************************************************/

#define __MSP430_HAS_T1A3__ /* Definition to show that Module is available */

SFR_16BIT(TA1IV); /* Timer1_A3 Interrupt Vector Word */ SFR_16BIT(TA1CTL); /* Timer1_A3 Control */

SFR_16BIT(TA1CCTL0); /* Timer1_A3 Capture/Compare Control 0 */ SFR_16BIT(TA1CCTL1); /* Timer1_A3 Capture/Compare Control 1 */ SFR_16BIT(TA1CCTL2); /* Timer1_A3 Capture/Compare Control 2 */ SFR_16BIT(TA1R); /* Timer1_A3 */

SFR_16BIT(TA1CCR0); /* Timer1_A3 Capture/Compare 0 */ SFR_16BIT(TA1CCR1); /* Timer1_A3 Capture/Compare 1 */ SFR_16BIT(TA1CCR2); /* Timer1_A3 Capture/Compare 2 */

/* Bits are already defined within the Timer0_Ax */

/* T1_A3IV Definitions */

#define TA1IV_NONE (0x0000) /* No Interrupt pending */ #define TA1IV_TACCR1 (0x0002) /* TA1CCR1_CCIFG */ #define TA1IV_TACCR2 (0x0004) /* TA1CCR2_CCIFG */ #define TA1IV_TAIFG (0x000A) /* TA1IFG */

Timer0_A寄存器

TA0CTL-Timer0_A控制寄存器

TASSELx

主计数器时钟源选择 01 ACLK IDx

时钟输入的分频控制 00 /1 01 /2 10 /4 11 /8 MCx

计数模式选择 00 停止模式 01 Up

10 Continuous 11 Up/Down

TACLR

清零控制 TAIE

TAIFG中断使能控制0 禁止 1

使能 TAIFG

TAIFG中断标志

TASSEL_1

ID_0 ID_1 ID_2 ID_3

MC_0 MC_1 MC_2

MC_3

TACLR

TAIE

TAIFG

TA0R-主计数器计数寄存器

TA0CCRx-捕获/比较寄存器

TA0CCTLx-捕获/比较控制寄存器

CMx

捕获模式控制 00 01 10 11 CCISx

不进行捕获操作 捕获上升沿 捕获下降沿

MC_0 MC_1 MC_2 MC_3

上升沿和下降沿同时捕获

捕获引脚选择 00 01 10 11 SCS

CCIxA CCIxB GND VCC

CCIS_0 CCIS_1 CCIS_2 CCIS_3

SCS

同步/异步捕获选择控制 0 1

异步捕获 同步捕获(建议)

CAP CAP

捕获/比较模式选择 0 1

比较模式 捕获模式

OUMODx

比较输出模式选择 000 001 010

电平输出模式:TAx引脚的输出由OUT控制位的值决定

OUTMOD_0 OUTMOD_1

置位模式:当主计数器计数至TACCRx值时,TAx引脚置1

取反/清零模式:当主计数器计数至TACCRx值时,TAx引脚取反,当主计数器计数至TACCR0

OUTMOD_2

值时,TAx引脚置0

011

置位清零模式:当主计数器计数至TACCRx值时,TAx引脚置1,当主计数器计数至TACCR0

OUTMOD_3

OUTMOD_4 OUTMOD_5

值时,TAx引脚置0

100 101 110

取反模式:当主计数器计数至TACCRx值时,TAx引脚取反 清零模式:当主计数器计数至TACCRx值时,TAx引脚置0

取反置位模式:当主计数器计数至TACCRx值时,TAx引脚取反,当主计数器计数至TACCR0

OUTMOD_6

值时,TAx引脚置1

111

清零置位模式:当主计数器计数至TACCRx值时,TAx引脚置0,当主计数器计数至TACCR0

OUTMOD_7

值时,TAx引脚置1 COV

COV

捕获溢出标志位 CCIFG

CCIFG

捕获/比较中断标志位

TA0IV-中断向量寄存器

MSP430G2553的ADC10

ADC10简介

ADC10是一个10位AD转换器,转换速度快。它包含一个10位的转换内核SAR、采样选择控制、参考电压输出、数字量传输控制DTC等模块。DTC可以将数字量转换结果存储到任何一个内存单元内,这不需要CPU来干预。

MSP430G2553的ADC10具有如下特点: 200ksps最大转换速率; 可编程设置采样/保持时间;

可以通过软件或者Timer_A触发转换; 可选内部参考电压,1.5V或者2.5V; 8路模拟输入通道;

内部转换通道自带温度传感器; 可选的转换时钟源;

单通道、重复单通道、序列采样、重复序列采样模式;

10位转换核心

转换核心将输入的模拟信号转换成10位数字量,将转换结果存储在ADC10MEM寄存器中。VR+和VR-定义了模拟输入电压的上限和下限。当模拟输入电压大于VR+时,转换结果为03FFh,当模拟输入电压小于VR-时,转换结果为0。转换结果按下式计算:

转换核心由两个控制寄存器来进行设置:ADC10CTL0、ADC10CTL1。转换核心通过ADC10ON来使

能工作。只有当ENC=0时,ADC10CTL0、ADC10CTL1的位才允许被改写;若要转换开始,必须将ENC=1。

转换时钟

ADC10模块的时钟称为ADC10CLK,转换时间和采样周期与之相关。ADC10的时钟源可以通过ADC10SSELx来进行选择,并通过ADC10DIVx选择分频。ADC10的时钟源有:ACLK、SMCLK、MCLK和ADC10OSC。

输入多路选择器

8路外部模拟输入和4路内部模拟输入可被选中为转换输入。

ADC10的外部输入包括:Ax、VeREF+、VREF-,这些端口与I/O口复用。2553的I/O口为数字CMOS门电路,当模拟信号加在数字CMOS门时,VCC与GND之间会有寄生电流,禁用I/O缓冲器可以消除寄生电流以此降低功耗。ADC10AEx可以选择控制禁用I/O缓冲器。

参考电压产生

ADC10内部自带参考电压模块,提供两种可选的参考电压。REFON=1,使能内部参考源;REF2_5=1,内部参考电压为2.5V;REF2_5=0,内部参考电压为1.5V。当REFOUT=0时,内部参考电压只留给芯片内部使用,当REFOUT=1时,可以将内部参考电压通过VREF+引脚输出。

外部参考电压通过VR+和VR-两个引脚输入。当采用外部参考电压或者VCC作为参考电压时,内部参考电压关闭,以降低功耗。

ADC10的内部参考电压发生模块具有低功耗功能。内部参考电压模块由两部分组成,分别是:带隙基准电压源和独立缓冲器。当REFON=1时,两部分同时开启;当REFON=0时,两部分同时关闭。

采样和转换时间

AD采样可以由一个上升沿信号SHI触发,SHI信号可以为如下几种: 置位ADC10SC;

Timer_A的输出单元0、1、2;

SHI信号的极性可以由ISSH位选择。SHT可以将采样周期tsample设置为4、8、16或64个ADC10CLK时钟周期。SAPMCON为可以将采样周期设置与ADC10CLK同步。一个完整的采样周期包括tsample和tsync。SAMPCON有高向低变化,将启动模拟-数字转换过程,一次转换需要13个连续的ADC10CLK时钟周期长度。

当SAMPCON=0时,所有的模拟输入引脚Ax都为高阻状态;当SAMPON=1时,Ax输入端在tsample

时间内可以看成RC网络构成的低通滤波器。(我们把采样时间设置为最大来用)

转换模式

CONSEQx用来选择转换模式。

Single-Channel Single-Conversion Mode

使用INCHx位来选择一路模拟输入通道进行采样转换。AD转换的结果写入ADC10MEM寄存器。

Sequence-of-Channels Mode

使用INCHx位来选择一个序列的模拟输入通道进行采样转换,直至降序转换至A0通道结束。每一个转换结果都被写入ADC10MEM寄存器。A0通道转换完成后,整个序列转换结束。

若MSC=0,需要每次触发采样转换;若MSC=1,自动序列转换。

Repeat-Single-Channel Mode

Repeat-Sequence-of-Channels Mode

ADC10的头文件定义

/************************************************************ * ADC10

************************************************************/

#define __MSP430_HAS_ADC10__ /* Definition to show that Module is available */

SFR_8BIT(ADC10DTC0); /* ADC10 Data Transfer Control 0 */ SFR_8BIT(ADC10DTC1); /* ADC10 Data Transfer Control 1 */ SFR_8BIT(ADC10AE0);

SFR_16BIT(ADC10CTL0); SFR_16BIT(ADC10CTL1); SFR_16BIT(ADC10MEM); SFR_16BIT(ADC10SA);

/* ADC10CTL0 */

#define ADC10SC (0x001) #define ENC (0x002) #define ADC10IFG (0x004) #define ADC10IE (0x008) #define ADC10ON (0x010) #define REFON (0x020) #define REF2_5V (0x040) #define MSC (0x080) #define REFBURST (0x100) #define REFOUT (0x200) #define ADC10SR (0x400) 1:50ksps */

#define ADC10SHT0 (0x800) #define ADC10SHT1 (0x1000) #define SREF0 (0x2000) #define SREF1 (0x4000) #define SREF2 (0x8000) #define ADC10SHT_0 (0*0x800u) #define ADC10SHT_1 (1*0x800u) #define ADC10SHT_2 (2*0x800u) #define ADC10SHT_3 (3*0x800u)

#define SREF_0 (0*0x2000u) #define SREF_1 (1*0x2000u) #define SREF_2 (2*0x2000u) #define SREF_3 (3*0x2000u) #define SREF_4 (4*0x2000u) #define SREF_5 (5*0x2000u)

/* ADC10 Analog Enable 0 */ /* ADC10 Control 0 */ /* ADC10 Control 1 */ /* ADC10 Memory */

/* ADC10 Data Transfer Start Address *//* ADC10 Start Conversion */ /* ADC10 Enable Conversion */ /* ADC10 Interrupt Flag */ /* ADC10 Interrupt Enalbe */ /* ADC10 On/Enable */ /* ADC10 Reference on */

/* ADC10 Ref 0:1.5V / 1:2.5V */ /* ADC10 Multiple SampleConversion */ /* ADC10 Reference Burst Mode */ /* ADC10 Enalbe output of Ref. */ /* ADC10 Sampling Rate 0:200ksps / /* ADC10 Sample Hold Select Bit: 0 */ /* ADC10 Sample Hold Select Bit: 1 */ /* ADC10 Reference Select Bit: 0 */ /* ADC10 Reference Select Bit: 1 */ /* ADC10 Reference Select Bit: 2 */ /* 4 x ADC10CLKs */ /* 8 x ADC10CLKs */ /* 16 x ADC10CLKs */ /* 64 x ADC10CLKs */ /* VR+ = AVCC and VR- = AVSS */ /* VR+ = VREF+ and VR- = AVSS */ /* VR+ = VEREF+ and VR- = AVSS */ /* VR+ = VEREF+ and VR- = AVSS */ /* VR+ = AVCC and VR- = VREF-/VEREF- *//* VR+ = VREF+ and VR- = VREF-/VEREF- */

#define SREF_6 (6*0x2000u) /* VR+ = VEREF+ and VR- = VREF-/VEREF- */

#define SREF_7 (7*0x2000u) /* VR+ = VEREF+ and VR- = VREF-/VEREF- */

/* ADC10CTL1 */

#define ADC10BUSY (0x0001) /* ADC10 BUSY */

#define CONSEQ0 (0x0002) /* ADC10 Conversion Sequence Select 0 */ #define CONSEQ1 (0x0004) /* ADC10 Conversion Sequence Select 1 */ #define ADC10SSEL0 (0x0008) /* ADC10 Clock Source Select Bit: 0 */ #define ADC10SSEL1 (0x0010) #define ADC10DIV0 (0x0020) #define ADC10DIV1 (0x0040) #define ADC10DIV2 (0x0080) #define ISSH (0x0100) #define ADC10DF (0x0200) complement */

#define SHS0 (0x0400) #define SHS1 (0x0800) #define INCH0 (0x1000) #define INCH1 (0x2000) #define INCH2 (0x4000) #define INCH3 (0x8000)

#define CONSEQ_0 (0*2u) #define CONSEQ_1 (1*2u) #define CONSEQ_2 (2*2u) #define CONSEQ_3 (3*2u)

#define ADC10SSEL_0 (0*8u) #define ADC10SSEL_1 (1*8u) #define ADC10SSEL_2 (2*8u) #define ADC10SSEL_3 (3*8u)

#define ADC10DIV_0 (0*0x20u) #define ADC10DIV_1 (1*0x20u) #define ADC10DIV_2 (2*0x20u) #define ADC10DIV_3 (3*0x20u) #define ADC10DIV_4 (4*0x20u) #define ADC10DIV_5 (5*0x20u) #define ADC10DIV_6 (6*0x20u) #define ADC10DIV_7 (7*0x20u)

#define SHS_0 (0*0x400u) #define SHS_1 (1*0x400u) #define SHS_2 (2*0x400u)

/* ADC10 Clock Source Select Bit: 1 */ /* ADC10 Clock Divider Select Bit: 0 */ /* ADC10 Clock Divider Select Bit: 1 */ /* ADC10 Clock Divider Select Bit: 2 */ /* ADC10 Invert Sample Hold Signal */ /* ADC10 Data Format 0:binary 1:2's /* ADC10 Sample/Hold Source Bit: 0 */ /* ADC10 Sample/Hold Source Bit: 1 */ /* ADC10 Input Channel Select Bit: 0 */ /* ADC10 Input Channel Select Bit: 1 */ /* ADC10 Input Channel Select Bit: 2 */ /* ADC10 Input Channel Select Bit: 3 */ /* Single channel single conversion */ /* Sequence of channels */ /* Repeat single channel */ /* Repeat sequence of channels */ /* ADC10OSC */ /* ACLK */ /* MCLK */ /* SMCLK */ /* ADC10 Clock Divider Select 0 */ /* ADC10 Clock Divider Select 1 */ /* ADC10 Clock Divider Select 2 */ /* ADC10 Clock Divider Select 3 */ /* ADC10 Clock Divider Select 4 */ /* ADC10 Clock Divider Select 5 */ /* ADC10 Clock Divider Select 6 */ /* ADC10 Clock Divider Select 7 */ /* ADC10SC */ /* TA3 OUT1 */ /* TA3 OUT0 */

#define SHS_3 (3*0x400u) /* TA3 OUT2 */

#define INCH_0 (0*0x1000u) /* Selects Channel 0 */ #define INCH_1 (1*0x1000u) /* Selects Channel 1 */ #define INCH_2 (2*0x1000u) /* Selects Channel 2 */ #define INCH_3 (3*0x1000u) /* Selects Channel 3 */ #define INCH_4 (4*0x1000u) /* Selects Channel 4 */ #define INCH_5 (5*0x1000u) /* Selects Channel 5 */ #define INCH_6 (6*0x1000u) /* Selects Channel 6 */ #define INCH_7 (7*0x1000u) /* Selects Channel 7 */ #define INCH_8 (8*0x1000u) /* Selects Channel 8 */ #define INCH_9 (9*0x1000u) /* Selects Channel 9 */ #define INCH_10 (10*0x1000u) /* Selects Channel 10 */ #define INCH_11 (11*0x1000u) /* Selects Channel 11 */ #define INCH_12 (12*0x1000u) /* Selects Channel 12 */ #define INCH_13 (13*0x1000u) /* Selects Channel 13 */ #define INCH_14 (14*0x1000u) /* Selects Channel 14 */ #define INCH_15 (15*0x1000u) /* Selects Channel 15 */

/* ADC10DTC0 */

#define ADC10FETCH (0x001) /* This bit should normally be reset */ #define ADC10B1 (0x002) /* ADC10 block one */

#define ADC10CT (0x004) /* ADC10 continuous transfer */ #define ADC10TB (0x008) /* ADC10 two-block mode */ #define ADC10DISABLE (0x000) /* ADC10DTC1 */

ADC10的寄存器

ADC10CTL0-ADC10控制寄存器0

SREFx

参考源选择

本文来源:https://www.bwwdw.com/article/ze2r.html

Top