wuguangtao 发表于 2020-11-5 22:08

【MSP430F5529测评】3. CCS开发环境 & UART 传输波形数据

<div class='showpostmsg'> 本帖最后由 wuguangtao 于 2020-11-7 09:44 编辑

<h1 cid="n23" mdtype="heading">MSP430F5529LP CCS开发环境 &amp;&amp; UART通信测试</h1>

<p cid="n24" mdtype="paragraph">前面两节使用的energia是非常方便测试的集成软件,但是集成度过高,不太适合自定义,对于复杂需求还是需要通过CCS或者IAR等开发工具去实现。</p>

<p cid="n24" mdtype="paragraph">今天着重讲讲CCS开发环境的搭建和使用,然后在CCS中通过寄存器编程实现UART 数据传输功能。并使用串口调试工具进行接收和显示波形。</p>

<h2 cid="n25" mdtype="heading">CCS10 开发环境</h2>

<p></p>

<p>&nbsp;</p>

<h3 cid="n27" mdtype="heading">下载安装CCS10</h3>

<p>最新CCS已经是CCS10,到官网下载最新版即可。</p>

<p>&nbsp;</p>

<p cid="n28" mdtype="paragraph"></p>

<p cid="n28" mdtype="paragraph">&nbsp;</p>

<p cid="n28" mdtype="paragraph">安装过程比较简单,不断下一步就可以了。</p>

<p cid="n28" mdtype="paragraph">&nbsp;</p>

<p cid="n28" mdtype="paragraph"></p>

<p cid="n28" mdtype="paragraph">&nbsp;</p>

<p cid="n28" mdtype="paragraph">装好后的首页是下面这样的,可以导入、新建项目。还有简单的视频教程,方便初学者入门使用。</p>

<p cid="n28" mdtype="paragraph">&nbsp;</p>

<p cid="n28" mdtype="paragraph"></p>

<p cid="n28" mdtype="paragraph">&nbsp;</p>

<h3 cid="n29" mdtype="heading">resource explorer</h3>

<p cid="n30" mdtype="paragraph">注意到首页还有个醒目的Resource Explorer,就是资源管理器,里面有非常非常丰富的资源,包括各种TI MCU、开发板的官方资料(datasheet,开发板原理图,例程,函数库等),一定要善加利用。</p>

<p cid="n30" mdtype="paragraph">&nbsp;</p>

<p cid="n30" mdtype="paragraph"></p>

<p cid="n30" mdtype="paragraph">&nbsp;</p>

<p cid="n30" mdtype="paragraph">插上板子以后可以自动识别MSP430F5529LP, 在左侧目录就会自动过滤出对应的开发工具和软件资源。</p>

<p cid="n30" mdtype="paragraph"><br />
</p>

<p cid="n30" mdtype="paragraph">为了方便离线查阅,可以右键下载保存至本地。</p>

<p cid="n30" mdtype="paragraph">&nbsp;</p>

<p cid="n30" mdtype="paragraph"></p>

<p cid="n30" mdtype="paragraph">&nbsp;</p>

<p cid="n30" mdtype="paragraph">软件资源中包含大量的例程,针对不同的片上外设和特定应用,分寄存器编程和函数库编程两大类,每一类都有非常详细完整的例程,我们可以根据需求将例程直接导入到CCS开发环境当中。</p>

<p cid="n30" mdtype="paragraph"><br />
</p>

<p cid="n30" mdtype="paragraph">&nbsp;</p>

<p cid="n30" mdtype="paragraph">上图是一个最简单的寄存器例程,关闭了看门狗以后就循环闪烁LED灯。在右上角有一个导入按钮,点击后会自动出现在开发目录当中。</p>

<p cid="n30" mdtype="paragraph"><strong>PS:</strong>值得说明的是,可能是国内网络的问题,resource explorer有时候无法打开,所以非常有必要下载到本地,如果软件中不能打开,也可以通过浏览器在官网下载 <strong>MSP430WARE</strong></p>

<h3 cid="n31" mdtype="heading">库函数</h3>

<p>下面看看库函数,在资源管理器中有专门的Driver Library, 下面有用户手册和例程,每个例程对应一个box的图标,后面三点可以用来导入。非常方便有木有。</p>

<p>而且提供了一个EmptyProject,只包含函数库的头文件和一个main函数,当做模板再合适不过了。</p>

<p>&nbsp;</p>

<p cid="n32" mdtype="paragraph"></p>

<p cid="n32" mdtype="paragraph">其中每个例程下面都有个文件夹 driverlib, 就是我们的函数库了,使用函数库的时候,有可能需要看看库函数源码,对理解和优化代码会有帮助。</p>

<p cid="n32" mdtype="paragraph">&nbsp;</p>

<p cid="n32" mdtype="paragraph"></p>

<p cid="n32" mdtype="paragraph">&nbsp;</p>

<h3 cid="n33" mdtype="heading">新建项目</h3>

<p>ok, 接下来看看如何新建项目,菜单栏 Project-&gt; new CCS project , 如下图所示,可以创建空项目,也可以使用模板,比如LED blink</p>

<p>&nbsp;</p>

<p cid="n34" mdtype="paragraph"></p>

<p cid="n34" mdtype="paragraph">&nbsp;</p>

<p cid="n34" mdtype="paragraph">这就是寄存器例程中最简单的那个。</p>

<p cid="n34" mdtype="paragraph">&nbsp;</p>

<p cid="n34" mdtype="paragraph"></p>

<p cid="n34" mdtype="paragraph">&nbsp;</p>

<h3 cid="n35" mdtype="heading">导入energia代码</h3>

<p cid="n36" mdtype="paragraph">从新建项目的对话框我们可以看到,CCS还支持从Resource explorer 和 energia导入,Resource explorer导入已经说过了,接下来看下energia部分。</p>

<p cid="n36" mdtype="paragraph">CCS居然也支持energia代码编译,厉害了。导入流程如下:</p>

<p cid="n36" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph"></p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph">首先选择energia的安装路径。</p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph"></p>

<p cid="n37" mdtype="paragraph">然后选择代码路径,这里可以新建。</p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph"></p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph">CCS根据energia安装路径自动检索出例程,我们只需选择所需然后导入即可。</p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph"></p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph">确定后来了个提示框,yes继续。</p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph"></p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph">这样就出现在左侧目录了,同样可以正常编译下载。</p>

<p cid="n37" mdtype="paragraph">&nbsp;</p>

<p cid="n37" mdtype="paragraph">好啦,至此关于CCS开发环境的基本情况就介绍完了,其它更多功能慢慢探索吧。</p>

<h2 cid="n38" mdtype="heading">UART 通信</h2>

<p cid="n39" mdtype="paragraph">安装配置好了CCS,当然要实际操练起来,那么还是先拿UART下手,但是这次不是使用函数库,而是使用寄存器编程。</p>

<p cid="n39" mdtype="paragraph">为了直接使用开发板集成的串口,我们需要选择USCI_A1 UART 接口,但是resource explorer并没有与之对应的例程,只有USCI_A0 UART的,没关系。只是接口不一样,导入后修改一下就可以。把例程中的P3.3 和 P3.4 改成P4.4, P4.5, 同时将对应的寄存器都从A0改为A1就可以了。</p>

<h3 cid="n55" mdtype="heading">基本通信</h3>

<p>下面就是使用例程修改接口后的UART程序。</p>

<pre>
<code class="language-cpp">//******************************************************************************
//   MSP430F552x Demo - USCI_A1, 115200 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A1 RX interrupt triggers TX Echo.
//   Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|01h)
//   ACLK = REFO = ~32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
//   See User Guide for baud rate divider table
//
//               MSP430F552x
//             -----------------
//         /|\|               |
//          | |               |
//          --|RST            |
//            |               |
//            |   P4.4/UCA1TXD|------------&gt;
//            |               | 115200 - 8N1
//            |   P4.5/UCA1RXD|&lt;------------
//
//   Bhargavi Nisarga
//   Texas Instruments Inc.
//   April 2009
//   Built with CCSv4 and IAR Embedded Workbench Version: 4.21
//******************************************************************************

#include &lt;msp430.h&gt;

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT

P4SEL |= BIT4+BIT5;                     // P4.4,5 = USCI_A1 TXD/RXD
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 &amp;= ~UCSWRST;                     // **Initialize USCI state machine**
UCA1IE |= UCRXIE;                         // Enable USCI_A1 RX interrupt

__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
__no_operation();                         // For debugger
}

// Echo back RXed character, confirm TX buffer is ready first
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A1_VECTOR))) USCI_A1_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break;                           // Vector 0 - no interrupt
case 2:                                 // Vector 2 - RXIFG
    while (!(UCA1IFG&amp;UCTXIFG));             // USCI_A1 TX buffer ready?
    UCA1TXBUF = UCA1RXBUF;                  // TX -&gt; RXed character
    break;
case 4:break;                           // Vector 4 - TXIFG
default: break;
}
}</code></pre>

<p>例程首条指令都是关闭看门狗,然后配置UCSI_A1的UART接口、时钟SMCLK、波特率(115200bps), 之后开启UART接收终端,最后进入LPM0低功耗模式,并开启全局中断使能GIE。</p>

<p>在接收中断中,将接收到的字节原封不动的发送回去,就是这么简单。测试过程就不写了,比较简单。</p>

<h3 cid="n67" mdtype="heading">传输波形数据</h3>

<p>接下来再来修改下例程,除了自动回传外,我们来发送一些波形数据,然后在PC端使用串口调试工具(Windows 应用商店下载的<strong>串口调试工具</strong>),这款工具有个根据串口数据自动绘图的功能,有点意思,拿来测试再好不过啦。</p>

<pre>
<code class="language-cpp">#include &lt;msp430.h&gt;
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

void send_char(char c)
{
    while (!(UCA1IFG&amp;UCTXIFG));             // USCI_A1 TX buffer ready?
    UCA1TXBUF = c;
}

void send_strings(char *str)
{
    while(*str<i><i> != &#39;\0&#39;) {
</i></i>      send_char(*str++);
    }
}

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT

P4SEL |= BIT4+BIT5;                     // P4.4,5 = USCI_A1 TXD/RXD
UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2;                     // SMCLK
UCA1BR0 = 9;                              // 1MHz 115200 (see User&#39;s Guide)
UCA1BR1 = 0;                              // 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0;            // Modulation UCBRSx=1, UCBRFx=0
UCA1CTL1 &amp;= ~UCSWRST;                     // **Initialize USCI state machine**
UCA1IE |= UCRXIE;                         // Enable USCI_A1 RX interrupt

__delay_cycles(50000);                  // waiting for device ready
send_strings(&quot;hello world!\r\n&quot;);
__bis_SR_register( GIE);                   // Enter LPM0, interrupts enabled

unsigned int i=0;
unsigned int line1, line2;
char tmp = {0};
while(1){
      i++;
      line1 = 20 * i + 1;   // y = 20x + 1
      line2 = i * i / 4;    // y = x^2 / 4

      memset(tmp, 0, sizeof(tmp));
      sprintf(tmp, &quot;line1=%d, line2=%d\r\n&quot;, line1, line2);
      send_strings(tmp);

      __delay_cycles(500000);

      if (line2 &gt;= 32768)
          break;
}
__bis_SR_register(LPM0_bits);            // Enter LPM0
__no_operation();
}

// Echo back RXed character, confirm TX buffer is ready first
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A1_VECTOR))) USCI_A1_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break;                           // Vector 0 - no interrupt
case 2:                                 // Vector 2 - RXIFG
    while (!(UCA1IFG&amp;UCTXIFG));             // USCI_A1 TX buffer ready?
    UCA1TXBUF = UCA1RXBUF;                  // TX -&gt; RXed character
    break;
case 4:break;                           // Vector 4 - TXIFG
default: break;
}
}

</code></pre>

<p><i><i><i>&nbsp;</i></i></i></p>

<p>代码功能比较简单,实现了一个UART发送字符串的功能函数send_string, 然后在发送一个hello world!之后开始发送两条波形数据。</p>

<p>发送格式参考调试工具的说明信息:</p>

<pre>

<code>波形通讯协议:

名称 = 数值 + &quot;\r\n&quot; 。一行中包含多条数据可以用 &lsquo;,&rsquo; 分割。


例:

添加两条曲线, 名称分别为 Line1 Line2

两种字符串格式
Line1=10.0 , Line2=200\r\n   以回车换行结束。
Line1=10.0 , Line2=200,   以逗号结束。</code></pre>

<p><strong><span style="font-size:20px;">编译下载</span></strong></p>

<p>&nbsp;</p>

<p>使用工具栏的工具进行编译(build), 下载(flash) 或者调试(debug)</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p>以上操作会伴随着一些log,如下所示,有编译过程,已经对代码的优化建议等等。如果编译出错会有error信息。</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p><strong><span style="font-size:20px;">UART波形数据接收显示测试</span></strong></p>

<p>&nbsp;</p>

<p>好啦,一切准备就绪,编译上述代码,flash到开发板,然打开串口调试工具。</p>

<p>下面来看看测试结果,首先看到的是hello world!, 然后是不断接收到的两组波形数据。</p>

<p></p>

<p>&nbsp;</p>

<p>然后切到波形显示界面,这里需要我们手动添加曲线名称,名称和发送的要保持一致,否则无法显示。</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p>由于自动回传功能还在,我们还可以使用调试工具发送一个数据帧,搞些小破坏。这样调试工具收到后就多了些尖刺,哈哈。</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p><strong><span style="font-size:20px;">小结</span></strong></p>

<p>&nbsp;</p>

<p>工欲善其事必先利其器,学会开发工具的使用是非常必要的,同时善于查阅官方资料也是非常重要的,本章首先讲述了CCS软件的安装和使用,最后以UART串口通信为例说明其开发流程,结合串口调试工具完成了一个简单的测试。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

w494143467 发表于 2020-11-5 22:42

<p>之前大学电子设计大赛用的就是这款芯片,还不错,你这写的步骤有点详细,点赞!</p>

freebsder 发表于 2020-11-6 22:02

<p>CCS集成energia了?好怪异。</p>

wuguangtao 发表于 2020-11-7 09:37

freebsder 发表于 2020-11-6 22:02
CCS集成energia了?好怪异。

<p>类似插件吧,可以导入energia用的库,也可以正常编译下载,挺方便的。</p>

okhxyyo 发表于 2020-11-8 22:45

<p><strong><a href="https://bbs.eeworld.com.cn/elecplay/content/142" target="_blank">TI&nbsp;MSP430F5529测评</a></strong></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1146790-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1146790-1-1.html</a></p>

alan000345 发表于 2020-11-9 21:00

<p>挺好的,谢谢分享</p>
页: [1]
查看完整版本: 【MSP430F5529测评】3. CCS开发环境 & UART 传输波形数据