msp430模块程序

更新时间:2024-02-02 20:08:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基础时钟模块应用举例

例1 设MCLK=XT2,SMCLK=DCOCLK,将MCLK 由5.4 输出程序如下: #include void main(void) {

unsigned int i;

WDTCTL = WDTPW + WDTHOLD; //停止看门狗 P5DIR |= 0X10; P5SEL |= 0X10;

BCSCTL1 &= ~XT2OFF; do{

IFG1 &= ~OFIFG; for(i = 0xFF;i>0;i--); }

while((IFG1 & OFIFG) != 0); BCSCTL2 |= SELM1; for(;;); }

例2 设ACLK=MCLK=LFXT1=LF #include void main(void) {

unsigned int i;

WDTCTL = WDTPW + WDTHOLD; //停止看门狗 P5DIR |= 0X10; P5SEL |= 0X10; BCSCTL1 &= XTS; do{

IFG1 &= ~OFIFG; for(i = 0xFF;i>0;i--); }

while((IFG1 & OFIFG) != 0); BCSCTL2 |= SELM1+SELM0; for(;;); }

例3 改变BCSCTL1 中Rsel0,Rsel1,Rsel2 的值测量DCO 频率(默认情况MCLK、 SMCLK 均为DCO 时钟,P1.4 输出ACLK,P2.0 输出SMCLK,P5.4 输出MCLK) #include void main(void) {

WDTCTL=WDTPW+WDTHOLD;//看门狗停止P1DIR=0x10;//p1.4 输出 P1SEL=0x10;//P1.4=SMCLk P2DIR=0x01;//p2.0 输出 P2SEL=0x01;//P2.0=ACLk

P5DIR=0x10;//p5.4 输出 P5SEL=0x10;//P5.4=SMCLk

BCSCTL1 =0x00 ;//xt2off,xts,diva.1,diva.0xt5v,,res3 //BCSCTL1 =0x01; //BCSCTL1 =0x02; //BCSCTL1 =0x03; //BCSCTL1 =0x04; //BCSCTL1 =0x05; //BCSCTL1 =0x06; //BCSCTL2=0x07; for(;;) {__NOP();

//_BIS_SR(CPUOFF);// } }

举例1 使用软件定时周期性取反P2.1 #include void main(void) {

WDTCTl = WDTPW + WDTHOLD; P2DIR |= 0x02; for(;;) {

unsigned int i; i = 50000; do (i--); while (i != 0); } }

举例2 单片机在P3.1 产生方波,并把P3.1 与P1.7 相连,P1.7 接收中断,在中断服 务程序中让P3.3 产生方波。 #include void main(void) {

WDTCTL=WDTPW+WDTHOLD; P3OUT =0x00;//P3 引脚低电平 P3DIR |=0xff;//P3 方向输出 P1OUT=0x00;

P1IES |=0x00;//上升沿触发

P1IFG= 0x00; //因为P1IES 设置会使中断标志置位,故清零。 P1IE |=0xff;// P1 模块中断允许 _EINT();//系统中断允许 int i; for(;;)

{

for(i=1;i<=32000;i++) _NOP();

P3OUT ^=0x02;//P3.1 每隔8000 个机器指令周期产生一次跳变 }}

#pragma vector = PORT1_VECTOR __interrupt void P1_Interrupt(void){ if (P1IFG==0x80) { P1IFG=0x00; P3OUT ^= 0x08; } else P1IFG=0x00; }

#include void main(void) {

WDTCTL = WDT_MDLY_32; IE1 |= WDTIE; P1DIR |=0x01; _EINT(); for(;;) {

_BIS_SR(CPUOff); _NOP(); } }

#pragma vector = WDT_VECTOR __interrupt void watchdog_timer(void) {

P1OUT ^= 0x01; }

例2: 看门狗模式

#include void main(void) {

P3DIR=0XFF; //P3 输出

WDTCTL=WDT_MRST_32; //WDTPW+WDTCNTCL 看门狗32 毫秒 int i;

for(i=0;i<5000;i++) _NOP();

P3OUT ^=0X02; // P3.1 灯亮或灭 for(;;) {

WDTCTL =WDT_MRST_32; //喂狗,看门狗计数器清零即 //WDTPW+WDTCNTCL;

for(i=0;i<=5000;i++) _NOP();

P3OUT ^=0x0c; // P3.2 p3.3 灯亮或灭 } }

例1:

//定时开关P3,即P3 输出取反;定时时间到,进入中断 //ACLK=32768HZ,MCLK=SMCLK=DCOCLK=1.048576M //周期性P3 取反,频率为1.048576M/65536/2=8Hz #include void main(void) {

WDTCTL=WDTPW+WDTHOLD;

TACTL =TASSEL1+TACLR+MC1+TAIE;//SMCL,CLEAR TAR, //TIMER_A 连续计数描 述//

//TA 定时器溢出中断允许 P3DIR=0xFF;

//TACTL |=MC1;//TIMER_A 连续计数描述 _EINT(); for(;;) {

_BIS_SR(CPUOFF); _NOP(); } }

#pragma vector=TIMERA1_VECTOR __interrupt void TIMER_A(void) {

switch(TAIV) {

case 2: break; case 4: break;

case 10: P3OUT^=0xFF; break; } }

例2:

//ACLK=32768HZ,MCLK=SMCLK=DCOCLK=1.048576M //周期性P3.1 取反,频率为1.048576M/65535(TA 中断响应)

//周期性P3.3 取反,频率为20000(捕获中断响应)可以看出:P3.1 闪亮的周期约是P3.3 的3 倍

#include void main(void) {

WDTCTL=WDTPW+WDTHOLD;

TACTL =TASSEL1+ID0+ID1+TACLR+TAIE;//MCLK,8 分频,CLEAR TAR,//TA 定时器溢

出中断允许

CCTL0=CCIE; // CCR0=20000;

TACTL |=MC1;//TIMER_A 增减计数描述 P3DIR=0xFF; P3OUT=0xFF; _EINT(); for(;;) {

_BIS_SR(CPUOFF); _NOP(); } }

#pragma vector=TIMERA1_VECTOR //定时器中断__interrupt void TIMER_A(void) {

switch(TAIV) {

case 2: break; case 4: break;

case 10: P3OUT^=0x02; break; } }

#pragma vector=TIMERA0_VECTOR //当TAR=CCR0 产生中断 __interrupt void TIMER_cc(void) {

P3OUT^=0x08; CCR0+=20000; }

举例: 例1:

//软循环产生方波,从p3.1 输出(闪) //CCI0、CCI1 设置为捕获模式,

//P3.1 与P1.1 和P1.2(即CCI0A、CCI1A)相连,当P3.1 产生沿变化,将产生捕获中 断

//CCI0 中断使得P3.3 闪,CCI1 中断使得P3.2 闪j,k 计算前后两次捕获的时间间隔(结 果K= j/2,why) int i,j,k;

#include void main(void) {

WDTCTL=WDTPW+WDTHOLD;

TACTL =TASSEL1+ID0+ID1+MC1+TACLR;//+TAIE;//MCLK,8 分频,CLEAR TAR,连续

式//TA 定时器溢出中断允许

CCTL0=CM0+CM1+SCS+CAP+CCIE; //上下升沿,异步,捕获,捕获中断允许cci0 CCTL1=CM0+SCS+CAP+CCIE; //上升沿,异步,捕获,捕获中断允许cci1 P1DIR=0x00; P1SEL=0xff; P3DIR=0xFF; P3OUT=0x00; _EINT(); for(;;) {

for(i=0;i<10000;i++) _NOP();

P3OUT^=0x02; //产生捕获信号源 } }

#pragma vector=TIMERA1_VECTOR // 定时器中断捕获__interrupt void TIMER_A(void) {

switch(TAIV) {

case 2:P3OUT^=0x04;

j=CCR1-j;//两次上升沿间隔 break;

case 4: break;

case 10: P3OUT^=0x02; break; } }

#pragma vector=TIMERA0_VECTOR __interrupt void TIMER_cc(void) {

P3OUT^=0x08;

k=CCR0-k;//上下升沿间隔 }

例2:

//CCI0、CCI1 设置为比较器模式, //CCR0 捕获产生中断

//CCI0 中断使得P3.3 闪,CCI1 中断使得P3.2 闪 #include void main(void) {

WDTCTL=WDTPW+WDTHOLD;

TACTL =TASSEL1+ID0+ID1+MC1+TACLR;//+TAIE;//MCLK,8 器溢出中断允许

CCTL0=CCIE; //cap=0 比较器模式 CCTL1=CCIE; //cap=0 比较器模式 CCR0=10000; CCR1=30000; P3DIR=0xFF; P3OUT=0x00; _EINT();

分频,CLEAR TAR,连续模式//TA 定时 for(;;) {

// for(i=0;i<10000;i++) _NOP();

// P3OUT^=0x02; //产生捕获信号源 } }

#pragma vector=TIMERA1_VECTOR //定时器比较器中断CCR1=TAR __interrupt void TIMER_A(void) {

switch(TAIV) {

case 2:P3OUT^=0x04;

CCR1+=60000;// 改变比较条件 break;

case 4: break;

case 10: P3OUT^=0x02; break; } }

#pragma vector=TIMERA0_VECTOR __interrupt void TIMER_cc(void) {

P3OUT^=0x08;

CCR0 +=20000;//上下升沿间隔 }

//利用Timer_A 输出周期为512 /32768 = 15.625ms、占空比分别为75%和25%的 PWM 矩形波: #include void main(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.2 TA1 out P2DIR |= 0x01; // P2.0 输出 P2SEL |= 0x01; // P2.0 TA2 out

TACTL |= MC0; // Timer_A 增计数模式 for (;;) {

_BIS_SR(LPM3_bits); // 进入LPM3 _NOP(); } }

7.3.5 应用举例

例1 利用定时器A 输出周期为2ms 的方波,并由端口P3 送出算法:采用定时器A 连 续计数模式。使用在P3 端口每隔1ms 将输出求反。背景条件:DCO 产生的频率为 800KHz。使用800KHz 的SMCLK 作为定时器的时钟源,则定时1ms 的计数值为: 1×0.001/(1/(800×1000)) =800。 例2 Timer_A 实现PWM 举例

例:设ACLK = TACLK = LFXT1 = 32768, MCLK = SMCLK = DCOCLK

= 32×ACLK =1.048576Mhz,利用Timer_A 输出周期为512 /32768 = 15.625ms、占空 比分别为75%和25%的PWM 矩形波: #include void main(void) {

WDTCTL = WDTPW +WDTHOLD; FLL_CTL0 |= XCAP14PF;

TACTL = TASSEL0 + TACLR; // ACLK, 清除TAR 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.2 TA1 P2DIR |= 0x01; // P2.0 输出 P2SEL |= 0x01; // P2.0 TA2

TACTL |= MC0; // Timer_A 增计数模式 for (;;) {

_BIS_SR(LPM3_bits); // 进入LPM3 _NOP(); } }

本文来源:https://www.bwwdw.com/article/udvw.html

Top