历史上的今天
今天是:2025年01月25日(星期六)
2021年01月25日 | 【MSP430F5529】一些相关代码
2021-01-25 来源:eefocus
MSP系列的例程相对来说较少,而且F1-F5系列中系统时钟系统不断升级,彼此之间差异很大
这些代码是为了2019年全国大学生电子设计大赛准备的
现在拿出来分享一下,希望可以帮助后面一些人学习一下(因为很少有一本书专门去讲F5529,虽然不同系列彼此之间差异不大,但是做东西的时候你会发现有一些是无法通过编译的,或者编译后功能不好使)
PWM呼吸灯1
/*
P13为PWM输出口,TA0CCR2越大时灯越亮
*/
#include void delay_nms(unsigned int n) { unsigned int j; for (j=0; j<(n); j++) { __delay_cycles(400); } } void main(void) { int PWMPeriod = 1500; int i; WDTCTL = WDTPW + WDTHOLD; P1DIR |=BIT3; P1SEL |=BIT3; TA0CCR0 = PWMPeriod; TA0CCTL2 = OUTMOD_7; , TA0CTL= TASSEL_2 +MC_1; while(1) { TA0CCR2=0; for(i=0; i TA0CCR2=i; delay_nms(2); } for(i=PWMPeriod; i>0; i-=1) { TA0CCR2=i; delay_nms(2); } TA0CCR2=0; delay_nms(250); } } PWM呼吸灯2 /* P20为PWM输出口,TA1.1 */ #include void delay_nms(unsigned int n) { unsigned int j; for (j=0; j<(n); j++) { __delay_cycles(400); } } void main(void) { int PWMPeriod = 1500; int i; WDTCTL = WDTPW + WDTHOLD; P2DIR |=BIT0; P2SEL |=BIT0; TA1CCR0 = PWMPeriod; TA1CCTL1 = OUTMOD_7; TA1CTL= TASSEL_2 +MC_1; while(1) { TA1CCR1=0; for(i=0; i TA1CCR1=i; delay_nms(2); } for(i=PWMPeriod; i>0; i-=1) { TA1CCR1=i; delay_nms(2); } TA1CCR1=0; delay_nms(250); } } 串口通信 /* 使用UCA1,所以是P44和P45 */ #include "msp430f5529.h" // ACLK = REFO = 32768Hz, MCLK = SMCLK = default DCO/2 = 1048576Hz // P33 P34—— USCI_A0 TXD/RXD // P44 P45—— USCI_A1 TXD/RXD void main(void) { WDTCTL = WDTPW + WDTHOLD; P4SEL |=BIT4+BIT5 ; UCA1CTL1 |= UCSWRST; // **Put state machine in reset** UCA1CTL1 |= UCSSEL_2; // SMCLK UCA1BR0 = 9; // 1MHz 115200 (see User's Guide) UCA1BR1 = 0; // 1MHz 115200 UCA1MCTL |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0 UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled /*或者去掉上一句,加上 _EINT(); while(1); 也是可以的 */ } // 发送数据之前确定发送缓存准备好 #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) { switch(__even_in_range(UCA1IV,4)) { case 0: break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG while (!(UCA1IFG&UCTXIFG)); //等待数据发送完成 完成 UCTXIFG 置 1 跳出循环 UCA1TXBUF = UCA1RXBUF; // TX -> RXed character break; case 4: break; // Vector 4 - TXIFG default: break; } } 定时器中断 /* 系统处理完中断自动清除中断标志位,默认不允许嵌套中断,除非开启GIE P11-P15定时器A中断 注意旧板子P12已坏 详情见书MSP430超低功耗...新书那本 P98 */ #include void main(void) { WDTCTL=WDTPW+WDTHOLD; P1DIR|=(BIT1+BIT2+BIT3+BIT4+BIT5);//P1.1-P1.5为输出方向 P1OUT=0x00; //全部拉低,初始化LED全灭 TA0CCTL1=CCIE; //捕获比较器1开启CCIFG位中断 TA0CCR1=13107; //置入要比较的数值0xff/5=13107 TA0CCTL2=CCIE; //捕获比较器2开启中断 TA0CCR2=26214; //13107*2=26214 TA0CCTL3=CCIE; //捕获比较器3开启中断 TA0CCR3=39321; //13107*3=39321 TA0CCTL4=CCIE; //捕获比较器4开启中断 TA0CCR4=52428; //13107*4=52428 TA0CTL|=TACLR+TAIE; //开启中断并清零 TA0CTL|=TASSEL_1+MC_2+TAIE;//选择SCLK32.768KHZ作为时钟,选用连续模式,并开启中断 /*这样的话,5个灯闪一遍的时间为0xffff/32768=2S*/ __enable_interrupt(); //开启总中断 while(1); } /*TIMER0_A0_VECTOR是计时器0的CCR0的中断寄存器,TIMER0_A1_VECTOR是计时器0的CCR1-CCR6 TA的寄存器*/ /*同理定时器TA1也是分为两个TIMER1_A0_VECTOR和TIMER1_A1_VECTOR*/ #pragma vector=TIMER0_A1_VECTOR __interrupt void TimerA(void) { switch(__even_in_range(TA0IV,14)) /* 这句话的意思是:只有在TA0IV的值是在0--14内的偶数时才会执行switch函数内的语句 其作用是提高switch语句的效率*/ { case 2: P1OUT=BIT1; break; //TACCR1 CCIFG置位,表明计数值和设定的13107相等了,也就是说计了0.4S了 case 4: P1OUT=BIT2; break; //TACCR2 CCIFG置位,表明计了0.8S了 case 6: P1OUT=BIT3; break; //TACCR3 CCIFG置位,表明计了1.2S了 case 8: P1OUT=BIT4; break; //TACCR4 CCIFG置位,表明计了1.6S了 case 14: P1OUT=BIT5; break; //TAIFG置位,表明计了2S了 TAIFG表示移出 default: break; } } TA1 #include void delay_nms(unsigned int n) { unsigned int j; for (j=0; j<(n); j++) { __delay_cycles(400); } } void main(void) { WDTCTL=WDTPW+WDTHOLD; TA1CCTL1=CCIE; //捕获比较器1开启CCIFG位中断 TA1CTL|=TACLR+TAIE; //开启中断并清零 TA1CTL|=TASSEL_1+MC_2+TAIE;//选择SCLK32.768KHZ作为时钟,选用连续模式,并开启中断 __enable_interrupt(); P1DIR=0xff; P1OUT=0X00; while(1); } #pragma vector=TIMER1_A1_VECTOR __interrupt void TimerA(void) { switch(__even_in_range(TA1IV,14)) { case 14: P1OUT=BIT0; delay_nms(500); P1OUT=0x00; break; default: break; } }
史海拾趣
|
如果设计稍显复杂,那么对底层细节的过多关注就会成为一种累赘。 试想我们平时在电脑上编写C程序,比如在显示器上输出一行字,我们只用一句printf()即可完成,至于打印命令怎么传到显示芯片上,哪个芯片管脚怎么 变化,又怎么传到显 ...… 查看全部问答> |
|
希望参加《智能家居系统》的网友添加113586004群,在群内讨论问题。 [ 本帖最后由 zhaojun_xf 于 2010-7-31 10:28 编辑 ]… 查看全部问答> |
|
我使用串口与模块进行通信,来收发中文短信,并将串口InputMode属性设为文本方式。 当通过串口,来接收CDMA模块发送的汉字Unicode码时,发现,串口已将Unicode码以字节为单位转换为ASCII字符。 现在,我想要恢复这一过程,将ASCII字符还原为Unico ...… 查看全部问答> |
|
请教各位大大~~~~~关于ARM开发板的选择~~~~~~~~~~ 小弟最近想学RAM,之前一直用的51,不能说精通吧,至少基本的原理和应用算是比较熟悉了 现在想买块开发板,看上面置顶区里有个团购STM32的活动,不知道这块板子怎么样啊? 还有就是STM32在ARM里算是什么样的定位?适不适合像我这 ...… 查看全部问答> |
|
调试时出现的奇怪现象Program exit reached 如图,调试时出现的现象,右边绿色DebugBreak,下边蓝色部分Program exit reached,请问大家遇到过没有?怎么解决,现在烧不进程序了。… 查看全部问答> |




