学习总结Word格式.docx
- 文档编号:21105283
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:29
- 大小:460.79KB
学习总结Word格式.docx
《学习总结Word格式.docx》由会员分享,可在线阅读,更多相关《学习总结Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
)
{
P1OUT|=0x02;
P1OUT&
=~0x02;
}
}
2.MSP430F149看门狗定时器
WDT定时器有二种工作模式:
看门狗模式和内部定时器模式
二种模式下定时到时都会产生中断。
与WDT操作有关的寄存器为:
WDTCTL、IE1、IFG1
WDTCTL为16位寄存器,高字节为口令字05AH,低字节如下图:
WDTHOLD控制定时器是否工作。
WDTNMIES选择非屏蔽中断触发沿
WDTNMI设置RST/NMI的引脚的功能,复位或中断功能
WDTTMSEL选择工作模式
WDTCNTCL是否清零WDT计数器
WDTSSEL选择WDT的时钟信号
WDTISx设置定时长度。
IE1中有NMIIE和WDTIE指示是否允许WDT中断
IFG1中有NMIIFG和WDTIFG指不是否有NMI中断和WDT中断
程序:
使用看门狗定时器产生一个方波
#include<
WDT=WDT_MDLY_32;
IE1|=WDTIE;
P1DIR|=0x01;
_EINT();
While
(1)
{
_BIS_SR(CPUOFF);
_NOP();
}
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog(void)
P1OUT^=0x01;
3.MSP430F149的IO端口
1.MSP430149有6个8位的IO端口,每个端口都有第二功能。
P1和P2端口还有中断功能。
2.每个端口都有PxIN、PxOUT、PxDIR和PxSEL寄存器。
P1和P2还有与中断有关的寄存器PxIFG、PxIES、PxIE寄存器。
PxIN只读。
PxDIR为方向寄存器。
PxSEL为功能选择寄存器。
IO端口操作:
Voidmain(void)
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0x01;
//P1.0输出
P1OUT|=BIT0;
//P1.0输出”1”;
IO中断操作
P3DIR=0x01;
P1IES=0x01;
//下降沿触发
P1IE=0x01;
//P1.0中断允许
_EINT;
While
(1);
#pragmavect=PORT1_VECTOR
P3OUT^=0x01;
4.定时器A
写时器A的时钟信号可以是ACLK、SMCLK或者是处部时钟信号TACLK和TAINCLK
定时器A为具有捕获与比较功能的16位定时器。
定时器的工作模式有4种:
停止模式、增计数模式、连续计数模式、增/减模式
与定时器A相关的寄存器有TACTL、TAR、TACCTL0、TACCR0、TACCTL1、TACCR1、TACCTL2、TACCR2、TAIV
TACTL寄存器如下:
TASSELx用于选择时钟信号,IDx用于选择分频比,MCx选择工作模式,TACLR用于清零计数器,TAIE用于控制是否允许定时器中断。
TAIV用于保存中断向量。
在不使用定时器的比较/捕获功能时只用到TACTL、TAR和TAIV寄存器。
在要使用定时器的比较/捕获功能时就要用到另外的二个寄存器了。
TACCTLx和TACCRx。
TACCTx如下:
CMx用于触发沿选择,CCISx用于选择输入,SCS指示是否同与定时器的时钟信号同步,CAP用于选择是比较还是捕获,OUTTMODx用于选择输出模式,CCIE是否允许中断。
CCI用于读输入信号,OUT比较输出控制。
程序:
1.定时器的一般功能使用
TACTL=TASSEL_1+MC_2+TAIE;
//使用ACLK时钟信号,连续计数模式,允许中断
_BIS_SR(LPM3_bits+GIE);
#pragmavector=TIMERA1_VECTOR
__interruptvoidTimer_A(void)
Switch(TAIV)
Case2:
break;
Case4:
Case10:
P1OUT^=0x01;
2.用定时器产生PWM波形
P1DIR|=0x0C;
P1SEL|=0x0C;
CCR0=512-1;
CCTL1=OUTMOD_7;
CCR1=284;
CCTL2=OUTMOD_7;
CCR2=128;
TACTL=TASSEL_1+MC_1;
_BIS_SR(LMP3_bits);
5.USART的SPI模式
首先SPI有主机模式和从机模式之分,在MSP430F149中SPI还有三引脚与四引脚之分。
三引脚与四引脚的区别为STE引脚。
在从机模式时,当使用4引脚时允许在单个SPI总线上有多个主机。
使用3引脚时,STE引脚不用。
4引脚主机模式时:
STE=1SIMO和UCLK操作正常,STE=0时SIMO和UCLK设计为输入。
4引脚从机模式时:
STE=1;
收发不允许SOMI强制为输入,STE=0时,收发允许SOMI正常。
与USART有关的寄存器有:
UxCTL、UxTCTL、UxRCTL、UxMCTL、UxBR0、UxBR1、UxRXBUF、UxTXBUF、MEx、IEx、IFGx。
UxCTL寄存器USART控制寄存器,UxTCTL发送控制寄存器,UxRCTL接收控制寄存器,UxMCTL模式控制寄存器,SPI时未用。
voidmain(void)
P3DIR=0xff;
U0CTL=CHAR+SYNC+MM+SWRST;
U0TCTL=SSEL0+STC;
ME1|=USPIE0;
ME2|=USPIE0;
U0CTL&
=(~SWRST);
IE1=UTXIE0+URXIE0;
IE2|=(UTXIE0+URXIE0);
_BIS_SR(LPM0_bits+GIE);
#pragmavector=USART0TX_VECTOR
__interruptvoidspi_tx(void)
P4OUT=~P4OUT;
#pragmavector=USART0RX_VECTOR
__interruptvoidspi_rx(void)
U0TXBUF=U0RXBUF;
P3OUT=U0RXBUF;
6.ADC12
时钟信号可以为ACLK、MCLK、SMCLK和ADC12OSC。
ADC12OSC必须在5M以内。
ADC12有8个外部输入和4个内部输入。
ADC12的参考电压可以为内部或外部。
内部电压参考1.5和2.5可选。
外部电压通过VeREF+和VREF-/VeREF-提供。
ADC12有二种采样方式ExtendedSampleMode和PulseSampleMode。
ADC12的转换方式有单通道单次转换,顺序通道单次转换,单通道多次转换,顺序通道多次转换。
与ADC12有关的寄存器:
ADC12CTL0、ADC12CTL1、ADC12IFG、ADC12IE、ADC12IV、ADC12MEM0-15、ADC12MCTL0-15。
程序示例:
//*****************************************************************************
//SingleChannelRptMode,TA1asSampleTrigger
//
//Description:
SampleandconvertA0usingTimer_Aassampletriggerin
//PulseSamplemode.Put"
Num_of_Results"
ADC12MEM0valuesinresults[]
//andLightLED(P1.0)whendone.
//MSP430F149
//---------------
//||
//Vin-->
|P6.0/A0|
#include<
#defineNum_of_Results512
intresults[Num_of_Results]={0};
voidADC_Init(void);
WDTCTL=WDTPW|WDTHOLD;
//DisabletheWatchdog.
ADC_Init();
//InitializeADC12
ADC12CTL0|=ENC;
//Startconversion
_BIS_SR(LPM0_bits);
//EnterLPM0
voidADC_Init(void)
P1DIR=0xff;
//setporttooutputs
P1OUT=0;
//resetportoutputs
P6SEL|=0x01;
//selectA0input
ADC12CTL0=ADC12ON+SHT0_1+REF2_5V+REFON;
//SetupADC12
ADC12CTL1=SHP+CONSEQ_2+SHS_1;
//Timertriggerssampling
ADC12MCTL0=INCH_0+SREF_1;
ADC12IE=0x0001;
//EnableADC12IFG.0
TACCR0=1500;
//DelaytoallowReftosettle
TACCTL0|=CCIE;
//Compare-modeinterrupt.
TACTL=TASSEL_1|MC_1;
//TACLK=ACLK,Upmode.
_BIS_SR(LPM3_bits+GIE);
//Waitfordelay,Enableinterrupts
TACCTL0&
=~CCIE;
//Disabletimer
P2SEL|=BIT3;
//SetforTimerA1
P2DIR|=0x08;
TACCR0=7;
//InitTACCR0w/sampleprd=CCR0+1
TACCR1=4;
//TrigforADC12sample&
convert
TACCTL1=OUTMOD_3;
//Set/reset
TACTL=TACLR|MC_1|TASSEL_1;
//ACLK,clearTAR,upmode
//Timer_A0InterruptServiceRoutine
#pragmavector=TIMERA0_VECTOR
__interruptvoidta0_isr(void)
TACTL=0;
LPM3_EXIT;
//ExitLPM3onreturn
//ADC12InterruptServiceRoutine
#pragmavector=ADC12_VECTOR
__interruptvoidADC12ISR(void)
staticunsignedintindex=0;
results[index++]=ADC12MEM0;
//Moveresults
if(index==512)
ADC12CTL0&
=~ENC;
//Stopconversion
index=0;
P1OUT|=0x01;
_BIS_SR(LPM3_bits);
//EnterLPM3
NRF24L01学习总结
NRF24L01有四种工作模式:
PowerDownMode,StandbyModes,Rxmode,Txmode
工作模式由CONFIG寄存器的PWR_UP和PRIM_RX位和CE引脚控制.模式配置图如下:
NRF24L01的操作是基于状态图的:
NRF24L01的发送方式有二种,增强形发送方式和直接发送方式.直接发送方式要自己处理与协议有关的数据操作起来复杂因而很少使用.使用增强形发送方式有芯片可以自动处理封包,使编程复杂度大大降低.使用培增强形发送模式时数据帧格式如下图:
NRF24L01的数据接口为SPI接口。
NRF24L01的SPI命令有以下几个:
R_REGISTER
W_REGISTER
R_RX_PAYLOAD
FLUSH_TX
FLUSH_RX
REUSE_TX_PL
ACTIVATE
R_RX_PL_WID
W_ACK_PAYLOAD
W_TX_PAYLOAD_NO_ACK
NOP
有些命令只能在特定的模式下使用:
例如:
W_RESISTER只能在powerdown和standby模式下使用,R_RX_PAYLOAD只能在RXmode下使用等。
例一个重要的是NRF24L01的时序:
由图知:
第次spi操作时总是先写入一字节命令,并返回NFR24L01的状态寄存器值,然后写入要定入的若干字节。
NRF24L01发送端程序示例:
reg52.h>
typedefunsignedintuint;
typedefunsignedcharuchar;
#defineTX_ADDR_WIDTH5
#defineRX_ADDR_WIDTH5
#defineTX_PAYLOAD_WIDTH32
#defineRX_PAYLOAD_WIDTH32
//********************SPI命令*************************
#defineR_REGISTER0x00
#defineW_REGISTER0x20
#defineR_RX_PAYLOAD0x61
#defineW_TX_PAYLOAD0xa0
#defineFLUSH_TX0xe1
#defineFLUSH_RX0xe2
#defineREUSE_TX_PL0xe3
#defineACTIVATE0x50
#defineR_RX_PL_WID0x60
#defineW_ACK_PAYLOAD0xa8
#defineW_TX_PAYLOAD_NO_ACK0xb0
#defineNOP0xff
//**************NRF24L01寄存器地址*************
#defineCONFIG0x00
#defineEN_AA0x01
#defineEN_RXADDR0x02
#defineSETUP_AW0x03
#defineSETUP_RETR0x04
#defineRF_CH0x05
#defineRF_SETUP0x06
#defineSTATUS0x07
#defineRX_DR0x40
#defineOBSERVE_TX0x08
#defineCD0x09
#defineRX_ADDR_P00x0a
#defineTX_ADDR0x10
#defineRX_PW_P00x11
#defineFIFO_STATUS0x17
#defineDYNPD0x1c
#defineFEATURE0x1d
//***************NRF24L01端口定义*********************
sbitMISO=P1^3;
sbitMOSI=P1^4;
sbitSCK=P1^2;
sbitCE=P1^1;
sbitCSN=P3^2;
sbitIRQ=P3^3;
//NRF地址
ucharcodeTX_ADDRESS[5]={0x01,0x02,0x03,0x04,0x05};
ucharcodeRX_ADDRESS[5]={0x01,0x02,0x03,0x04,0x05};
//****************函数************************
voiddelayus(ucharus);
voiddelayms(ucharms);
ucharSPI_RW(uchardat);
ucharNRF_ReadStatus(void);
ucharNRF_RW_Reg(ucharreg,uchardat);
ucharNRF_WriteBuf(ucharreg,uchar*buf,ucharlen);
ucharNRF_ReadBuf(ucharreg,uchar*buf,ucharlen);
voidSetRxmode(void);
voidTxPacket(uchar*buf);
ucharRxPacket(uchar*buf);
voidNRF_Config(void);
ucharDate[32]={1,2,3,4,5,6,7,8,9,10,11,12};
P2=0x0e;
P0=0x87;
delayms(11);
NRF_Config();
TxPacket(Date);
RxPacket(Date);
delayms(100);
P0=0x03;
while
(1)
TxPacket(Date);
delayms(100);
P0=0x65;
P0=0x32;
}
voiddelayus(ucharus)
while(us--);
voiddelayms(ucharms)
while(ms--)delayus(250);
ucharSPI_RW(uchardat)
ucharbit_ctr;
for(bit_ctr=0;
bit_ctr<
8;
bit_ctr++)
MOSI=(dat&
0x80);
dat=dat<
<
1;
SCK=1;
dat|=MISO;
SCK=0;
returndat;
ucharNRF_ReadStatus(void)
ucharret;
CSN=0;
ret=SPI_RW(NOP);
CSN=1;
returnret;
ucharNRF_RW_Reg(ucharreg,uchardat)
ucharstatus;
status=SPI_RW(reg);
SPI_RW(dat);
returnstatus;
ucharNRF_WriteBuf(ucharreg,uchar*buf,ucharlen)
while(len)
SPI_RW(*buf++);
len--;
ucharNRF_ReadBuf(ucharreg,uchar*buf,ucharlen)
*buf++=SPI_RW(0);
voidSetRxmode(void)
CE=0;
NRF_RW_Reg(W_REGISTER+CONFIG,0x0f);
CE=1;
voidTxPacket(uchar*buf)
NRF_RW_Reg(W_REGISTER+CONFIG,0x0e);
//CE=1;
//delayus(10);
NRF_WriteBuf(W_TX_PAYLOAD,buf,TX_PAYLOAD_WIDTH);
delayus(150);
ucharRxPacket(uchar*buf)
uchars
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 总结