本帖最后由 wuguangtao 于 2020-11-7 09:44 编辑
MSP430F5529LP CCS开发环境 && UART通信测试
前面两节使用的energia是非常方便测试的集成软件,但是集成度过高,不太适合自定义,对于复杂需求还是需要通过CCS或者IAR等开发工具去实现。
今天着重讲讲CCS开发环境的搭建和使用,然后在CCS中通过寄存器编程实现UART 数据传输功能。并使用串口调试工具进行接收和显示波形。
CCS10 开发环境
下载安装CCS10
最新CCS已经是CCS10,到官网下载最新版即可。
安装过程比较简单,不断下一步就可以了。
装好后的首页是下面这样的,可以导入、新建项目。还有简单的视频教程,方便初学者入门使用。
resource explorer
注意到首页还有个醒目的Resource Explorer,就是资源管理器,里面有非常非常丰富的资源,包括各种TI MCU、开发板的官方资料(datasheet,开发板原理图,例程,函数库等),一定要善加利用。
插上板子以后可以自动识别MSP430F5529LP, 在左侧目录就会自动过滤出对应的开发工具和软件资源。
为了方便离线查阅,可以右键下载保存至本地。
软件资源中包含大量的例程,针对不同的片上外设和特定应用,分寄存器编程和函数库编程两大类,每一类都有非常详细完整的例程,我们可以根据需求将例程直接导入到CCS开发环境当中。
上图是一个最简单的寄存器例程,关闭了看门狗以后就循环闪烁LED灯。在右上角有一个导入按钮,点击后会自动出现在开发目录当中。
PS:值得说明的是,可能是国内网络的问题,resource explorer有时候无法打开,所以非常有必要下载到本地,如果软件中不能打开,也可以通过浏览器在官网下载 MSP430WARE
库函数
下面看看库函数,在资源管理器中有专门的Driver Library, 下面有用户手册和例程,每个例程对应一个box的图标,后面三点可以用来导入。非常方便有木有。
而且提供了一个EmptyProject,只包含函数库的头文件和一个main函数,当做模板再合适不过了。
其中每个例程下面都有个文件夹 driverlib, 就是我们的函数库了,使用函数库的时候,有可能需要看看库函数源码,对理解和优化代码会有帮助。
新建项目
ok, 接下来看看如何新建项目,菜单栏 Project-> new CCS project , 如下图所示,可以创建空项目,也可以使用模板,比如LED blink
这就是寄存器例程中最简单的那个。
导入energia代码
从新建项目的对话框我们可以看到,CCS还支持从Resource explorer 和 energia导入,Resource explorer导入已经说过了,接下来看下energia部分。
CCS居然也支持energia代码编译,厉害了。导入流程如下:
首先选择energia的安装路径。
然后选择代码路径,这里可以新建。
CCS根据energia安装路径自动检索出例程,我们只需选择所需然后导入即可。
确定后来了个提示框,yes继续。
这样就出现在左侧目录了,同样可以正常编译下载。
好啦,至此关于CCS开发环境的基本情况就介绍完了,其它更多功能慢慢探索吧。
UART 通信
安装配置好了CCS,当然要实际操练起来,那么还是先拿UART下手,但是这次不是使用函数库,而是使用寄存器编程。
为了直接使用开发板集成的串口,我们需要选择USCI_A1 UART 接口,但是resource explorer并没有与之对应的例程,只有USCI_A0 UART的,没关系。只是接口不一样,导入后修改一下就可以。把例程中的P3.3 和 P3.4 改成P4.4, P4.5, 同时将对应的寄存器都从A0改为A1就可以了。
基本通信
下面就是使用例程修改接口后的UART程序。
//******************************************************************************
// 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;
}
}
例程首条指令都是关闭看门狗,然后配置UCSI_A1的UART接口、时钟SMCLK、波特率(115200bps), 之后开启UART接收终端,最后进入LPM0低功耗模式,并开启全局中断使能GIE。
在接收中断中,将接收到的字节原封不动的发送回去,就是这么简单。测试过程就不写了,比较简单。
传输波形数据
接下来再来修改下例程,除了自动回传外,我们来发送一些波形数据,然后在PC端使用串口调试工具(Windows 应用商店下载的串口调试工具),这款工具有个根据串口数据自动绘图的功能,有点意思,拿来测试再好不过啦。
#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 != '\0') {
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[32] = {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;
}
}
代码功能比较简单,实现了一个UART发送字符串的功能函数send_string, 然后在发送一个hello world!之后开始发送两条波形数据。
发送格式参考调试工具的说明信息:
波形通讯协议:
名称 = 数值 + "\r\n" 。一行中包含多条数据可以用 ‘,’ 分割。
例:
添加两条曲线, 名称分别为 Line1 Line2
两种字符串格式
Line1=10.0 , Line2=200\r\n 以回车换行结束。
Line1=10.0 , Line2=200, 以逗号结束。
编译下载
使用工具栏的工具进行编译(build), 下载(flash) 或者调试(debug)
以上操作会伴随着一些log,如下所示,有编译过程,已经对代码的优化建议等等。如果编译出错会有error信息。
UART波形数据接收显示测试
好啦,一切准备就绪,编译上述代码,flash到开发板,然打开串口调试工具。
下面来看看测试结果,首先看到的是hello world!, 然后是不断接收到的两组波形数据。
然后切到波形显示界面,这里需要我们手动添加曲线名称,名称和发送的要保持一致,否则无法显示。
由于自动回传功能还在,我们还可以使用调试工具发送一个数据帧,搞些小破坏。这样调试工具收到后就多了些尖刺,哈哈。
小结
工欲善其事必先利其器,学会开发工具的使用是非常必要的,同时善于查阅官方资料也是非常重要的,本章首先讲述了CCS软件的安装和使用,最后以UART串口通信为例说明其开发流程,结合串口调试工具完成了一个简单的测试。