2024年5月24日发(作者:犁兴安)
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) /* SMCLK Divider 0 */
#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)
#define XCAP_0 (0x00)
/* 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 */
/* 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 "msp430g2553.h"
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 "msp430g2553.h"
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寄存器中。V
R+
和
V
R-
定义了模拟输入电压的上限和下限。当模拟输入电压大于V
R+
时,转换结果为03FFh,当模拟输入电压
小于V
R-
时,转换结果为0。转换结果按下式计算:
转换核心由两个控制寄存器来进行设置:ADC10CTL0、ADC10CTL1。转换核心通过ADC10ON来使
能工作。只有当ENC=0时,ADC10CTL0、ADC10CTL1的位才允许被改写;若要转换开始,必须将ENC=1。
转换时钟
ADC10模块的时钟称为ADC10CLK,转换时间和采样周期与之相关。ADC10的时钟源可以通过
ADC10SSELx来进行选择,并通过ADC10DIVx选择分频。ADC10的时钟源有:ACLK、SMCLK、MCLK
和ADC10OSC。
输入多路选择器
8路外部模拟输入和4路内部模拟输入可被选中为转换输入。
ADC10的外部输入包括:Ax、V
eREF+
、V
REF-
,这些端口与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时,可以将内部参考电压通过V
REF+
引脚输出。
外部参考电压通过V
R+
和V
R-
两个引脚输入。当采用外部参考电压或者V
CC
作为参考电压时,内部参考
电压关闭,以降低功耗。
ADC10的内部参考电压发生模块具有低功耗功能。内部参考电压模块由两部分组成,分别是:带隙
基准电压源和独立缓冲器。当REFON=1时,两部分同时开启;当REFON=0时,两部分同时关闭。
采样和转换时间
AD采样可以由一个上升沿信号SHI触发,SHI信号可以为如下几种:
置位ADC10SC;
Timer_A的输出单元0、1、2;
SHI信号的极性可以由ISSH位选择。SHT可以将采样周期t
sample
设置为4、8、16或64个ADC10CLK
时钟周期。SAPMCON为可以将采样周期设置与ADC10CLK同步。一个完整的采样周期包括t
sample
和t
sync
。
SAMPCON有高向低变化,将启动模拟-数字转换过程,一次转换需要13个连续的ADC10CLK时钟周期
长度。
当SAMPCON=0时,所有的模拟输入引脚Ax都为高阻状态;当SAMPON=1时,Ax输入端在t
sample
时间内可以看成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); /* ADC10 Analog Enable 0 */
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)
#define SREF_6 (6*0x2000u)
*/
/* 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- */
/* 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) /* ADC10 Clock Source Select Bit: 1 */
#define ADC10DIV0 (0x0020) /* ADC10 Clock Divider Select Bit: 0 */
#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)
#define SHS_3 (3*0x400u)
/* 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 */
/* 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
参考源选择
ADC10SHTx
采样保持时间选择
00 4个ADC10CLK周期
00 8个ADC10CLK周期
00 16个ADC10CLK周期
00 64个ADC10CLK周期
ADC10SR
置1即可。
REFOUT
选择是否将内部参考电压输出
置0
REFBURST
是否一直开启内部参考源
0 一直开启
1 仅在采样和转换过程中开启
MSC
与连续转换还是启动停止有关
REF2_5
内部参考源电压水平
0 1.5V
1 2.5V
REFON
内部参考源使能
0 内部参考源关闭
1 内部参考源开启
ADC10ON
ADC10是否使能
0 关闭
1 使能
ADC10IE
ADC10中断使能
0 不使能中断
ADC10SHT_0
ADC10SHT_1
ADC10SHT_2
ADC10SHT_3
ADC10SR
REFOUT
REFBURST
MSC
REF2_5
REFON
ADC10ON
ADC10IE
1 使能中断
ADC10IFG ADC10IFG
ADC10的中断标志位
0
1
ENC
无中断产生
有中断产生
ENC
转换允许位
0
1
转换禁止
转换开启
ADC10SC ADC10SC
采样转换启动位
0
1
不启动
启动
ADC10CTL1-ADC10控制寄存器1
INCHx
转换通道选择
INCH_0~INCH_15
SHSx
ADC10触发信号选择
00 ADC10SCC
01 Timer_1
10 Timer_0
11 Timer_2
ADC10DF
转换结果数据格式
0 二进制
1 二进制补码
ISSH
采样保持启动信号是否翻转
0 不翻转
1 翻转
ADC10DIVx
ADC10CLK的分频控制
000 /1
001 /2
010 /3
011 /4
100 /5
101 /6
110 /7
111 /8
ADC10SSELx
ADC10时钟源选择
00 ADC10OSC
01 ACLK
10 MCLK
11 SMCLK
SHS_0
SHS_1
SHS_2
SHS_3
ADC10DF
ISSH
ADC10DIV_0
ADC10DIV_1
ADC10DIV_2
ADC10DIV_3
ADC10DIV_4
ADC10DIV_5
ADC10DIV_6
ADC10DIV_7
ADC10SSEL_0
ADC10SSEL_1
ADC10SSEL_2
ADC10SSEL_3
CONSEQx
转换模式选择
00
01
10
11
Single-channel-single-conversion
Sequence-of-channels
Repeat-single-channel
CONSEQ_0
CONSEQ_1
CONSEQ_2
CONSEQ_3 Repeat-sequence-of-channels
ADC10AE0-ADC10模拟通道使能寄存器0
ADC10MEM-ADC10转换结果寄存器
2024年5月24日发(作者:犁兴安)
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) /* SMCLK Divider 0 */
#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)
#define XCAP_0 (0x00)
/* 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 */
/* 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 "msp430g2553.h"
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 "msp430g2553.h"
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寄存器中。V
R+
和
V
R-
定义了模拟输入电压的上限和下限。当模拟输入电压大于V
R+
时,转换结果为03FFh,当模拟输入电压
小于V
R-
时,转换结果为0。转换结果按下式计算:
转换核心由两个控制寄存器来进行设置:ADC10CTL0、ADC10CTL1。转换核心通过ADC10ON来使
能工作。只有当ENC=0时,ADC10CTL0、ADC10CTL1的位才允许被改写;若要转换开始,必须将ENC=1。
转换时钟
ADC10模块的时钟称为ADC10CLK,转换时间和采样周期与之相关。ADC10的时钟源可以通过
ADC10SSELx来进行选择,并通过ADC10DIVx选择分频。ADC10的时钟源有:ACLK、SMCLK、MCLK
和ADC10OSC。
输入多路选择器
8路外部模拟输入和4路内部模拟输入可被选中为转换输入。
ADC10的外部输入包括:Ax、V
eREF+
、V
REF-
,这些端口与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时,可以将内部参考电压通过V
REF+
引脚输出。
外部参考电压通过V
R+
和V
R-
两个引脚输入。当采用外部参考电压或者V
CC
作为参考电压时,内部参考
电压关闭,以降低功耗。
ADC10的内部参考电压发生模块具有低功耗功能。内部参考电压模块由两部分组成,分别是:带隙
基准电压源和独立缓冲器。当REFON=1时,两部分同时开启;当REFON=0时,两部分同时关闭。
采样和转换时间
AD采样可以由一个上升沿信号SHI触发,SHI信号可以为如下几种:
置位ADC10SC;
Timer_A的输出单元0、1、2;
SHI信号的极性可以由ISSH位选择。SHT可以将采样周期t
sample
设置为4、8、16或64个ADC10CLK
时钟周期。SAPMCON为可以将采样周期设置与ADC10CLK同步。一个完整的采样周期包括t
sample
和t
sync
。
SAMPCON有高向低变化,将启动模拟-数字转换过程,一次转换需要13个连续的ADC10CLK时钟周期
长度。
当SAMPCON=0时,所有的模拟输入引脚Ax都为高阻状态;当SAMPON=1时,Ax输入端在t
sample
时间内可以看成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); /* ADC10 Analog Enable 0 */
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)
#define SREF_6 (6*0x2000u)
*/
/* 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- */
/* 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) /* ADC10 Clock Source Select Bit: 1 */
#define ADC10DIV0 (0x0020) /* ADC10 Clock Divider Select Bit: 0 */
#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)
#define SHS_3 (3*0x400u)
/* 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 */
/* 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
参考源选择
ADC10SHTx
采样保持时间选择
00 4个ADC10CLK周期
00 8个ADC10CLK周期
00 16个ADC10CLK周期
00 64个ADC10CLK周期
ADC10SR
置1即可。
REFOUT
选择是否将内部参考电压输出
置0
REFBURST
是否一直开启内部参考源
0 一直开启
1 仅在采样和转换过程中开启
MSC
与连续转换还是启动停止有关
REF2_5
内部参考源电压水平
0 1.5V
1 2.5V
REFON
内部参考源使能
0 内部参考源关闭
1 内部参考源开启
ADC10ON
ADC10是否使能
0 关闭
1 使能
ADC10IE
ADC10中断使能
0 不使能中断
ADC10SHT_0
ADC10SHT_1
ADC10SHT_2
ADC10SHT_3
ADC10SR
REFOUT
REFBURST
MSC
REF2_5
REFON
ADC10ON
ADC10IE
1 使能中断
ADC10IFG ADC10IFG
ADC10的中断标志位
0
1
ENC
无中断产生
有中断产生
ENC
转换允许位
0
1
转换禁止
转换开启
ADC10SC ADC10SC
采样转换启动位
0
1
不启动
启动
ADC10CTL1-ADC10控制寄存器1
INCHx
转换通道选择
INCH_0~INCH_15
SHSx
ADC10触发信号选择
00 ADC10SCC
01 Timer_1
10 Timer_0
11 Timer_2
ADC10DF
转换结果数据格式
0 二进制
1 二进制补码
ISSH
采样保持启动信号是否翻转
0 不翻转
1 翻转
ADC10DIVx
ADC10CLK的分频控制
000 /1
001 /2
010 /3
011 /4
100 /5
101 /6
110 /7
111 /8
ADC10SSELx
ADC10时钟源选择
00 ADC10OSC
01 ACLK
10 MCLK
11 SMCLK
SHS_0
SHS_1
SHS_2
SHS_3
ADC10DF
ISSH
ADC10DIV_0
ADC10DIV_1
ADC10DIV_2
ADC10DIV_3
ADC10DIV_4
ADC10DIV_5
ADC10DIV_6
ADC10DIV_7
ADC10SSEL_0
ADC10SSEL_1
ADC10SSEL_2
ADC10SSEL_3
CONSEQx
转换模式选择
00
01
10
11
Single-channel-single-conversion
Sequence-of-channels
Repeat-single-channel
CONSEQ_0
CONSEQ_1
CONSEQ_2
CONSEQ_3 Repeat-sequence-of-channels
ADC10AE0-ADC10模拟通道使能寄存器0
ADC10MEM-ADC10转换结果寄存器