msp430单片机应用实例(msp430单片机原理与应用实例详解)

msp430单片机应用实例(msp430单片机原理与应用实例详解)tr td width 50 style vertical align top padding 10px 10px 10px 0 td tr

大家好,我是讯享网,很高兴认识大家。




讯享网

 <tr> <td width="50%" style="vertical-align:top;padding:10px 10px 10px 0;"> </td> <td width="50%" style="vertical-align:top;padding:10px;"> </td> </tr> <tr> <td width="50%" style="vertical-align:top;padding:10px 10px 10px 0;"> </td> <td width="50%" style="vertical-align:top;padding:10px;"> </td> </tr> <tr> <td width="50%" style="vertical-align:top;padding:10px 10px 10px 0;"> </td> <td width="50%" style="vertical-align:top;padding:10px;"> </td> </tr> <tr> <td width="50%" style="vertical-align:top;padding:10px 10px 10px 0;"> </td> <td width="50%" style="vertical-align:top;padding:10px;"> </td> </tr> <tr> <td width="50%" style="vertical-align:top;padding:10px 10px 10px 0;"> </td> <td width="50%" style="vertical-align:top;padding:10px;"> </td> </tr> <p>MSP430F5529的launchpad是 TI送的比较多的一款开发套件,至少我们实验室就是人手一块,很多人都嫌他慢,确实相比较于STM32F103(72MHz) 和STM32F407(168MHz)的速度而言&nbsp; 默认状态下主频只有1MHz的 MSP430F5529就是个弟弟,而且处理位宽也是只有16位,,, 还不支持位带操作&nbsp; ,但是就超低功耗这一点就足以让他在单片机界立足 ,废话少说,来正题。<p><br/><p>这次跟大家分享的是标题所说的&nbsp; MSP430F5529的升频方案。<p><br/><p>要升频,首先我们得能‘看见’系统的频率,TI的工程师们充分考虑到了这个问题,他们有得引脚可以直接输出时钟信号!!!<p><br/><p>在芯片datesheet中 的Terminal Functions&nbsp; 里有如下说明<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>所以我们可以通过设置相应的 状态来输出时钟信号, IO配置成输出+ 功能复用<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>以上 我们实现了 时钟的输出 ,通过测量上述的三个IO ,我们可以得到系统的不同时钟。 接下来就是对时钟的配置<p><br/><p>主要就是配置UCS(Unified Clock System (UCS))的一些寄存器。 不过 在这之前&nbsp; 我们要先把核心电压升上去,430为了省电默认状态下核心电压默认设置为1.8V来节省功耗。 在用户手册的2.2.4节提到了升核心电压的方法<p><br/><p>开启PMM管理的操作&nbsp; 第一步是解锁&nbsp; 向PMMCTL0 寄存器高8位写入 0xA5 然后设置核心电压等级是三级(官方手册有提到频率和核心电压的关系)<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>这里要提一下 ,我调用官方的 SetVcore()函数并不能实现效果不知道为什么 。。。。有知道的大佬还望不吝赐教<p><br/><p>到这里 我们的核心的电压已经设置完成了,接下来就是时钟的配置了,其他大佬们也提到了很多,我这里就是按照一位大佬的做法实现的,不是原创! 只是对前人思路的理解.. 代码如下<p><p>第一步是 令 SR寄存器里面的 SCG0=1, 我猜测这里的目的应该是<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>我猜测这一步的作用应该是关闭锁相环,同时 关闭了这个时钟以后系统时钟应该会自动切换到备用时钟。 关闭了这个以后就可以开始对时钟进行设置了。&nbsp; UCSCTL0 是直接关闭了DCO的输出<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>查看芯片的技术手册发现0x60(DCORSEL_6)确实是最优解!&nbsp; 同时0x50(DCORSEL_5)和 0x70(DCORSEL_7)也是可以选择的!<p><br/><p>接着理解下一步&nbsp; UCSCTL2 = FLLD_1 | 380;<p><p>接下来我们看一下这些bit到底是设置了什么<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);">&nbsp;<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>通过 这些默认的设置<p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p style="box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; word-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255);"><p>初步判断时钟是从XT1CLK 来的<p><p>XT1 也就是我们先前使能的 外部晶振&nbsp; &nbsp; P5.4 P5.5<p><p>然后我们打开launchpad的手册 在clock相关的部分也确实证实了&nbsp; XTL1 是32.768KHz的晶振<p><p>XT1 的 bypass是 默认置0的&nbsp; 完整的时钟信号走向应该是这样的<p><p>实现效果是这样的&nbsp;&nbsp;<p><p>这里的示波器选用的是 Loto 的虚拟示波器 OSC802&nbsp;<p><br/><p>示波器的引脚接到了 P2.2脚 我也是最近才开始捡起 430的 ,很多东西都不是很熟,出错在所难免,请各位大佬们不吝赐教! <p>*软件延时/&nbsp;<br/># define CPU_F ((double))&nbsp;<br/>#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/.0))&nbsp;<br/>#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))&nbsp;<br/>//&nbsp;<br/>#define CPU_F((double))中的表示的是你系统的时钟,该值要随你试验系统的改变而改变。本例中为MCLK=8MHz的意思。<p>以下例程是分别产生微秒级和毫秒级延时的示范,如果要实现不同的延时只要改变程序中的实参就可以了。调用此程序时实参必是数字,而不能使用变量作为实参。&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理论上各个延时函数可以达到如下精度:&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay_us(1);&nbsp;&nbsp;&nbsp; //延时1us&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay_ms(1);&nbsp;&nbsp;&nbsp; //延时1ms&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay_us(4.2);&nbsp; //延时4.2us&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay_ms(4.2);&nbsp; //延时4.2ms<p>上诉例程我用MSP430F448平台测试,现将所用程序及实测结果发布如下,供各位参考:&nbsp;<br/>1MHZ主频下软件定时情况:&nbsp;<br/>程序:&nbsp;<p><br/>#include&nbsp; <msp430x44x.h>&nbsp;<br/>/*软件延时/&nbsp;<br/>#define CPU_F ((double))&nbsp;<br/>#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/.0))&nbsp;&nbsp;<br/>#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))&nbsp;<br/>//&nbsp;<br/>//是CPU的主频,即MCLK,需要随系统的改变而改变&nbsp;<br/>void main(void)&nbsp;<br/>{&nbsp;<br/>&nbsp; WDTCTL = WDTPW + WDTHOLD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; P1DIR = 0x22;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; P1SEL = 0x22;&nbsp;<br/>&nbsp; P2DIR=0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; for(;;)&nbsp;<br/>&nbsp; {&nbsp;<br/>&nbsp;&nbsp;&nbsp; delay_us(1);&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; P2OUT^=0X01;&nbsp;<br/>&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}&nbsp;<p><br/>结果:&nbsp;<br/>//delay_us(1):&nbsp; 实际延时时间为6.8us&nbsp;<br/>//delay_us(10);&nbsp; 实际延时时间为15.6us&nbsp;<br/>//delay_us(20);&nbsp; 实际延时时间为24.8us&nbsp;<br/>//delay_us(90);&nbsp; 实际延时时间为92us&nbsp;<br/>//delay_us(100); 实际延时时间为100us&nbsp;<br/>//delay_us(900); 实际延时时间为880us&nbsp;<br/>//delay_us(1000);实际延时时间为0.96ms&nbsp;<br/>//delay_ms(1);&nbsp;&nbsp; 实际延时时间为0.96ms&nbsp;<br/>//delay_ms(10);&nbsp; 实际延时时间为9.6ms&nbsp;<br/>//delay_ms(100); 实际延时时间为96ms&nbsp;<br/>//delay_ms(500); 实际延时时间为480ms&nbsp;<br/>//delay_ms(1000); 实际延时时间为950ms&nbsp;<br/>//delay_ms(10000); 实际延时时间为10s<p>2MHZ主频如下:&nbsp;<br/>程序&nbsp;<br/>#include&nbsp; <msp430x44x.h>&nbsp;<br/>/*软件延时/&nbsp;<br/>#define CPU_F ((double))&nbsp;<br/>#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/.0))&nbsp;&nbsp;<br/>#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))&nbsp;<br/>//&nbsp;<br/>//是CPU的主频,即MCLK,需要随系统的改变而改变&nbsp;<br/>void main(void)&nbsp;<br/>{&nbsp;<br/>&nbsp; WDTCTL = WDTPW + WDTHOLD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; FLL_CTL0 |= XCAP18PF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; SCFI0 |= FN_2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; SCFQCTL = 60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; P1DIR = 0x22;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; P1SEL = 0x22;&nbsp;<br/>&nbsp; P2DIR=0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; for(;;)&nbsp;<br/>&nbsp; {&nbsp;<br/>&nbsp;&nbsp;&nbsp; delay_ms(1000);&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; P2OUT^=0X01;&nbsp;<br/>&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}&nbsp;<br/>结果:&nbsp;<br/>//delay_us(1):&nbsp; 实际延时时间为4us&nbsp;<br/>//delay_us(10);&nbsp; 实际延时时间为13.2us&nbsp;<br/>//delay_us(20);&nbsp; 实际延时时间为23.2us&nbsp;<br/>//delay_us(90);&nbsp; 实际延时时间为92us&nbsp;<br/>//delay_us(100); 实际延时时间为104us&nbsp;<br/>//delay_us(900); 实际延时时间为900us&nbsp;<br/>//delay_us(1000);实际延时时间为1.04ms&nbsp;<br/>//delay_ms(1);&nbsp;&nbsp; 实际延时时间为1.04ms&nbsp;<br/>//delay_ms(10);&nbsp; 实际延时时间为10ms&nbsp;<br/>//delay_ms(100); 实际延时时间为100ms&nbsp;<br/>//delay_ms(500); 实际延时时间为500ms&nbsp;<br/>//delay_ms(1000); 实际延时时间为1000ms&nbsp;<br/>//delay_ms(10000); 实际延时时间为10s<p>8MHZ主频:&nbsp;<br/>程序:&nbsp;<br/>#include&nbsp; <msp430x44x.h>&nbsp;<br/>/*软件延时/&nbsp;<br/>#define CPU_F ((double))&nbsp;<br/>#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/.0))&nbsp;&nbsp;<br/>#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))&nbsp;<br/>//&nbsp;<br/>//是CPU的主频,即MCLK,需要随系统的改变而改变&nbsp;<br/>void main(void)&nbsp;<br/>{&nbsp;<br/>&nbsp; WDTCTL = WDTPW + WDTHOLD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Stop watchdog timer&nbsp;<br/>&nbsp; FLL_CTL0 |= DCOPLUS+XCAP18PF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set load capacitance for xtal&nbsp;<br/>&nbsp; SCFI0 |= FN_4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // x2 DCO, 4MHz nominal DCO&nbsp;<br/>&nbsp; SCFQCTL = 121;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (121+1) x 32768x 2= 8Mhz&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp; P1DIR = 0x22;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // P1.1 & P1.5 to output direction&nbsp;<br/>&nbsp; P1SEL = 0x22;&nbsp;<br/>&nbsp; P2DIR=0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // P1.1 & P1.5 to output MCLK & ACLK&nbsp;<br/>&nbsp; for(;;)&nbsp;<br/>&nbsp; {&nbsp;<br/>&nbsp;&nbsp;&nbsp; delay_ms(1000);&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; P2OUT^=0X01;&nbsp;<br/>&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}&nbsp;<br/>结果:&nbsp;<br/>//delay_us(1):&nbsp; 实际延时时间为1.75us&nbsp;<br/>//delay_us(10);&nbsp; 实际延时时间为10.80us&nbsp;<br/>//delay_us(20);&nbsp; 实际延时时间为20.8us&nbsp;<br/>//delay_us(90);&nbsp; 实际延时时间为90.5us&nbsp;<br/>//delay_us(100); 实际延时时间为100us&nbsp;<br/>//delay_us(900); 实际延时时间为900us&nbsp;<br/>//delay_us(1000);实际延时时间为1ms&nbsp;<br/>//delay_ms(1);&nbsp;&nbsp; 实际延时时间为1ms&nbsp;<br/>//delay_ms(10);&nbsp; 实际延时时间为10ms&nbsp;<br/>//delay_ms(100); 实际延时时间为100ms&nbsp;<br/>//delay_ms(500); 实际延时时间为500ms&nbsp;<br/>//delay_ms(1000); 实际延时时间为1s&nbsp;<br/>//delay_ms(10000); 实际延时时间为10s<p><br/><p>上述测试说明:&nbsp;<br/>程式用于20us以下的延时,误差会比较大,主频越高误差越小;&nbsp;<br/>大于20us小于1000ms的延时,定时时间几乎没有什么误差。<p>在系统实时性要求比较高的情况下,10ms以上的延时采用软件来实现不是很好的选择,建议采用硬件方式。对于us级的延时,本文提供的程式非常有实用价值。 <p>环境:windows xp,ccs5.4<p><br/><p>使用Ti官方的uart串口程序<p><br/><p>#include <msp430.h><p><br/><p><br/><p>int main(void)<p>{<p>&nbsp; WDTCTL = WDTPW + WDTHOLD;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Stop WDT<p>&nbsp; if (CALBC1_1MHZ==0xFF) // If calibration constant erased<p>&nbsp; {&nbsp;<p>&nbsp; &nbsp; while(1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// do not load, trap CPU!!<p>&nbsp; }&nbsp;<p>&nbsp; DCOCTL = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Select lowest DCOx and MODx settings<p>&nbsp; BCSCTL1 = CALBC1_1MHZ;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Set DCO<p>&nbsp; DCOCTL = CALDCO_1MHZ;<p>&nbsp; P3SEL = 0x30;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// P3.4,5 = USCI_A0 TXD/RXD<p>&nbsp; UCA0CTL1 |= UCSSEL_2;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// SMCLK<p>&nbsp; UCA0BR0 = 52;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 1MHz 19200我设置了一个8M赫兹的一个值,所以这里需要查看用户定义中的一张表格来确定<p>&nbsp; UCA0BR1 = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 1MHz 19200这个同上<p>&nbsp; UCA0MCTL = UCBRS0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Modulation UCBRSx = 1设置的一个分频系数,不太清楚怎么配置,好像换成8M以后还可以用的<p>&nbsp; UCA0CTL1 &= ~UCSWRST;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Initialize USCI state machine<p>&nbsp; IE2 |= UCA0RXIE;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Enable USCI_A0 RX interrupt<p><br/><p>&nbsp; __bis_SR_register(LPM0_bits + GIE);&nbsp; &nbsp; &nbsp; &nbsp;// Enter LPM0, interrupts enabled<p>}<p><br/><p>//串口中断,有数据读取到时发生一个中断。。。。实例这边将受到的数据直接发送出去。当然可以可以做一个缓存,把收到的数据保存,然后出来<p>// Echo back RXed character, confirm TX buffer is ready first<p>#pragma vector=USCIAB0RX_VECTOR<p>__interrupt void USCI0RX_ISR(void)<p>{<p>&nbsp; while (!(IFG2 & UCA0TXIFG));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // USCI_A0 TX buffer ready?<p>&nbsp; UCA0TXBUF = UCA0RXBUF;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TX -> RXed character<p>}<p><br/><p>遇到的一个问题:<p><br/><p>使用串口助手调试的时候,发现有数据,但是数据完全错误。后来单独盘查,寄存器配置,串口线,与串口调试软件,均没有发现问题。后来把msp430烧写程序的烧录器拔掉好像就好了,可能是端口冲突!<p><br/> <p>今天学了一下msp430 ad转换,编程ad单通道单次转换。<p><br/><p>首先顺一下思路:<p><br/><p>adc12 :单通道单次转换流程,开了adc12on 后,shs (选择输入信号源)= 0,ENC上跳,adc12sc 上跳, 开始采样,经过采样保持时间,转换成功,值放在adc12MEMx中。发生中断,adcifg置位,读取后adc12mem 后,自动复位。<p><br/><p><br/><p><br/><p>相关寄存器:<p><br/><p>ADC12CTL0 : SHT0_2 + ADC12ON<p><br/><p>设置采样保持时间,打开内核<p><br/><p><br/><p><br/><p>ADC12CTL1 : SHS(DEFAULT) ,SHP(1) 定时器,<p><br/><p><br/><p><br/><p>ADC12CTL0:ENC,ADC12SC 置位<p><br/><p><br/><p><br/><p>while(1)<p><br/><p>{<p><br/><p>ADC12SC 置位;<p><br/><p>diaplay(转换数据);<p><br/><p>}<p><br/><p><br/><p><br/><p>interrupt()<p><br/><p>{<p><br/><p>&nbsp; read ADC12MEM0;<p><br/><p>}<p><br/><p><br/><p><br/><p><br/><p><br/><p>参考程序:<p><br/><p>#include <msp430x14x.h><p>&nbsp;<p>#define uchar unsigned char<p>#define uint unsigned int<p>uchar&nbsp; &nbsp;table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};<p>uchar&nbsp; position[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};<p>uchar count=1,count1=0,i,j;<p>uchar temp,result[4],index ;<p>&nbsp;<p>void show(uchar pos,uchar num)<p>{<p> P4OUT&nbsp; = 0x00;&nbsp; &nbsp;// tobe all turn off&nbsp;<p> P6OUT |= 0x40;&nbsp; &nbsp;// DUAN open<p> P4OUT&nbsp; = table[num];&nbsp; //DUAN NUM<p> P6OUT &= 0XBF;&nbsp; &nbsp;// DUAN close<p> <p>&nbsp; &nbsp; &nbsp; &nbsp; P4OUT&nbsp; = 0XFF;<p> P5OUT |= 0X20;<p> P4OUT &= position[pos];<p>&nbsp; &nbsp; &nbsp; &nbsp; P5OUT &= 0XDF;<p>&nbsp;<p>}<p>&nbsp;<p>void delayms(uint t)<p>{<p>&nbsp; &nbsp; uint i;<p>&nbsp; &nbsp; while(t--)<p>&nbsp; &nbsp; &nbsp; for(i=110;i>0;i--);//进过参数的调整&nbsp;<p>}<p>&nbsp;<p>//单通道单次转换*/<p>void init_adc()<p>{<p>&nbsp;P6SEL |= 0X01;<p>&nbsp;ADC12CTL0 = SHT0_2 + ADC12ON;<p>&nbsp;<p>&nbsp;ADC12CTL1 = SHP;<p>&nbsp;ADC12CTL0 |=ENC;<p>&nbsp;ADC12IE =0X01;<p>&nbsp;<p>&nbsp;ADC12CTL0 |= ADC12SC;<p>}<p>&nbsp;<p>void change()<p>{<p>&nbsp; uchar i=0;<p>while(temp)<p>&nbsp; &nbsp; &nbsp;{<p>&nbsp; &nbsp; &nbsp; &nbsp;result[4-i++] = temp%10;<p>&nbsp; &nbsp; &nbsp; &nbsp;temp /= 10;<p>&nbsp; &nbsp; &nbsp;}<p>}<p>&nbsp;<p>void display()<p>{<p>&nbsp;uchar i;<p>&nbsp; for(i=0;i<4;i++)<p>&nbsp; {<p>&nbsp; &nbsp; show(i,result[i]);<p>&nbsp; &nbsp; delayms(2);<p>&nbsp; }<p>}<p>&nbsp;<p>&nbsp;<p>&nbsp;<p>void main(void)<p>{<p>&nbsp; &nbsp; WDTCTL = WDTPW + WDTHOLD;<p>&nbsp; &nbsp; P6DIR |= BIT2;<p>&nbsp; &nbsp; P6OUT |= BIT2;<p>&nbsp; &nbsp; _EINT();<p>&nbsp; &nbsp; init_adc();<p>&nbsp; &nbsp; P6DIR |= 0X40;&nbsp; &nbsp;// p6^6 output<p>&nbsp; &nbsp; P5DIR |=0X20;&nbsp; &nbsp; // P5^5 OUTPUT<p>&nbsp; &nbsp; P4DIR&nbsp; = 0XFF;&nbsp; &nbsp;//&nbsp; P4 OUTPUT<p>&nbsp; &nbsp;&nbsp;<p>&nbsp; &nbsp; while(1)<p>&nbsp; &nbsp; {<p>&nbsp; &nbsp; &nbsp; ADC12CTL0 |= ADC12SC; //BEGAIN TRANSFER<p>&nbsp; &nbsp; &nbsp; change();<p>&nbsp; &nbsp; &nbsp;display();<p>&nbsp; &nbsp; }<p>&nbsp; &nbsp;&nbsp;<p>}<p>&nbsp;<p>#pragma vector = ADC12_VECTOR<p>__interrupt void adc12(void)<p>{<p>&nbsp; temp = ADC12MEM0;<p>&nbsp;&nbsp;<p>} 

讯享网
小讯
上一篇 2025-04-15 18:53
下一篇 2025-05-04 08:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/187799.html