MSPEXP430Launchpad实验指南参考代码文档格式.docx
- 文档编号:16539942
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:133
- 大小:50.94KB
MSPEXP430Launchpad实验指南参考代码文档格式.docx
《MSPEXP430Launchpad实验指南参考代码文档格式.docx》由会员分享,可在线阅读,更多相关《MSPEXP430Launchpad实验指南参考代码文档格式.docx(133页珍藏版)》请在冰豆网上搜索。
D:
0x1000--0x003F
C:
0x1040--0x107F
B:
0x1080--0x10BF
A:
0x10C0--0x10FF
****************************************************/
#defineuintunsignedint
#defineucharunsignedchar
#defineSegA0x010C0
#defineSegB0x01080
#defineSegC0x01040
#defineSegD0x01000
#defineSegSize64
/********************Flash初始化********************/
voidFlashInit()
{
FCTL2=FWKEY+FSSEL_2+FN1;
//选择SMLCK作为时钟源,二分频
}
/********************Flash检测忙********************/
voidFlashCheckBusy()
while(BUSY==(FCTL3&
BUSY));
//检测是否忙
/********************Flash段擦除*******************/
voidFlashErase(intSegX)
_DINT();
//关闭总中断
FlashCheckBusy();
//检测Flash是否处于忙状态
FCTL3=FWKEY;
//lock=0开锁
FCTL1=FWKEY+ERASE;
//使能段擦除
*((int*)SegX)=0x00;
//段擦除--空写
FCTL3=FWKEY|LOCK;
//上锁
return;
/********************Flash写字节********************/
voidFlashWriteChar(uintaddr,charwdata)
FCTL1=FWKEY+WRT;
//写使能
*((uchar*)addr)=wdata;
//将wdata存入addr变量地址中
FCTL1=FWKEY;
//写关闭
FCTL3=FWKEY+LOCK;
//上锁
/********************Flash读字节********************/
charFlashReadChar(uintaddr)
charrdata;
rdata=*(char*)addr;
//读取addr所指地址的值
returnrdata;
/********************Flash写字********************/
voidFlashWriteWord(uintaddr,uintwdata)
//检测忙,若忙,则等待
*((uint*)addr)=wdata;
//向地址addr处写入wdata
/********************Flash读字********************/
uintFlashReadWord(uintaddr)
uintrdata;
rdata=*(uint*)addr;
//读取变量addr地址的值
/********************Flash修改字节********************/
voidFlashModifyChar(uintSegX,charAddrNum,charwdata)
chari,TempArry[SegSize];
for(i=0;
i<
SegSize;
i++)//读入内存
{
TempArry[i]=*(uint*)(SegX+i);
}
TempArry[AddrNum]=wdata;
//在数组中的某一位置AddrNum写入wdata
FlashErase(SegX);
//段擦除
//准备写
i++)//向段中重新写数组
*(uint*)(SegX+i)=TempArry[i];
/********************Flash批量写********************/
voidFlashBurstWrite(intSegX,int*pStr)
inti;
//lock=0,开锁
2*sizeof(pStr);
i++)//将数组内容写入段中
*(uchar*)(SegX+i)=*(pStr+i);
main()
charReadChar;
uintReadWord;
intp[]={'
a'
'
b'
c'
d'
};
WDTCTL=WDTPW+WDTHOLD;
//关闭看门狗
P1DIR=0xff;
//P1口设为输出,闲置的I/O不悬空
P2DIR=0xff;
//P2口设为输出,闲置的I/O不悬空
P1OUT=0xff;
//P1口输出1
P2OUT=0xff;
//P2口输出1
FlashInit();
//Flash初始化
FlashErase(SegD);
FlashWriteChar(0x01007,0x12);
//向地址01008h写入12h
ReadChar=FlashReadChar(0x01007);
//读取地址01008h的值
FlashWriteWord(0x01008,0x3456);
//向地址01009h和0100Ah依次写入56h和
34h
ReadWord=FlashReadWord(0x01008);
//读取从地址01009h起的一个字
FlashWriteChar(0x01017,ReadChar);
//向地址01018h写入12h
FlashWriteWord(0x01018,ReadWord);
//向地址01019h和0101Ah依次写入56h和
34h
FlashBurstWrite(SegC,p);
//向SegD段从地址0110h依次写入a、b、c、
d
FlashModifyChar(SegB,0x02,0xef);
//将地址0112h和0113h内容改为e和f
_BIS_SR(CPUOFF);
//关闭CPU
3.6
1.USCI模块串行异步通信例程
以MSP430G2553的USCI模块串行异步通信操作为例,介绍串口寄存器配置及收发程序处理过程。
(1)初始化串口
voidUART_init(void)
UCA0CTL1|=UCSWRST;
UCA0CTL1|=UCSSEL_2;
//SMCLK
UCA0BR0=0x68;
//32.768/9600=
UCA0BR1=0x00;
//1000kHz/9600=104.166=0X68波特率9600
UCA0MCTL=UCBRS_2;
//ModulationUCBRSx=1
UCA0CTL0&
=~UCPEN;
=~UCSPB;
=~UC7BIT;
UCA0CTL1&
=~UCSWRST;
P1SEL|=BIT1+BIT2;
P1SEL2|=BIT1+BIT2;
//P1DIR|=BIT2;
第二功能无需配置?
?
IE2|=UCA0RXIE+UCA0TXIE;
unsignedintj;
for(j=0;
j<
2000;
j++);
}
(2)串口发送函数
/****************************************************************
宏定义
****************************************************************/
unsignedcharRX_BUFF[RXBUF_SIZE]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//接收缓冲区
unsignedintUART_InLen=16;
//输入数据长度
unsignedintRX_IndexR=0;
//接收FIFO的读指针
unsignedintRX_IndexW=0;
//接收FIFO的写指针
unsignedcharTX_BUFF[TXBUF_SIZE]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//发送缓冲区
unsignedintUART_OutLen=16;
//发送FIFO内待发送的字节数
unsignedintTX_IndexR=0;
//发送FIFO的读指针
unsignedintTX_IndexW=0;
//发送FIFO的写指针
uint8ch=0;
串口发送一字节函数,查询方式
voidUART_sent(uint8Chr)
IFG2&
=~UCA0TXIFG;
UCA0TXBUF=Chr;
while((IFG2&
UCA0TXIFG)==0);
//USCI_A0TXbufferready?
串口发送一帧数据函数,中断方式
charUART0_PutFrame(unsignedchar*Ptr,unsignedintLenth)
if(IE2&
UCA0TXIE)
return(0);
if(Lenth>
TXBUF_SIZE)
Lenth;
i++)
delay_us(100);
TX_BUFF[i]=Ptr[i];
TX_IndexR=0;
UART_OutLen=Lenth;
IFG2|=UCA0TXIFG;
IE2|=UCA0TXIE;
return
(1);
/*****************************************************************
*名称:
USCIxTX_ISR()
*功能:
串口发送中断,每发完1字节会发生一次中断
*****************************************************************/
#pragmavector=USCIAB0TX_VECTOR
__interruptvoidUSCI0TX_ISR(void)
if(UART_OutLen>
0)
UART_OutLen--;
UCA0TXBUF=TX_BUFF[TX_IndexR];
while(!
(IFG2&
UCA0TXIFG));
//查看上一字节是否发送完毕
if(++TX_IndexR>
=TXBUF_SIZE)
{
TX_IndexR=0;
}
elseIE2&
=~UCA0TXIE;
(3)串口接收函数
串口接收一字节函数,查询方式,此处虽定义但并未使用,不保证其正确性
uint8UART_receive(void)
{
UCA0RXIFG)==0);
//收到一字节?
=~UCA0RXIFG;
return(UCA0RXBUF);
#pragmavector=USCIAB0RX_VECTOR
__interruptvoidUSCI0RX_ISR(void)
UART_InLen++;
RX_BUFF[RX_IndexW]=UCA0RXBUF;
//保存在缓冲区中
if(++RX_IndexW>
=RXBUF_SIZE)
RX_IndexW=0;
2.USART模块异步串行通信操作例程
初始化串口0,允许接收和发送,允许接收中断,禁止发送中断,8bit字符发送
时钟ACLK=32.768KHz,波特率4800
注意:
对串口寄存器操作的时候务必保证SWRST=1,设置完成后SWRST=0。
//串口初始化函数
voidInitUSART(void)
U0CTL|=CHAR;
//8bit字符
U0TCTL|=SSEL0;
//ACLK
U0BR1=0x00//4800波特率
U0BR0=0x06
U0MCTL=0x6f
U0CTL&
=~SWRST;
//设置完成
ME1|=UTXE0+URXE0;
//接收发送允许
IE1|=URXIE0;
//接收发送中断
P3SEL|=(0x80+0x40);
//引脚切换到特殊功能上
_EINT();
//不要忘了开中断
采用软件查询式发送,将1个字节写入发送寄存器,然后等待发送完成的标志。
本方法适合波特率较高的场合(大于4800)
//所涉及的全局变量
unsignedcharTBuff[8];
//发送缓冲区
unsignedcharRBuff[8];
//接收缓冲区
unsignedcharFlag_Receive=0;
//标志:
接收到有效数据
//串口发送函数(不需要开发送中断)发送一个数组(共8个字节)
voidUSART_Send(unsignedchar*pData)
unsignedchari;
i<
8;
i++)
TXBUF0=pData[i];
//装入发送寄存器
while((IFG1&
UTXIFG0)==0);
//判断:
发送是否完成
IFG1&
=~(UTXIFG0);
在RAM开辟接收缓冲区,等到接收的数据组满足要求或者为一帧数据时才处理。
中断中接收。
//串口接收函数(需要开接受中断)
#pragmavector=UART0RX_VECTOR
__interruptvoidUSART0_RXIRQ(void)
unsignedcharTemp;
//暂存接收数据
Temp=RXBUF0;
//8字节接收缓冲队列
RBuff[0]=RBuff[1];
RBuff[1]=RBuff[2];
RBuff[2]=RBuff[3];
RBuff[3]=RBuff[4];
RBuff[4]=RBuff[5];
RBuff[5]=RBuff[6];
RBuff[6]=RBuff[7];
RBuff[7]=Temp;
//判断数据有效(有效则设置标志位,等待处理)
if(RBuff[0]==0xd0){Flag_Receive=1;
}else{Flag_Receive=0;
(4)串口校验CRC16函数
常用函数,使用的CRCKey=0xA001
输入一个数组和长度,则计算出该部分的CRC值。
//CRC-16循环冗余效验函数
unsignedintCaculate_CRC16(unsignedchar*DAT,unsignedcharLenth)
//*DAT指向要计算CRC的数组,Lenth为数据的有效长度
unsignedintCRC=0xffff;
//CRC的初始值为FFFF
unsignedcharj;
CRC=CRC^DAT[i];
//和当前字节异或一次
j<
j++)//循环8次
if(CRC&
0x01)//判断最低位,如果为1
CRC=CRC>
>
1;
//右移一位
CRC=CRC^0xA001;
//和多相式异或
else//判断最低位,如果为0
return(CRC);
第五章
5.1.1
程序示例
#include<
msp430g2553.h>
typedefunsignedcharuchar;
typedefunsignedintuint;
/***************全局变量***************/
ucharkey_Pressed;
//按键是否被按下:
1--是,0--否
ucharkey_val;
//存放键值
ucharkey_Flag;
//按键是否已放开:
//设置键盘逻辑键值与程序计算键值的映射
ucharkey_Map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
/*******************************************
函数名称:
Init_Keypad
功能:
初始化扫描键盘的IO端口
参数:
无
返回值:
********************************************/
voidInit_Keypad(void)
P1DIR=0xf0;
//P1.0~P1.3设置为输入状态,P1.4~P1.7设置为输出状态
P1OUT|=0xf0;
//P1.4~P1.7输出高电平
key_Flag=0;
key_Pressed=0;
key_val=0;
/*********************************************
*Check_Key(),检查按键,确认键值
*********************************************/
Check_Key
扫描键盘的IO端口,获得键值
voidCheck_Key(void)
ucharrow,col,tmp1,tmp2;
tmp1=0x80;
for(row=0;
row<
4;
row++)//行扫描
P1OUT=0xf0;
//P1.4~P1.7输出全1
P1OUT-=tmp1;
//P1.4~p1.7输出四位中有一个为0
tmp1>
=1;
if((P1IN&
0x0f)<
0x0f)//是否P1IN的P1.0~P1.3中有一位为0
tmp2=0x01;
//tmp2用于检测出那一位为0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSPEXP430Launchpad 实验 指南 参考 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)