完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
关于msp430的特点
msp430系列单片机是一款16位的单片机,51单片机为8位,stm32系列为32位,顾名思义, 位数越高代表着该单片机处理数据的能力越快,性能也就越高。那么32位机器处理性能好,8位机器廉价性价比高,我们为什么要选择一个中间位置的16位单片机呢。它的亮点在于它的超低功耗。 字面意思,超低功耗就是这块板子有一个低功耗模式,进入低功耗模式之后就可以长时间极少耗损地待机,定时唤醒cpu进行工作,在能量来源很少的情况下是很有必要节约能量的。 利用官网资料 本单片机是ti公司开发的产品, 所以想要获得其资料的最好地方就是ti官网 ,在搜索栏直接搜索产品型号MSP-EXP430F5529LP, 里面有产品的各种资料,超级有用的用户指南(user‘s guide)也在这里,虽然是全英文的,但是只要有点英语水平静下心来慢慢看,会有很大收获的。 用户指南=手把手教你入门本产品 环境搭建 该单片机使用较多的编程环境有IAR和CCS。本人使用的是ccs所以对其进行讲解。 Code Composer Studio (CCS) 可以在官网下载,直接搜索即可。 由于msp430单片机内部集成了仿真器, 所以直接通过u***连接到电脑就可以进行硬件仿真,非常方便。 有一个小问题可能太简单了所以当时遇到的时候并没有搜索到答案: 仿真的同时代码就已经烧录到了板中, 此时板子只要供电,就可以自动执行代码。 学习路线 目前可以说是准备工作都结束了,可以进行调试了。 以下为本人的学习路线,供大家参考 熟悉基本操作, 操作IO口,跑马灯。 学习中断的原理,练习使用中断。 学习定时器原理,练习使用定时器产生pwm波。 练习使用定时器中断。 操作各种外设,模块。 接下来我会简单概述一下这个几个部分,详细的大家可以看看其他大神的文章,讲的都很详细。 基本操作 由于本人是从51过度过来,所以会对比51单片机的语法来写一下一部分。 操作模式和51单片机类似,都可以进行位操作,操作相应的GPIO口就能进行相应的控制 我们来看一下下面的代码: //51的位操作 ***it P10=P1^0; void main() { P1^1 = 1;// P1^1进行拉高 while(P10 == 1); //判断P1^0信号 } //msp430的位操作 void main() { P1DIR |= BIT1;//P1^1 GPIO设置为 OUT模式 P1OUT |= BIT1;// P1^1 进行拉高 P1DIR &=~BIT0;//P1^0 GPIO设置为 IN模式 while(P1IN & BIT0); //判断P1^0信号 } 想要去给我们的msp430写代码,首先要熟悉这种操作方式,我们不能直接对应一个位去赋值了,而是要使用这种’|=‘,’&=~‘进行赋值操作(对按位与& 和按位或| 不熟悉的朋友需要去了解一下了)。 MSP430 是双向IO口 ,从51转过来的朋友要熟悉去主动设置GPIO口的输入/输出。 另外在使用ccs进行操作的时候,有很多宏定义需要去熟悉, 比如BIT0 =00000001,BIT3=0000010。 如果想要同时拉高/拉低多个io口,可以使用这样的方法: P1OUT |= BIT0+BIT3。P1OUT &=~(BIT0+BIT3); 还有一些特殊的比如CCIE, OUTMOD_x,MC_x等等,需要大家多多熟悉了。 这一部分了解之后, 我们就可以操作很多外设了,跑马灯什么的完全不在话下。 中断操作 MSP430 这个单片机的中断操作很有趣,每一个IO口都可以是一个中断触发位,只要开启了中断允许位PxIE, 该IO口触发之后就会进入中断, 每一个IO口 P1.0~ P1.7会触发 同一个中断,P1中断: #pragma vector=PORT1_VECTOR __interrupt void Port1 (void) //port1 即P1 { } 同理P2.0~P2.7 会触发P2中断, Px.0-Px.7会触发Px中断。 我们还可以进行判断是哪一位IO口触发的中断, 这时就需要判断中断标志位 ‘IFG’。 在使用中断后,需要清除中断标志位(定时器中断除外),否则中断会持续进行,导致程序卡死。 贴上一段代码,大家感受一下 #include unsigned int a ; void init(); void main(void) { WDTCTL=WDTPW+WDTHOLD; init(); while(1) { P1OUT = 0; //P1置0 a = P1IN; //读取P1输入 if(a&BIT3) { P1OUT = BIT0; //P1.0置1 } } } #pragma vector=PORT1_VECTOR __interrupt void Port1 (void) { if(P1IFG&BIT3)//判断的是P1.3 产生的中断。 { P1IFG=0x00;//清0 中断标志位 P4OUT^=BIT7; //P4.7置1 } } void init() { P1IE|=BIT3; //P1^3 中断使能 P1DIR |=(BIT0); // 设置 P1.3为输出 P4DIR |=(BIT7); // 设置 P4.7为输出 __enable_interrupt(); //开启总中断 } 除此之外,还有一些特殊中断位,比如用定时器的捕获比较器输出pwm波时,TACCR0-TACCR4分别对应P1.1-P1.5 使用时需要开启特殊中断位 PxSEL 这个可以等到看完定时器后再进行理解。 定时器 关于定时器的操作比较复杂,常用的大概包括: 1.时钟源的选择 TASSELx 2.分频控制 IDx 3.工作模式 MC 4.中断使能 TAIE 5.中断标志 TAIFG 6.捕获/比较器 TACCRx 7.输出模式 OUTMODx 详细的可以翻一翻站内资源,有关于定时器写的非常详细的文章,反复看反复实践,就能快速掌握。 贴上一段代码大家感受一下 //定时器中断LED闪烁 #include void init() { TA0CCTL1=CCIE; //开启捕获比较器1中断 TA0CCR1=50000; //置入要比较的数值 TA0CTL|=TASSEL_1+MC_2+TAIE;//选择SCLK时钟,使用连续模式,开启定时器中断 __enable_interrupt(); //开启总中断 } void main(void) { WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 P4DIR|=BIT7; P1DIR|=BIT0; //P1.0 为输出方向 P1OUT=0x00; //初始化LED P1OUT = BIT0; init(); while(1); } #pragma vector=TIMER0_A1_VECTOR __interrupt void TimerA(void) { init(); P1OUT ^= BIT0; } 下面贴一个定时器产生pwm波的代码,用到了上面说到的特殊中断位 //在P1.3产生pwm波 #include void main(void) { unsigned int PWMPeriod = 21000; //设置PWM周期 WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 P1DIR |=BIT3; // 设置 P1.3为输出 P1SEL |=BIT3; // 设置 P1.3为TA0.2输出(特殊中断位) TA0CCR0 = PWMPeriod; // 设置PWM 周期 TA0CCTL2 = OUTMOD_7; // 设置PWM 输出模式7 TA0CTL= TASSEL_2 +MC_1; // 设置定时器A的时钟源为SMCLK, 工作模式为1,从0到CCR0重复计数 TA0CCR2=1000; //设置捕获比较器2, 当计数达到CCR2时触发特殊中断位 P1.3 __enable_interrupt(); //开启总中断 while(1); } 关于定时器真的有好多需要学习,本人也没有把每一部分完全学明白,等真正用到的时候再回去翻阅。 关于实际应用 学一个东西的目标不是把这个东西学通学透,而是用这个东西达到自己的目的,学通学透只是附加品而已。 边学边用,边用边学才能有成效。 下面我将简单举几个例子说一下哪些东西用到了哪部分的知识,哪部分的知识能用来做什么。 简单的方案有很多,我只指出最麻烦的方法方便大家练习/思考 1.流水灯: 基本操作+定时器 这个就很简单了,还可以用delay函数代替定时器,方法有很多,主要可以用来练手。 2.按键调速电机: 基本操作+定时器+中断 定时器产生pwm波,特殊中断io口输出pwm ,通过按键产生中断调整pwm参数实现调速。 3.舵机控制 : 基本操作+定时器 这个和第二个原理相同,可以同时操作 4.LCD1602/12864:基本操作 从头到尾自己手动写一遍的话,会对赋值等有更大的理解,代码敲起来也会更加熟练。 5… 结尾 本人的学习过程差不多就是这样,希望文章能给各路新手们起到引导作用。本人也还是新人一枚有很多不懂的地方,知识面也很窄,希望大神们多多批评指正。本人也会不断学习前进,朝着大神的方向前进的。 |
|
|
|
只有小组成员才能发言,加入小组>>
2548 浏览 0 评论
1146浏览 2评论
745浏览 1评论
499浏览 0评论
265浏览 0评论
427浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:09 , Processed in 1.204890 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号