【MSP430F5529测评】3. CCS开发环境 & UART 传输波形数据
<div class='showpostmsg'> 本帖最后由 wuguangtao 于 2020-11-7 09:44 编辑<h1 cid="n23" mdtype="heading">MSP430F5529LP CCS开发环境 && 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> </p>
<h3 cid="n27" mdtype="heading">下载安装CCS10</h3>
<p>最新CCS已经是CCS10,到官网下载最新版即可。</p>
<p> </p>
<p cid="n28" mdtype="paragraph"></p>
<p cid="n28" mdtype="paragraph"> </p>
<p cid="n28" mdtype="paragraph">安装过程比较简单,不断下一步就可以了。</p>
<p cid="n28" mdtype="paragraph"> </p>
<p cid="n28" mdtype="paragraph"></p>
<p cid="n28" mdtype="paragraph"> </p>
<p cid="n28" mdtype="paragraph">装好后的首页是下面这样的,可以导入、新建项目。还有简单的视频教程,方便初学者入门使用。</p>
<p cid="n28" mdtype="paragraph"> </p>
<p cid="n28" mdtype="paragraph"></p>
<p cid="n28" mdtype="paragraph"> </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"> </p>
<p cid="n30" mdtype="paragraph"></p>
<p cid="n30" mdtype="paragraph"> </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"> </p>
<p cid="n30" mdtype="paragraph"></p>
<p cid="n30" mdtype="paragraph"> </p>
<p cid="n30" mdtype="paragraph">软件资源中包含大量的例程,针对不同的片上外设和特定应用,分寄存器编程和函数库编程两大类,每一类都有非常详细完整的例程,我们可以根据需求将例程直接导入到CCS开发环境当中。</p>
<p cid="n30" mdtype="paragraph"><br />
</p>
<p cid="n30" mdtype="paragraph"> </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> </p>
<p cid="n32" mdtype="paragraph"></p>
<p cid="n32" mdtype="paragraph">其中每个例程下面都有个文件夹 driverlib, 就是我们的函数库了,使用函数库的时候,有可能需要看看库函数源码,对理解和优化代码会有帮助。</p>
<p cid="n32" mdtype="paragraph"> </p>
<p cid="n32" mdtype="paragraph"></p>
<p cid="n32" mdtype="paragraph"> </p>
<h3 cid="n33" mdtype="heading">新建项目</h3>
<p>ok, 接下来看看如何新建项目,菜单栏 Project-> new CCS project , 如下图所示,可以创建空项目,也可以使用模板,比如LED blink</p>
<p> </p>
<p cid="n34" mdtype="paragraph"></p>
<p cid="n34" mdtype="paragraph"> </p>
<p cid="n34" mdtype="paragraph">这就是寄存器例程中最简单的那个。</p>
<p cid="n34" mdtype="paragraph"> </p>
<p cid="n34" mdtype="paragraph"></p>
<p cid="n34" mdtype="paragraph"> </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"> </p>
<p cid="n37" mdtype="paragraph"></p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph">首先选择energia的安装路径。</p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph"></p>
<p cid="n37" mdtype="paragraph">然后选择代码路径,这里可以新建。</p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph"></p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph">CCS根据energia安装路径自动检索出例程,我们只需选择所需然后导入即可。</p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph"></p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph">确定后来了个提示框,yes继续。</p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph"></p>
<p cid="n37" mdtype="paragraph"> </p>
<p cid="n37" mdtype="paragraph">这样就出现在左侧目录了,同样可以正常编译下载。</p>
<p cid="n37" mdtype="paragraph"> </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|------------>
// | | 115200 - 8N1
// | P4.5/UCA1RXD|<------------
//
// Bhargavi Nisarga
// Texas Instruments Inc.
// April 2009
// Built with CCSv4 and IAR Embedded Workbench Version: 4.21
//******************************************************************************
#include <msp430.h>
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 &= ~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&UCTXIFG)); // USCI_A1 TX buffer ready?
UCA1TXBUF = UCA1RXBUF; // TX -> 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 <msp430.h>
#include <stdio.h>
#include <string.h>
void send_char(char c)
{
while (!(UCA1IFG&UCTXIFG)); // USCI_A1 TX buffer ready?
UCA1TXBUF = c;
}
void send_strings(char *str)
{
while(*str<i><i> != '\0') {
</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'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
__delay_cycles(50000); // waiting for device ready
send_strings("hello world!\r\n");
__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, "line1=%d, line2=%d\r\n", line1, line2);
send_strings(tmp);
__delay_cycles(500000);
if (line2 >= 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&UCTXIFG)); // USCI_A1 TX buffer ready?
UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
</code></pre>
<p><i><i><i> </i></i></i></p>
<p>代码功能比较简单,实现了一个UART发送字符串的功能函数send_string, 然后在发送一个hello world!之后开始发送两条波形数据。</p>
<p>发送格式参考调试工具的说明信息:</p>
<pre>
<code>波形通讯协议:
名称 = 数值 + "\r\n" 。一行中包含多条数据可以用 ‘,’ 分割。
例:
添加两条曲线, 名称分别为 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> </p>
<p>使用工具栏的工具进行编译(build), 下载(flash) 或者调试(debug)</p>
<p> </p>
<p></p>
<p> </p>
<p>以上操作会伴随着一些log,如下所示,有编译过程,已经对代码的优化建议等等。如果编译出错会有error信息。</p>
<p> </p>
<p></p>
<p> </p>
<p><strong><span style="font-size:20px;">UART波形数据接收显示测试</span></strong></p>
<p> </p>
<p>好啦,一切准备就绪,编译上述代码,flash到开发板,然打开串口调试工具。</p>
<p>下面来看看测试结果,首先看到的是hello world!, 然后是不断接收到的两组波形数据。</p>
<p></p>
<p> </p>
<p>然后切到波形显示界面,这里需要我们手动添加曲线名称,名称和发送的要保持一致,否则无法显示。</p>
<p> </p>
<p></p>
<p> </p>
<p>由于自动回传功能还在,我们还可以使用调试工具发送一个数据帧,搞些小破坏。这样调试工具收到后就多了些尖刺,哈哈。</p>
<p> </p>
<p></p>
<p> </p>
<p><strong><span style="font-size:20px;">小结</span></strong></p>
<p> </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> <p>之前大学电子设计大赛用的就是这款芯片,还不错,你这写的步骤有点详细,点赞!</p>
<p>CCS集成energia了?好怪异。</p>
freebsder 发表于 2020-11-6 22:02
CCS集成energia了?好怪异。
<p>类似插件吧,可以导入energia用的库,也可以正常编译下载,挺方便的。</p>
<p><strong><a href="https://bbs.eeworld.com.cn/elecplay/content/142" target="_blank">TI 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>
<p>挺好的,谢谢分享</p>
页:
[1]