430上机实验.docx
《430上机实验.docx》由会员分享,可在线阅读,更多相关《430上机实验.docx(61页珍藏版)》请在冰豆网上搜索。
430上机实验
//例1:
利用定时器A溢出中断实现定时。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在连续计数模式,在P3.1端口输出频率为6Hz的方波
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
TACTL=TASSEL_2+TACLR+MC_2+TAIE;
//定时器A时钟源为SMCLK,计数器清零,连续计数模式,溢出中断允许。
P3DIR=0x02;//P3.1端口设置为输出
_EINT();
for(;;)
{
_BIS_SR(CPUOFF);
_NOP();
}
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTIMER_A(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
P3OUT^=0x02;//定时器A溢出,P3.1取反
break;
}
}
例2:
定时器A增计数模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在增计数模式,利用CCR0中断在P3.1端口输出20Hz的方波。
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1设置为输出
CCTL0=CCIE;//CCR0中断允许
CCR0=20000;
TACTL=TASSEL_2+TACLR+MC_1;//定时器A时钟源为SMCLK,计数器清零,增计数模式
_BIS_SR(LPM0_bits+GIE);//EnterLPM0w/interrupt
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P3OUT^=0x02;//P3.1取反
}
例3:
定时器A连续计数模式举例。
ACLK=32kHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在连续计数模式,利用CCR0中断在P3.1端口输出10Hz的方波,同时利用定时器A溢出中断在P3.2端口输出6Hz的方波。
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1、P3.2设置为输出。
CCTL0=CCIE;//CCR0中断允许
CCR0=20000;
TACTL=TASSEL_2+TACLR+MC_2+TAIE;
//定时器A时钟源为SMCLK,计数器清零,连续计数模式,溢出中断允许。
_BIS_SR(LPM0_bits+GIE);
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P3OUT^=0x02;//P3.1取反
CCR0+=20000;//CCR0置入计数值
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A1(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
P3OUT^=0x04;//P3.2取反
break;
}
}
例4:
定时器A增减计数模式举例。
ACLK=32kHZ,MCLK=SMCLK=DCOCLK=800k,定时器A工作在增减计数模式,
利用CCR0中断在P3.1端口输出20Hz的方波,同时利用定时器A溢出中断在P3.2端口输出40Hz的方波
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3DIR|=0x06;//P3.1、P3.2设置为输出。
CCTL0=CCIE;//CCR0中断允许
CCR0=20000;
TACTL=TASSEL_2+TACLR+MC_3+TAIE;
//定时器A时钟源为SMCLK,计数器清零,增减计数模式,溢出中断允许。
_BIS_SR(LPM0_bits+GIE);
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P3OUT^=0x02;//P3.1取反
P3OUT^=0X04;
}
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A(void)
{
switch(TAIV)
{
case2:
break;
case4:
break;
case10:
P3OUT^=0x04;//P3.2取反
break;
}
}
例5:
捕获/比较模块之捕获模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,经8分频后作为定时器A的时钟源,定时器A工作在连续计数模式。
由软件循环产生方波信号,信号同时接入P1.1(CCI0A)和P1.2(CCI1A),由CCR1获取信号周期,CCR0确定信号占空比
#include
unsignedintlastCCR0,lastCCR1
unsignedintj;//测得信号周期为j*(1/100K)
unsignedintk;//测得信号占空比为:
k/j
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
TACTL=TASSEL_2+ID_3+MC_2+TACLR;//MCLK,8分频,连续模式,计数器清空
CCTL0=CM_3+CCIS_0+SCS+CAP+CCIE;//上升沿和下降沿均捕获,异步捕获,捕获模式,捕获中断允许
CCTL1=CM_1+CCIS_1+SCS+CAP+CCIE;//上升沿,异步,捕获,捕获中断允许
j=0;
k=0;
lastCCR0=0;
lastCCR1=0;
P1DIR=0x00;
P1SEL=0xff;
P3DIR=0xFF;
P3OUT=0x00;
_EINT();
for(;;)
{
for(i=0;i<10000;i++)
_NOP();
P3OUT^=0x02;//产生捕获信号源
}
}
#pragmavector=TIMERA1_VECTOR//定时器中断捕获
__interruptvoidTIMER_A(void)
{
switch(TAIV)
{
case2:
P3OUT^=0x04;
j=CCR1-lastCCR1;//两次上升沿间隔
lastCCR1=CCR1;
break;
case4:
break;
case10:
break;
}
}
#pragmavector=TIMERA0_VECTOR//CCR0捕获产生中断
__interruptvoidTIMER_cc(void)
{
//如果输入信号为低电平,则表明是下降沿产生的捕获,前一次捕获的是上升沿,这一次捕获和上一次捕获之差即为高电平的时间。
if(SCCI0==0)
{
k=CCR0-lastCCR0;//上下升沿间隔
lastCCR0=CCR0;
}
}
例6:
捕获/比较模块之比较模式举例。
ACLK=32KHZ,MCLK=SMCLK=DCOCLK=800k,经8分频后作为定时器A的时钟源。
由捕获/比较模块0产生10Hz的方波并由P3.3输出,由捕获/比较模块1输出20Hz的方波并由P3.2输出
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
TACTL=TASSEL_2+ID_3+MC_2+TACLR;
//MCLK,8分频,连续模式,计数器清零CCTL0=CCIE;//比较器模式
CCTL1=CCIE;//比较器模式
CCR0=5000;
CCR1=10000;
P3DIR=0xFF;
P3OUT=0x00;
_EINT();
for(;;);
}
#pragmavector=TIMERA1_VECTOR//定时器比较器中断CCR1=TAR
__interruptvoidTIMER_A(void)
{
switch(TAIV)
{
case2:
P3OUT^=0x04;//P3.2
CCR1+=10000;//改变比较条件
break;
case4:
break;
case10:
P3OUT^=0x02;//P3.1
break;
}
}
#pragmavector=TIMERA0_VECTOR//当TAR=CCR0产生中断
__interruptvoidTIMER_cc(void)
{
P3OUT^=0x08;//P3.34.9Hz
CCR0+=20000;//改变比较条件
}
例7:
定时器A输出单元实验。
ACLK=TACLK=LFXT1=32768,利用Timer_A输出周期为512/32768=15.625ms、占空比分别为75%和25%的PWM矩形波
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
TACTL=TASSEL0+TACLR;//ACLK,清除TAR
CCTL0=0x00;//默认值,比较器模式
CCTL1=0x00;//默认值,比较器模式
CCR0=512-1;//PWM周期
CCTL1=OUTMOD_7;
CCR1=384;//占空比384/512=0.75
CCTL2=OUTMOD_7;
CCR2=128;//占空比128/512=0.25
P1DIR|=0x04;//P1.2输出
P1SEL|=0x04;//P1.2TA1out
P2DIR|=0x01;//P2.0输出?
?
P2SEL|=0x01;//P2.0TA2out
TACTL|=MC0;//Timer_A增计数模式
for(;;)
{
_BIS_SR(LPM0_bits);//进入LPM0
_NOP();
}
}
例:
FLASH模块操作举例?
信息段A、B的擦除和写入操作。
先将内存中double型数组的数据和int型数据保存到信息段A中,在将其从信息段A拷贝到信息段B中
#include
doubledata[8];
intadd;
voidwrite_SegA(void);
voidcopy_A2B(void);
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
FCTL2=FWKEY+FSSEL0+FN0;//初始化时钟
for(inti=0;i<8;i++)//初始化double型数组数据
{
data[i]=i;
}
add=8;//初始化unsignedint型数据
for(;;);
}
voidwrite_SegA(void)
{
double*Flash_data_ptr;//double型Flash指针
unsignedint*Flash_int_ptr;//unsigned型Flash指针
unsignedinti;
Flash_data_ptr=(double*)0x1080;
FCTL1=FWKEY+ERASE;//允许擦除
FCTL3=FWKEY;//解锁
*Flash_data_ptr=0;//空写,启动擦除
FCTL1=FWKEY+WRT;//允许写
for(i=0;i<8;i++);
*Flash_data_ptr++=data[i];
Flash_int_ptr=(unsignedint*)Flash_data_ptr;
*Flash_int_ptr=add;//写入unsignedint型指针
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;//锁定
}
voidCopy_A2B(void)
{
double*Flash_data_ptrA,*Flash_data_ptrB;
unsignedint*Flash_int_ptrA,*Flash_int_ptrB,i;
Flash_data_ptrA=(double*)0x1080;
Flash_data_ptrB=(double*)0x1000;
FCTL1=FWKEY+ERASE;//允许擦除
FCTL3=FWKEY;//解锁
*Flash_data_ptrB=0;//空写,启动擦除
FCTL1=FWKEY+WRT;//允许写
for(i=0;i<8;i++)
*Flash_data_ptrB++=*Flash_data_ptrA++;
Flash_int_ptrA=(unsignedint*)Flash_data_ptrA;
Flash_int_ptrB=(unsignedint*)Flash_data_ptrB;
*Flash_int_ptrB=*Flash_int_ptrA;
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;//锁定
}
例1MSP430F149串口0实验,
实现在接收中断中将收到的字符发送出去,USART模块时钟源为32768Hz的低频时钟ACLK,波特率为2400,8位数据位
#include
voidmain(void)
{
volatileunsignedinti;
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3SEL|=0x30;//P3.4,5=USART0TXD/RXD
ME1|=UTXE0+URXE0;//使能USART0TXD/RXD
UCTL0|=CHAR;//8位数据位
UTCTL0|=SSEL0;//UCLK=ACLK
UBR00=0x0D;//32k/2400-13.65
UBR10=0x00;//
UMCTL0=0x6B;//波特率调整
UCTL0&=~SWRST;//初始化USART状态
IE1|=URXIE0;//使能USART0RX中断
_BIS_SR(LPM0_bits+GIE);//进入低功耗模式,开中断
}
#pragmavector=UART0RX_VECTOR//无法进入中断?
?
?
?
__interruptvoidusart0_rx(void)
{
while(!
(IFG1&UTXIFG0));//检测USART0接收缓存是否准备好
TXBUF0=RXBUF0;//RXBUF0→TXBUF0
}
例2MSP430F149串口0实现双向串口通信,
在接收中断接收一个长度为8的字符串,在整个字符串接收完成之后再将其通过串口发送出去。
UCLK0为1M的ACLK,波特率为9600,8位数据位。
#include
staticcharstring1[8];
chari,j=0;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P3SEL=0x30;//P3.3,4=USART0TXD/RXD
ME1|=UTXE0+URXE0;//使能USART0TXD/RXD
UCTL0|=CHAR;//8位数据位,SWRST=1
UTCTL0|=SSEL0;//UCLK=ACLK
UBR00=0x03;//9600from1Mhz
UBR10=0x00;//
UMCTL0=0x4A;//波特率调整
UCTL0&=~SWRST;//初始化USART状态
IE1|=URXIE0+UTXIE0;//使能USART0RX/TX中断
IFG1&=~UTXIFG0;//清除POR造成的UTXIFG0置位
_BIS_SR(LPM0_bits+GIE);//进入低功耗模式,开中断
}
//UART0TXISR
#pragmavector=UART0TX_VECTOR
__interruptvoidusart0_tx(void)
{
if(iTXBUF0=string1[i++];
}
//UART0RXISR
#pragmavector=UART0RX_VECTOR
__interruptvoidusart0_rx(void)
{
string1[j++]=RXBUF0;
if(j>sizeof(string1)-1)
{
i=0;
j=0;
TXBUF0=string1[i++];
}
}
例1利用比较器A的中断,
实现当输入P2.3的电压高于0.5Vcc时,使P1.2置位,当P2.3的电压低于0.5Vcc时,使P1.2复位。
#include"MSP430x14x.h"
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看门狗
P2SEL|=0x08;//P2.3设置为比较器输入CA1
P1DIR|=0x04;//P1.2设置为输出
P1OUT&=~0x04;//P1.2输出低电平
CACTL1=CARSEL+CAEX+CAREF1+CAON;//0.5Vcc加到正端,打开比较器
CACTL2=P2CA1;//P2.3加到比较器负端。
while
(1)
{
if((CAOUT&CACTL2)<>CAOUT)//检查比较器输出,若为0则P1.2输出高
P1OUT|=0x40;//电平,否则输出低电平
else
P1OUT&=~0x80;
}
}
MSP430intrinscis.h
/**************************************************/
#ifndef__INTRINSICS_H
#define__INTRINSICS_H
#ifndef_SYSTEM_BUILD
#pragmasystem_include
#endif
#pragmalanguage=save
#pragmalanguage=extended
/*
*Thereturnvalueof"__get_interrupt_state".
*/
typedefunsignedshortistate_t;
#ifdef__cplusplus
extern"C"
{
#endif
__intrinsicvoid__no_operation(void);
__intrinsicvoid__enable_interrupt(void);
__intrinsicvoid__disable_interrupt(void);
__intrinsicistate_t__get_interrupt_state(void);
__intrinsicvoid__set_interrupt_state(istate_t);
__intrinsicvoid__op_code(unsignedshort);
__intrinsicunsignedshort__swap_bytes(unsignedshort);
__intrinsicvoid__bic_SR_register(unsignedshort);
__intrinsicvoid__bis_SR_register(unsignedshort);
__intrinsicunsignedshort__get_SR_register(void);
__intrinsicvoid__bic_SR_register_on_exit(unsignedshort);
__intrinsicvoid__bis_SR_register_on_exit(unsignedshort);
__intrinsicunsignedshort__get_SR_register_on_exit(void);
__intrinsicunsignedshort__bcd_add_short(unsignedshort,
unsignedshort);
__intrinsicunsignedlong__bcd_add_long(unsignedlong,
unsignedlong);
__intrinsicunsignedlonglong__bcd_add_long_long(unsignedlonglong,
unsignedlonglong);
/*
*Supportforefficientswitch:
es.E.g.switch(__even_in_range(x,10))
*
*Notethatthevaluemustbeevenandintherangefrom0to
*__bound,inclusive.Nocodewillbegenerated