文档库 最新最全的文档下载
当前位置:文档库 › MSP430G2553学习笔记

MSP430G2553学习笔记

MSP430G2553学习笔记
MSP430G2553学习笔记

Msp430g2553语句格式:

延时:__delay_cycles(1000000);

空语句: _NOP();

低功耗模式:_BIS_SR(LPM X_bits); // Enter LPM3

_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)

按键中断:#pragma vector = PORT1_VECTOR

__interrupt void PORT1_ISR(void)

{ };

A0定时器:#pragma vector=TIMER0_A0_VECTOR

__interrupt void Timer_A (void)

{ };

开启内部VL0时钟12kHz:

BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

__bis_SR_register(SCG1 + SCG0); // Stop DCO

//--运行下面代码可将DC0校准至精准的1MHz--

DCOCTL=0;

BCSCTL1 = CALBC1_1MHZ;

DCOCTL = CALDCO_1MHZ;

//BCSCTL1 = CALBC1_16MHZ,

//DCOCTL = CALDCO_16MHZ,

//------------(1、8、12、16)-----------

内部数字控制振荡器(DCO)

扩展IO口TCA6416

寄存器的一般宏定义配置方法:

在MSP430G2553.h 的头文件中,用于配置寄存器的宏定义有三类,“不带下划线”、

“带1 条下划线”和“1 条以上下划线”。

1)不带下划线的寄存器宏定义:实际上就是一个控制位,以便人们不用去记忆该位在8 位或16 位寄存器中的位置。

2)带1 条下划线的寄存器宏定义:有些功能设置需要2 位或以上才能完整描述。当只需要2 位时,我们就可以将2 位的组合展开,变为xx_0/1/2/3 来直接加以设置,相当

于数字电路中的“2-4 译码”。

3)带1 条以上下划线的寄存器宏定义:这类宏定义可以完成某一项非常复杂的设置,实际上是将多种宏定义的组合相加起来,相当于宏定义的宏定义。

IO口的复用:

基本时钟系统结构原理图

三种时钟

◆ACLK:辅助时钟

ACLK 可被软件配置成从LFXT1CLK 或VLOCLK 输入震荡ACLK 可以被

1,2,4,8 分频。ACLK 可以被选用作为外围模块的时钟输入。

◆MCLK:主时钟

主时钟可以从LFXT1CLK 或VLOCLK,XT2CLK 或DCOCLK 输入MCLK 用在CPU 系统之中。

◆SMCLK:辅助主时钟

SMCLK 可被选择从LFXT1CLK,VLOCLK,XT2CLK 或DCOCLK 输入。SMCLK 可以被1,2,4,8 分频。SMCLK 可被选用为外围模块的时钟。

1、ACLK:系统辅助时钟,来自LFXT1CLK 为32768HZ。

2、MCLK:系统主时钟,有以下5种选择:

1、32768HZ,来自ACLK。

2、1MHZ: BCSCTL1 = CALBC1_1MHZ;

DCOCTL = CALDCO_1MHZ;

3、8MHZ: BCSCTL1 = CALBC1_8MHZ;

DCOCTL = CALDCO_8MHZ;

4、12MHZ: BCSCTL1 = CALBC1_12MHZ;

DCOCTL = CALDCO_12MHZ;

5、16MHZ: BCSCTL1 = CALBC1_16MHZ;

DCOCTL = CALDCO_16MHZ;

3、SMCLK:子系统时钟,一般为16MHZ。

P1REN:上下拉电阻使能寄存器,用于配置管脚输入时的上下拉电阻, 1 使能,此时与P1OUT配合选择上拉或者下拉,1 为上拉,0 位下拉。

P1SEL:功能选择寄存器,1 为引脚配置为使用外围模块功能。

P1IE:中断使能寄存器,1 使能引脚中断。

P1IES:中断触发沿选择寄存器,1 为下降沿触发,0 为上升沿触发。

P1IFG:中断标志寄存器,发生中断事件时相应位置1。

P1DIR:方向寄存器,1 为输出,0 为输入,复位默认为输入状态。

P1OUT:输出寄存器,1 时引脚输出高电平,0 时输出低电平。

P1IN:输入寄存器,用于读取IO 电平状态。

MSP430 具有一种运行模式及5 种可利用软件来选择的低功耗操作模式。一个中断事件能够将器件从任一低功耗模式唤醒、处理请求、并在接收到来自中断程序的返回信号时恢复至低功耗模式。

以下6 种操作模式可利用软件来配置:

?激活模式(AM)

–所有时钟处于激活状态

?低功耗模式0 (LPM0)

–CPU 被禁用

–ACLK 和SMCLK 仍然有效,MCLK 被禁用

?低功耗模式1 (LPM1)

–CPU 被禁用

–ACLK 和SMCLK 仍然有效,MCLK 被禁用

–如果DCO 不是在激活模式下被使用,则DCO 的dc 生成器被禁用?低功耗模式2 (LPM2)

–CPU 被禁用

–MCLK 和SMCLK 被禁用

–DCO 的dc 生成器保持启用

–ACLK 保持激活

?低功耗模式3 (LPM3)

–CPU 被禁用

–MCLK 和SMCLK 被禁用

–DCO 的dc 生成器保持启用

–ACLK 保持激活

?低功耗模式4 (LPM4)

–CPU 被禁用

–ACLK 被禁用

–MCLK 和SMCLK 被禁用

–DCO 的dc 生成器保持启用

–晶体振荡器被停止

ACLK(辅助时钟)

MCLK(主系统时钟)

SMCLK(子系统时钟)

以P1口外部中断为例:

打开局部中断:

P1IE|=BIT0;//打开P1.0外部中断

同样以P1口外部中断为例:

关闭局部中断:

P1IE&=~BIT0;//关闭P1.0外部中断

打开、关闭全局中断:

_EINT();//打开总中断,相当于51的EA=1;

_DINT();//关闭总中断,相当于51的EA=0;

TI 将该表命名为“中断向量列表”(Interrupt Vector),由该表可知,断优先级为

1. 上电复位、外部复位、看门狗、Flash 操作失误、程序指针非法读取。

2. NMI、晶体振荡错误、Flash 内存访问违例。

3. 定时器1,TA1CCR0 的中断

4. 定时器1,TA1CCR1、TA1CCR2 对应的中断

5. 比较器中断

6. 看狗中断

7. 定时器0,TA0CCR0 的中断

8. 定时器0,TA0CCR1、TA0CCR2 对应的中断

9. 串行通信接收中断

10. 串行通信发送中断

11. ADC 转换中断

12. P2 口中断

13. P1 口中断

上述中断优先级均无需记忆,用到即查即可。

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

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

P1DIR |= BIT0; // Set P1.0 to output direction

P1IES |= BIT3; // P1.3 Hi/lo edge

P1IFG &= ~BIT3; // P1.3 IFG cleared

P1IE |= BIT3; // P1.3 interrupt enabled

_BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt

}

// Port 1 interrupt service routine

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{

if (P1IFG & BIT3)

{

P1OUT ^= BIT0; // P1.0 = toggle

P1IFG &= ~BIT3; // P1.3 IFG cleared

}

}

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

中断函数编写的规则为

****************************************

#pragma vector = 中断向量源

__interrupt void 函数名(void)

****************************************

摁住“Ctrl + 左键”点击PORT1_VECTOR 即可查看到所有的“中断向量”

在头文件中可以看到以下所有的中断向量,在这里整理出来,并加以注释。

1. RESET_VECTOR最高优先级,复位中断。

2. NMI_VECTOR NMI 不可屏蔽中断

3. TIMER1_A0_VECTOR定时器1,TA1CCR0 的中断

4. TIMER1_A1_VECTOR定时器1,TA1CCR1、TA1CCR2 对应的中断,需要根

据标志位来判断是哪一个中断时间发生。

5. COMPARATORA_VECTOR比较器中断

6. WDT_VECTOR看狗中断

7. TIMER0_A0_VECTOR定时器0,TA0CCR0 的中断,

8. TIMER0_A1_VECTOR定时器0,TA0CCR1、TA0CCR2 对应的中断,需要根

据标志位来判断是哪一个中断时间发生。

9. USCIAB0RX_VECTOR串行通信接收中断

10. USCIAB0TX_VECTOR串行通信发送中断

11. ADC10_VECTOR ADC 转换中断

12. PORT2_VECTOR P2 口中断,需要根据标志位来判断是哪一个中断时

间发生。

13. PORT1_VECTOR P1 口中断,需要根据标志位来判断是哪一个中断时

间发生。

中断应用程序举例(外部中断):

void interrupt_initial()

{

P1DIR&=~BIT7; //P1.7为输入

P1SEL|=BIT7;

P1IE|=BIT7; //P1.7中断允许

P1IES|=0x80; //P1.7下降沿触发

P1IFG=0; //P1.7中断标志清除,对于多源中断必须先清中断标志再打开中断

P1DIR|=BIT6;

P1OUT&=~BIT6;

_EINT(); //总中断允许

}

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{

P1IFG&=~BIT7; //P1.7中断标志清除

P1OUT|=BIT6; //点亮绿灯

}

定时基本同msp430f449一样。

例程:

void zengjishu()

{

TACTL=TASSEL_2+TACLR+ID_3; //选择计数时钟为MCLK,并进行8分频,将计数器TAR清零

CCTL0=CCIE; //使能中断

CCR0=65535; //计数终值,方波频率为:1048576/65536/8/2=1HZ TACTL|=MC_1; //选择Timer_A为增计数模式

P1DIR|=BIT0; //P1.0作为输出

_EINT(); //使能总中断

}

#pragma vector =TIMER0_A0_VECTOR

__interrupt void Timer_A(void)

{

P1OUT^=BIT0; //P1.0取反

}

A/D

1、10位转换精度。

2、有多种时钟源可供选择,内带时钟发生器。

3、配有6个外部通道和2个内部通道。

4、内置参考电源,并且参考电压Vref有8种组合。

5、采样速度快,最快200Ks/s。

6、四种工作模式:

1、单通道单次转换模式:CONSEQ_0。

2、单通道多次转换模式:CONSEQ_2。

3、序列通道单次转换模式:CONSEQ_1 。

4、序列通道多次转换模式:CONSEQ_3。

A/D结构图:

例程:

void ADC_convert()

{

P1SEL&=0x20; //使能A/D通道A5;

ADC10CTL0 = ADC10SHT_1+ ADC10ON+SREF_1+REF2_5V+REFON+MSC; // 打开ADC10内核,确定采样周期为8*ADC10OSC/2,选择内部参考电压为2.5v;

ADC10CTL1 = INCH_5+ADC10DIV_1+CONSEQ_2; // input A5模拟信号输入选择通道A5即P1.5,设置为单通道多次转换模式,分频因子为2

ADC10AE0 |= BIT5; // 使P1.5允许AD模拟输入信号

ADC10CTL0|=ENC; //使能转换;

ADC10CTL0|=ADC10SC; //开始转换;

}

int Read_result()

{ int result;

result= ADC10MEM;

return (result);

}

PWM波

void PWM_Creat(int a,int b)

{

TACTL=TASSEL_2+TACLR+ID_3; //选择计数时钟为MCLK,并进行8分频,将计数器TAR清零

CCR0=65535; //计数终值,方波频率为:1048576/65536/8/2=1HZ CCTL1=OUTMOD_7;

CCR1=a; //占空比为:a/65536

CCTL2=OUTMOD_7;

CCR2=b; //占空比为:b/65536

P1DIR|=BIT2; //CCR1

P1SEL|=BIT2;

P1DIR|=BIT7; //CCR2

P1SEL|=BIT7;

TACTL|=MC_1; //选择Timer_A为增计数模式

}

Timer_A的基本特点:

1、输入时钟可以有多种选择。

2、产生的定时脉冲或PWM信号没有软件带来的误差。

3、四种计数功能。

4、8种输出方式。

5、16位定时器。

6、生成的PWM波能用软件任意改变占空比和周期,当PWM波不需要修改占空比和周期时,Timer_A能自动输出PWM,而不需要利用中断来维持PWM波的输出

Timer_A 定时器的下列四种事件均能产生中断:

(1)主计数器(TACCR0)计满后复位,TAIFG 标志被置1。中断发生在计数值从TACCR0

跳至0 时刻。

(2)捕获通道0 发生捕获事件,或让主计数器值TAR 计至TACCR0(计数值从TACCR0-1

跳至TACCR0 的时刻),TACCTL0 寄存器内的CCIFG 标志被置1。

(3)捕获通道1 发生捕获事件,或主计数值TAR 计至TACCR1(计数器从TACCR1-1 跳至TACCR0 的时刻),TACCTL1 寄存器内的CCIFG 标志被置1。

(4)捕获通道2 发生捕获事件,或主计数器TAR 计至TACCR2(计数值从TACCR2-1 跳至TACCR2 的时刻),TACCTL2 寄存器内的CCIFG 标志被置1。

这4 种事件占用了两个中断源,其中,事件2(计至TACCR2 或捕获通道0 发生捕获事件)独占一个中断源TIMERA0_VECTOR,其余 3 种事件共用另一个中断源TIMERA1_VECTOR。对于需要紧急处理的捕获事件建议使用通道0,因为它独占一个中断源,在终端内无需分之判断,反应最快。

#pragma vector=TIMER0_A0_VECTOR

__interrupt void ta0_isr(void)

{ ;;}

A: 1.TIMER0_A1_VECTOR

2.TIMER0_A0_VECTOR

B: 3.TIMER1_A1_VECTOR

4.TIMER1_A0_VECTOR

定时器的工作模式:

1、停止模式:用于定时器的暂停,并不发生复位,所有寄存器现行类容在停止模式结束后都可用。当定时器暂停后重新计数时,计数器将从暂停前的计数方向计数。

2、增计数模式:捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等时,定时器复位,并从0开始重新计数。

增计数模式:

void zengjishu()

{

TACTL=TASSEL1+TACLR; //选择计数时钟为ACLK,将计数器TAR清零

CCTL0=CCIE; //使能中断

CCR0=200; //计数终值,方波频率为:32768/200/2

TACTL|=MC_1; //选择Timer_A为增计数模式

P1DIR|=BIT0; //P1.0作为输出

_EINT(); //使能总中断

}

#pragma vertor =TIMERA0_VECTOR

__interrupt void Timer_A(void)

{

P1OUT^=0X01; //P1.0取反

}

连续计数模式:

特点:

定时器从0开始记到0XFFFF后又开始从0开始计数,当记到CCR0时产生中断(可产生多个定时信号)

例程:

void lianxujishu()

{

TACTL=TASSEL_1+TACLR; //选择计数时钟为ACLK,将计数器TAR清零

CCTL0=CCIE; //使能中断

CCR0=1000; //计数终值,方波频率为:32768/1000/2

TACTL|=MC_2; //选择Timer_A为连续计数模式

P1DIR|=BIT0; //P1.0作为输出

_EINT(); //使能总中断

}

#pragma vertor =TIMERA0_VECTOR

__interrupt void Timer_A(void)

{

P1OUT^=0X01; //P1.0取反

CCR0+=1000;

}

增/减计数模式:

需要对称波形的情况可以用增/减计数模式,该模式下,定时器先计数到CCR0的值,然后反向减计数到0。

注:

定时器TAR的值从CCR0—1增计数到CCR0时,中断标志CCIFG0置位,从1减计数到0时,中断标志TAIFG置位

定时器中断TAIFG时刻

看门狗定时器示例程序

例:使用看门狗定时器功能产生一个方波(周期的取反P1.0)。

#include

void main(void)

{

WDTCTL = WDT_MDLY_32; // 以SMCLK 进行32ms 的延迟

IE1 |= WDTIE; // 开WDT 中断

P1DIR |= BIT0; // 信号输出

_EINT(); // 总中断开

while(1)

{ _NOP(); }

}

// 看门狗中断服务子程序

#pragma vector = WDT_VECTOR

__interrupt void WDT_IRQ(void)

P1OUT ^= BIT0; // 对引脚取反

}

------------------------------------------------------------------------------------------------------------------

做定时器用:

WDTCTL = WDT_ADLY_1000; // 以ACLK 延迟1000ms

WDTCTL = WDT_MDLY_32; // 以SMCLK 延迟32ms

// 记得要开IE1 中的WDTIE 和_EINT();

做看门狗用:

WDTCTL = WDT_ARST_1000; // 以ACLK 设定1000ms 的看门狗

WDTCTL = WDT_MRST_32; // 以SMCLK 设定32ms 的看门狗

// 由于在看门狗的定义里面包含WDTCNCTL

// 所以需要喂狗的时候只需要再写一边WDTCTL = WDT_MRST_32; 就行了

例如,看门狗被设定为1s 定时复位,那么“喂狗”的代码是这样的:

WDTCTL =WDT_ARST_1000+WDTCNTCL; //除了喂狗,还得重新设定看门狗定时值注:“#define WDT_ARST_1000 (WDTPW+WDTCNT CL+WDTSSEL )”是将看门狗复位定时值设为1s 的宏定义组合

注:对WDTCTL 寄存器的操作,一定不能用“|=”赋值,否则必引发单片机复位。

---------------------------------------------------------------------------------------------------------------------

串口通信UART(msp430g2553)

#include "io430.h" #include "in430.h" #include "shumaguan.h" void UartPutchar(unsigned char c); unsigned char UartGetchar(); unsigned char temp=0; unsigned char number[2]={0}; void main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P1DIR|=BIT6; P1OUT&=~BIT6; P1SEL = BIT1 + BIT2; // P1.1为RXD, P1.2为TXD P1SEL2 = BIT1 + BIT2; // P1.1为RXD, P1.2为TXD UCA0CTL1 |= UCSSEL_2; // 选择时钟BRCLK UCA0BR0 = 106; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS2 + UCBRS0; // 波特率=BRCLK/(UBR+(M7+...0)/8) UCA0CTL1 &= ~UCSWRST; // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断 IE2 |= UCA0RXIE; // 使能接收中断 while(1) { //UartPutchar(9); display_int(temp,0); delay(); } } /**********************************UART接收中断********************************/ #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { //while (!(IFG2&UCA0TXIFG)); // 等待发送完成

MSP430串口通信讲解

串行通信接口是处理器与外界进行数据传输最常用的方式之一。顾名思义,串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。与并行通信相比,串行通信速度较慢,但占用更少的I/O 资源,只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。 串行通信可以分为同步通信和异步通信两种类型。如果带有同步时钟,则称为同步串行 通信,如常用的 SPI 和 I2C 接口就属于同步串行通信接口。如果没有同步时钟,依靠严格的时间间隔来传输每一比特,则称为异步串行通信。MSP430 系列单片机有两种串行通信接口,较早的 USART 模块和较新的 USCI 模块。 同步通信方式,是把许多字符组成一个信息组,这样,字符可以一个接一个地传输。但是,在每组信息(通常称为信息帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。同步方式下,发送方除了发送数据,还要传输同步时钟信号,信息传输的双方用同一个时钟信号确定传输过程中每1位的位置。 在异步通信方式中,两个数据字符之间的传输间隔是任意的,所以,每个数据字符的前后都要用一些数位来作为分隔位。

MSP430G2553单片机USCI模块原理图 串口通信所需配置: 1、时钟选择——以SMCLK时钟频率为1MHz为例。 ①选择SMCLK为串口通信频率。(P95页) ②设置SMCLK时钟频率为1MHz。 需要设置的寄存器:UCA0CTL1;(P95页)。

2、IO口定义为第二功能,即串口发送接收端口。 需要设置的寄存器:P1SEL|=BIT1+BIT2;,P1SEL2|=BIT1+BIT2;(中文P44页)。 2、数据传输格式

MSP430g2553串口通信

MSP430g2553串口通信 MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k 的FLASH 和512B 的RAM ,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。其引脚排布如图1.1所示。其功能表如表1.1所示。 串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。 一、UART 模式 在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。波特率的产生是在本地完成的。异步帧格式由1个起始 位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。一般最小帧为9个位,最大为13位。 图1.2 串行通讯模块内部结构图 图1.1 MSP430G2553引脚图

(一)UART的初始化 单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。所以配置串行通讯的第一步就是选择时钟。 通过选择时钟源和波特率寄存器的数据来确定位周期。所以波特率的配置是串行通讯中最重要的一部分。波特率设置用三个寄存器实现:UxBR0(选择控制器0):波特率发生器分频系数低8位。UxBR1(选择控制器1):波特率发生器分频系数高8位。UxMCTL 数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。 接收控制部分和发送控制部分。首先需要串行口进行配置、使能以及开启中断。串口接收数据一般采用中断方式,发送数据采用主动发送。当接收到一个完整的数据,产生一个信号:URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)才能进行发送。程序实例如下: Void UART_init() { WDTCTL = WDTPW + WDTHOLD; P1SEL|= 0x06;//I/O口的功能寄存器配置。为1时作为模块输出或者输出,0 为端口输入或者输出。配置P1.1,P1.2为串行口。 P2DIR=0x04;//串口发送端为输出,串口接收端为输入。0为输入,1为输出 U0CTL |= CHAR; // 配置控制寄存器,数据类型为8位。 U0TCTL |= SSEL0; // 选择时钟UCLK= ACLK。 U0BR0 = 0x45; // 分频系数的高8位,8MHz 时钟下波特率为115200 U0BR1 = 0x00; // 分频系数的低8位。 U0MCTL = 0x00; // 波特率的调整。 U0CTL&= ~SWRST;//系统复位。只有对SWRST 复位,USART 才能重新被允许。 而接收和发送允许标志URXE和UTXE不会因SWRST 而 更改。 ME1 |= UTXE0 + URXE0; //使能USART0 TXD/RXD模块USART中特有的使能配置。 IE1 |= URXIE0;//使能USART0 接收中断 _EINT();//开启全部中断。 _BIS_SR(LPM0_bits + GIE); // 初始化完毕,进入睡眠状态。等待工作。该程序直接调用。 } 发送数据函数: __interrupt void usart0_rx (void) { while (!(IFG1 & UTXIFG0)); // 判断发送缓冲区是否为空。 TXBUF0 = RXBUF0; // 将数据发送到串口。 }

MSP430单片机串口通信详解

MSP430单片机串口通信详解 #include"msp430G2553.h" #include "in430.h" void UartPutchar(unsigned char c); unsigned char UartGetchar(); unsigned char temp=0; unsigned char number[2]={0}; void main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P1DIR|=BIT6; P1OUT&=~BIT6; P1SEL = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD P1SEL2 = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD UCA0CTL1 |= UCSSEL_2; // 选择时钟BRCLK UCA0BR0 = 106; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS2 + UCBRS0; // 波特率

=BRCLK/(UBR+(M7+...0)/8) UCA0CTL1 &= ~UCSWRST; // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断 IE2 |= UCA0RXIE; // 使能接收中断 while(1) { //UartPutchar(9); // display_int(temp,0); __delay_cycles(10000); } } /**********************************UART接收中断*************************/ #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { //while (!(IFG2&UCA0TXIFG)); // 等待发送完成 //UCA0TXBUF = UCA0RXBUF; // TX ->; RXed character temp=UCA0RXBUF; }

msp430串行通讯

MSP430串行通讯 MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k 的FLASH 和512B 的RAM ,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。其引脚排布如图1.1所示。其功能表如表1.1所示。 串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。 一、UART 模式 在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。波特率的产生是在本地完成的。异步帧格式由1个起始 位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。一般最小帧为9个位,最大为13位。 图1.2 串行通讯模块内部结构图 图1.1 MSP430G2553引脚图

(一)UART的初始化 单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。所以配置串行通讯的第一步就是选择时钟。 通过选择时钟源和波特率寄存器的数据来确定位周期。所以波特率的配置是串行通讯中最重要的一部分。波特率设置用三个寄存器实现:UxBR0(选择控制器0):波特率发生器分频系数低8位。UxBR1(选择控制器1):波特率发生器分频系数高8位。UxMCTL 数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。 接收控制部分和发送控制部分。首先需要串行口进行配置、使能以及开启中断。串口接收数据一般采用中断方式,发送数据采用主动发送。当接收到一个完整的数据,产生一个信号:URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)才能进行发送。程序实例如下: Void UART_init() { WDTCTL = WDTPW + WDTHOLD; P1SEL|= 0x06;//I/O口的功能寄存器配置。为1时作为模块输出或者输出,0 为端口输入或者输出。配置P1.1,P1.2为串行口。 P2DIR=0x04;//串口发送端为输出,串口接收端为输入。0为输入,1为输出U0CTL |= CHAR; // 配置控制寄存器,数据类型为8位。 U0TCTL |= SSEL0; // 选择时钟UCLK= ACLK。 U0BR0 = 0x45; // 分频系数的高8位,8MHz 时钟下波特率为115200 U0BR1 = 0x00; // 分频系数的低8位。 U0MCTL = 0x00; // 波特率的调整。 U0CTL&= ~SWRST;//系统复位。只有对SWRST 复位,USART 才能重新被允许。 而接收和发送允许标志URXE和UTXE不会因SWRST 而 更改。 ME1 |= UTXE0 + URXE0; //使能USART0 TXD/RXD模块USART中特有的使能配置。 IE1 |= URXIE0;//使能USART0 接收中断 _EINT();//开启全部中断。 _BIS_SR(LPM0_bits + GIE); // 初始化完毕,进入睡眠状态。等待工作。该程序直接调用。 } 发送数据函数: __interrupt void usart0_rx (void) { while (!(IFG1 & UTXIFG0)); // 判断发送缓冲区是否为空。 TXBUF0 = RXBUF0; // 将数据发送到串口。 }

串行通信技术实验报告

串行通信技术实验报告 姓名学号实验班号实验机位号50 一、实验目的 1.了解异步串行通信原理 2.掌握MSP430异步串行通信模块及其编程方法 二、必做实验任务 1.了解MSP430G2553实验板USB转串口的通信功能,掌握串口助手的使用 拆下单片机的功能拓展板,将主板上的eZ430-FET板载仿真器的BRXD,BTXD收发信号端口连接,通过串口调试助手即可实现串口的自发自收功能。接线如下图: 思考:异步串行通信接口的收/发双方是怎样建立起通信的? 答:异步串行通信的收发双方进行通信,在硬件与软件方面都有要求。 ①在硬件方面需要两条线,分别从一方的发送端口到另一方的接收端口,从而实现“异步”; ②需要一个通信协议,确保通信正确;

③在这个实验中由于是自发自收,因此收发两方均为PC机,所以两条线其实是同一条线,而且由于是自发自收所以信号格式也是统一的,因此可以实现自发自收功能。 2.查询方式控制单片机通过板载USB转串口与PC机实现串行通信 本实验通过编程实现单片机和PC机之间的通信,信号格式为波特率9600bps,无校验,8位数据,先低后高,1个停止位,字符串以@结尾,单片机将接收到的字符保存在RAM 中,收到@字符之后再将所储存的字符发给PC机。 连线方式如下图: 实验程序如下: #include "io430.h" unsigned char string[]; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; void USCIA0_int() { UCA0CTL1|=UCSWRST; //swrst=1; //置P1.1、P1.2为USCI_A0的收发引脚 P1SEL|=BIT1+BIT2; P1SEL2|=BIT1+BIT2; //时钟SMCLK选择为1.0MHz if (CALBC1_1MHz!=0xff) {BCSCTL1=CALBC1_1MHZ; DCOCTL=CALDCO_1MHZ;} //设置控制寄存器 UCA0CTL1|=UCSSEL_2+UCRXEIE; //设置波特率寄存器,采用低频波特率方式 UCA0BR1=0; UCA0BR0=104; UCA0MCTL=UCBRS_1; UCA0CTL1&=~UCSWRST; //swrst=0 } While(1) { unsigned int j;

基于MSP430G2553的SPI串行协议

基于MSP430G2553的SPI串行协议 一、概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元(MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信. SPI 主要应用在EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间. 它在芯片中只占用四根管脚(Pin) 用来控制以及数据传输, 节约了芯片的pin 数目, 同时为PCB 在布局上节省了空间. 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了SPI技术.

二、特点 1. 采用主-从模式(Master-Slave) 的控制方式 SPI 规定了两个SPI 设备之间通信必须由主设备(Master) 来控制次设备(Slave). 一个Master 设备可以通过提供Clock 以及对Slave 设备进行片选(Slave Select) 来控制多个Slave 设备, SPI 协议还规定Slave 设备的Clock 由Master 设备通过SCK 管脚提供给Slave 设备, Slave 设备本身不能产生或控制Clock, 没有Clock 则Slave 设备不能正常工作. 2. 采用同步方式(Synchronous)传输数据 Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性(CPOL) 和时钟相位(CPHA) 控制着两个SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的. 3. 数据交换(Data Exchanges) SPI 设备间的数据传输之所以又被称为数据交换, 是因为SPI 协议规定一个SPI 设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)" 或者"接收者(Receiver)". 在每个Clock 周期内, SPI 设备都会发送并接收一个bit 大小的数据, 相 当于该设备有一个bit 大小的数据被交换了.

msp430g2553-串口调试测试程序-寡人-发送与接收

/****************************************************************************** 本程序是单片机MSP430G2553 P1.2----------------------------UCA0TXD 串口发送端 P1.1----------------------------UCA0RXD 串口接受端 P1.0----------------------------红灯指示 P1.6----------------------------绿灯指示 利用主辅时钟为1MHZ,串口波特率9600, 波特率:1000000/9600=104 UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 现象: 功能(1)看到P1.0---红灯指示;P1.6---绿灯指示循环闪烁。 同时电脑串口调试助手(设置波特率:9600,无校验,8位数据位,1位停止位) 不断显示,0x00,0x01,0x40,0x41。 功能(2)打开电脑串口调试助手,发送区有数据待发送时,在接受区将看到相应的数据。 ******************************************************************************/ #include "msp430g2553.h" #define uint unsigned int #define uchar unsigned char void Delay_us(uint us) // 延时us 前提是f=1MHZ(不建议用该延时,不是很精确) { uint i; for(i=0;i

msp430g2553串口终端实现标准化输出函数Printf函数

/ ******************************************************************** * Function : 该文件可用作模块儿化编程作为MSP430G2553的调试文件,该文* 件实现 * 了在串口终端实现标准化输出函数Printf函数。 * ********************************************************************/ #include #include #include #include "uart.h" / ******************************************************************** *静态函数声明 * ********************************************************************/ static void Vs_Printf(char *s,char *format,va_list arg); static void IntToString(int temp,char *pchar); / ******************************************************************** * 函数名: UartInit * 函数功能:初始化msp430g2553的USCI寄存器,使其工作在UART模式 * 形参:无 * 返回值:无 * ********************************************************************/ void UartInit() {

msp430g2553例程大全

MSPG2553 例程 1. //************************************************************************* ***** // LaunchPad Lab2 - Software Toggle P1.0, // // MSP430G2xx2 // ----------------- // /|\| XIN|- // | | | // --|RST XOUT|- // | | // | P1.0|-->LED // //************************************************************************* ***** #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If calibration constants erased, trap CPU!! } // Configure Basic Clock BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation BCSCTL3 |= LFXT1S_2; // Set LFXT1 P1DIR = BIT6; // P1.6 output (green LED) P1OUT = 0; // LED off IFG1 &= ~OFIFG; // Clear OSCFault flag

基于MSP430G2553的简易信号发生器(DOC)

基于MSP430G2553的简易信号发生器 浙江工业大学 摘要:本作品基于TI的LaunchPad设计了一款简易信号发生器,选用TI的MSP430G2553单片机。通过单片机加外围LCD12864、DAC0832及TL082放大电路,实现了可产生正弦波、锯齿波、三角波、方波的简易信号发生器,且频率可调。 关键词:MSP430G2553 DAC0832 正弦波锯齿波三角波 一、作品基本功能介绍

2 在信号产生和处理方面。通过MSP430G2553内部的TA 定时器,外加DAC0832产生四种波形,在DA 输出后,通过一个由运算放大器TL082和精密可调电位器组成的运算放大电路,以实现信号的增益控制。最后在 50负载电阻上输出电压。系统总体框图如图1.1所示。 图1.1 系统总体框图 3 人机交互方面。本作品使用三个独立按键来控制菜单选项,其功能如表1.2所表1.2 按键功能说明 二、系统硬件和软件说明 1 硬件构成 本作品使用LCD12864作为人机交互模块,由于MSP430G2553的I/O 口很少,所以通过对LCD 的进行串行数据输入,以节约I/O 口。其连接如图1.2所示。 +5V 图1.2 LCD12864硬件连接 由于是通过MSP430G2553输出数字量的信号来产生波形,因此需要用到

DA将数字量转换为模拟量。考虑到单片机的I/O口数量,选用8位的DA来进行数模转换。硬件如图1.3所示,DAC0832采用直通工作方式,节省I/O口控制引脚。 +5V P1.0-P1.3 P1.4-P1.7 +5V I OUT 图1.3 DAC0832 直通方式硬件连接 由DAC输出模拟量后,由于波形的幅值太小,因此还需要进行幅值的放大。其中R3是精密可调电位器,方便用户对信号的幅度进行调节。50Ω的电阻可以保证整个信号发生器的输出阻抗为50Ω。信号幅度调节和输出部分电路如图1.4所示。 图1.4 幅值放大的硬件电路 2 软件系统 整个系统的软件主要有主函数、定时器TA中断函数、按键中断函数三个大

MSP430G2串口通信

#include"msp430G2553.h" #include "in430.h" voidUartPutchar(unsigned char c); unsigned char UartGetchar(); unsigned char temp=0; unsigned char number[2]={0}; void main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P1DIR|=BIT6; P1OUT&=~BIT6; P1SEL = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD P1SEL2 = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD UCA0CTL1 |= UCSSEL_2; // 选择时钟BRCLK UCA0BR0 = 106; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS2 + UCBRS0; // 波特率 =BRCLK/(UBR+(M7+...0)/8) UCA0CTL1 &= ~UCSWRST; // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断 IE2 |= UCA0RXIE; // 使能接收中断 while(1) { //UartPutchar(9); // display_int(temp,0); __delay_cycles(10000); } } /**********************************UART接收中断*************************/ #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { //while (!(IFG2&UCA0TXIFG)); // 等待发送完成

相关文档