[MSP430G2 LaunchPad入门系列] 第1篇 - MSP430简介及CCS开发环境

本章中将对MSP430系列做总体介绍,并帮助大家熟悉MSP430的开发环境——CCS。

本章目录如下:

章节 题目 链接
1.1 MSP430简介 点击链接直达1.1节
1.2 MSP430G2 LaunchPad介绍 点击链接直达1.2节
1.3 新建CCS工程 点击链接直达1.3节
1.4 如何导入现有CCS工程 点击链接直达1.4节
1.5 单片机C语言入门 点击链接直达1.5节

 

本章PDF文档下载链接:

第一章-MSP430简介及CCS开发环境.pdf

本章实验例程下载:

Lab1.zip

 

欢迎大家提出宝贵的反馈意见!

 

 

TI大学计划

钟舒阳

Email: chinauniv@ti.com

9 个回复

  • 1.1 MSP430简介

    单片机是一个集成电路芯片,是包括了CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能并将其集成到一块硅片上构成的一个小而完善的微型计算机系统。一般把单片机也称为Microcontroller,或MCU。

    单片机的应用极其广泛,大到汽车、工业,小到家电、个人消费电子品,里面都有单片机的身影。可以说凡是要进行控制和运算的应用,都有单片机的用武之地。

    MSP430是由TI推出的16位的单片机,发展到现在MSP430已有多个系列共500多种型号。不同的MSP430系列集成了不同的外设,主要包括有Flash、RAM、定时器、GPIO、ADC、串行通信模块等。

    MSP430以低功耗而闻名,其低功耗水平在业界领先,非常适用于电池供电设备等对于功耗要求较高的领域。

    本教程中我们将用到的是MSP430G2553这个型号,属于MSP430G2xx系列。这个系列在MSP430产品线中具有很高的性价比,最高主频可到16MHz,并集成了多种外设。

    MSP430G2553的主要特性如下:

    • 高达 16MHz 的 CPU 速度
    • 1.8V 至 3.6V 工作电压
    • 16KB Flash,512字节RAM
    • 模拟与数字外设的广泛性能
    • 推出电容式触摸感测 I/O 端口

    MSP430G2553中集成的外设包括GPIO、定时器、ADC、比较器、USCI串行通信、电容触摸等。我们将在后续章节分别介绍各个外设的使用。

  • 1.2 MSP430G2 LaunchPad介绍

    MSP430G2 LaunchPad是基于TI MSP430G2553单片机的口袋实验板。此板麻雀虽小,五脏俱全。除了排针扩展芯片引脚之外,板上还有两个按键、两个LED,另外板上带有板载仿真器,只需要一根USB线就可以直接连接电脑进行编程和仿真。

    拿到MSP430G2 LaunchPad之后,首先看到板子分为上下两个区域。上边区域是板载仿真器,用于向单片机下载程序以及进行在线仿真;下边区域包括单片机主芯片MSP430G2553,左右两排插针分别对应单片机的20个引脚。左下方按钮连接单片机的P1.3口,可以由用户自定义编程,两个LED分别通过跳线帽连接P1.0和P1.6,如需断开LED只要拔掉跳线帽即可。芯片旁边还留出了外部晶振的焊盘,如果需要使用外部晶振,只要将包装中的晶振焊接到焊盘上即可。

    关于此LaunchPad的介绍可以到TI官网获取更详细的信息:http://www.ti.com.cn/tool/cn/MSP-EXP430G2

    更多MSP430G2 LaunchPad相关文档下载:

  • 1.3 新建CCS工程

    我们在第0篇中已经介绍了如何下载和安装CCS。下面我们就来介绍如何利用CCS新建一个工程。

    首先我们需要理解什么是一个CCS工程。CCS工程中包含所有程序源文件、头文件和库文件,另外工程文件中还会记录程序编译的设置。

    CCS中还有一个workspace工作空间的概念,一个workspace中会包含一个用户编写的多个工程,类似于windows的登录用户,workspace中会将用户的设定存储下来,这样每次打开一个workspace,上次用户关闭时的界面将原封不动的恢复出来。

     

    1.3.1 首次使用CCS

    1)   打开CCS,会弹出一个对话框请用户选择workspace的路径,可以选择任意一个文件夹,但请注意路径必须为全英文,不能有中文字符。下方的“Use this as the default and do not ask again”不建议勾选,如果勾选CCS之后将把此路径作为默认workspace路径不再更改。选择好workspace之后单击OK进入CCS。

    Workspace文件夹中包含所有的CCS设置,包括工程的设置和视图,这样workspace再次打开时可以看到上一次关闭时的工程。Workspace中还包含所有工程的列表,当CCS关闭时workspace会被自动保存。

    2)   第一次打开CCS时,会弹出“License Setup Wizard”对话框。针对MSP430单片机,请选择“CODE SIZE LIMITED(MSP430)”这个选项即可正常使用。

    3)   接下来应该可以看到TI Resource Explorer窗口出现在CCS中。TI Resource Explorer中包含了各种文档和例程,我们将会在后面的章节讨论。现在请先点击TI Resource Explorer标签上的"x"关闭此窗口。

    4)   现在应该可以看到一个空白的CCS工作区窗口,如下图。

    请注意右上角的“CCS Edit”按钮,CCS提供了两种工作区模式,现在我们看到的工作区是在“CCS Edit”模式下的,此时各功能区布局、工具栏、菜单等都如上图所示,是为了方便创建、编写、及编译程序所设的。另外还有一个“CCS Debug”模式,当用户点击debug按钮时,CCS会自动进入此模式,此时会出现一排debug工具栏,方便用户进行调试。

     

    1.3.2 创建一个新工程(Project)

    在CCS工程中包含了所有源文件以及输出的可执行文件(.out文件)。要创建一个CCS工程,请点击:File -> New -> CCS Project

    出现如下对话框。Project name中填写项目名称Temperature_Sense_Demo,Device菜单中选择芯片型号MSP430G2553,项目模板选择Empty Project (with main.c),然后点击Finish。

    CCS的workspace中会出现刚刚新建的工程,单击工程名称,会出现active字样,代表正在对当前工程进行操作。

     

    1.3.3 编辑源代码

    接下来,我们在main.c文件中加入源代码。在main.c中手动敲入以下代码:

    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
      P1DIR |= 0x01;                            // Set P1.0 to output direction
    
      for (;;)
      {
        volatile unsigned int i;
    
        P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR
    
        i = 50000;                              // Delay
        do (i--);
        while (i != 0);
      }
    }
    

    或者打开Labs文件夹,在Lab1.txt中也能找到上述源代码,将代码拷贝到main.c中。

     

    1.3.4 编译并运行程序

    1)   点击“Debug”按钮  ,CCS会自动保存当前源代码,完成程序编译,并将程序下载到LaunchPad中。如果出现Ultra-Low-Power Advisor (ULP Advisor) 的提示窗口,点击Proceed即可。

    程序下载结束后,CCS会自动进入Debug视图。

    2)   在Debug视图下,可以看到下图所示的调试工具按钮。点击运行按钮  ,程序将开始运行。如一切正常,将会看到LaunchPad上的红色LED灯以一定频率闪烁。

    如果想暂停程序,可以点击暂停按钮  。如果点击停止按钮  ,程序会停止运行且CCS将退出Debug视图,但请注意程序将会保持在单片机的flash存储器中,下次上电时程序仍将从头开始执行。

    3)   点击停止按钮退出Debug视图之后,右键单击工程名,在菜单中选择Delete,从当前workspace中删除Lab1工程。注意在确认对话框中有选项“Delete project contents on disk”,请不要勾选此选项,否则将删除硬盘中的工程文件。我们下一节还将用到刚才的工程文件。

  • 1.4 如何导入现有CCS工程

    本节将介绍如何导入一个现有的工程。上一节最后一步我们从workspace中删除了Lab1工程,但工程文件其实还保存在workspace所在的文件夹中(默认路径是C:\Users\用户名\workspace_v5_x),下面我们就把此工程再导入到CCS中。

    在CCS菜单中选择Project->Import Existing CCS Eclipse Project,点击Browse找到CCS workspace所在文件夹,点击OK,CCS会自动将所选文件夹及其子文件夹下所有的CCS Projects列出。从列表中找到Lab1,点击Finish即可导入此工程。

    在导入工程时有一个选项是“Copy projects into workspace”,请不要勾选,因为Lab1本身已经在workspace文件夹中。如果是从其他位置导入,勾选此选项将会将工程复制到workspace中。

    为何有些工程无法导入?

    在导入工程时,有时会发现有些工程是灰色的,无法勾选(如下图所示)。这是因为workspace中已有同名的工程了(无论内容是否完全一致)。如果是自己重复导入工程,把之前的工程文件删除即可;如果确实重名了,解决办法只能是修改其中一个工程的名称。

     

    导入MSP430ware例程

    在CCS中有一个非常实用的资源库叫做MSP430ware,其中有MSP430系列所有芯片的文档资料,以及丰富的例程。用好这个资源库可以让我们的MSP430学习之旅事半功倍。

    在CCSv5.x中打开View->TI Resource Explorer菜单,在package处选择MSP430ware,即可打开资源库主界面。在主菜单中共有3个功能,分别是Device、Development Tools和Libraries。

    在最新的CCSv7版本中,Resource Explorer已经改为在线版,需要联网才能使用。另外也可以直接访问TI的Resource Explorer网站来浏览其中的内容:

    http://dev.ti.com/tirex/#/

     

    下面还是先分别介绍CCSv5中的MSP430Ware的3个主要功能:

    1)   Device:包含MSP430系列所有芯片的Datasheet、User’s Guide等文档,以及针对芯片的例程库,还有图形化工具Grace例程;

    2)   Development Tools:包含所有MSP430开发套件的User’s Guide以及硬件文档,同时还有针对板卡的例程;

    3)   Libraries:有TI官方提供的针对MSP430的代码库,包括外设驱动库Driverlib、图形处理库Graphics Library、USB开发库、电容触摸库等等。这些库为用户提供了封装好的函数,使用这些库可以在不关心芯片具体寄存器的情况下编程,也方便了程序在不同芯片之间进行移植。

     

    使用Driverlib虽然方便,但是针对单片机进行编程还是直接对寄存器进行操作能够真正从底层优化程序,另外从学习角度来讲也还是需要了解单片机的结构和寄存器。因此这里推荐大家最经常使用的还是Device中的Code Examples。下面我们就举例说明如何将MSP430ware中的例程导入workspace。

    展开Device菜单,找到要编程的目标芯片(MSP430G2xx),再展开Code Examples并找到MSP430G2x53,单击芯片名称后右侧会出现例程的列表。其中包括工程名称和描述。仔细看一下,工程名称是以“芯片名+外设名+序号”来命名的,也就是说每一个外设都有多个例程。为什么会有这么多例程呢?看一下右边的描述就会发现一个外设下不同的例程是根据外设的不同模式来编写的,例如GPIO例程有4个,分别是针对输出、输入、中断等不同的模式。

     

    下面用一个简单的例子来说明怎么把例程导入到workspace中。请在例程列表中找到“msp430g2xx3_1”这个工程,看右边的描述就知道这个例程是一个简单的切换I/O口状态的例程,可以实现P1.0对应的LED闪烁。点击工程名,在出现的菜单中选择芯片MSP430G2553,然后单击OK,左边的工程列表中就会出现对应的工程了。

    MSP430ware中的例程不仅数量多,而且程序规范、注释完整,是我们学习单片机编程的好帮手。在学习单片机的各个外设时,不妨先到MSP430ware的例程库中看一看对应的例程,对于我们理解和掌握MSP430单片机大有帮助。

     

  • 1.5 单片机C语言入门

    1.5.1 单片机的寄存器

    在前面的示例程序中我们发现对单片机进行编程实际上就是改写寄存器的值。单片机各个外设的功能其实是预先固定的,而寄存器就像是这些功能的控制接口,通过改变寄存器的值就可以在这些功能中进行选择。还有一些寄存器直接对应引脚的状态,例如GPIO的输入/输出寄存器。像以下语句:

    P1OUT = 0x01;

    这句话其实就是赋值给P1OUT这个寄存器,这个寄存器是GPIO的输出寄存器,赋值之后对应引脚的输出状态就会发生改变。

    P1OUT寄存器共有8位,分别是从P1.0-P1.7。要给这个寄存器赋值,其实就是写入一个8位的二进制数值,例如0000 0001。在C语言中,为了尽量精简代码,一般把这个8位二进制数换算成2位16进制数,前面加上“0x”表示这是一个16进制的值。这样二进制的0000 0001也可以表示为0x01,那么上面一句P1OUT = 0x01实际上是把P1.0赋值为1,P1.1-P1.7赋值为0。

    每次上电之后,寄存器都会回到它们的初始值。MSP430G2系列单片机中所有寄存器的说明都在“MSP430x2xx Family User's guide”这篇文档中。使用哪个外设,就到文档对应章节中去查找寄存器的定义。

     

    1.5.2 MSP430的位操作

    上一节的例子中我们发现MSP430单片机的寄存器赋值都是直接给整个寄存器赋值,如

    P1OUT = 0x01;

    那如果只想给寄存器其中的一位赋值,能否直接对某位进行操作呢?答案是不可以。因为MSP430属于RISC精简指令集单片机,它有一个特点就是不能进行位操作。那么如果只想操作某一位,而不关心其它位,例如我只想把P1.0赋值为1,但我不知道也不想改变P1.1-P1.7的状态,该怎么办呢?下面就来介绍MSP430中进行位操作的办法。

    1)写位操作

    在对某字节使用“=”进行写操作时,所有位的值都将被改变。如果先将原字节读出来,再使用按位操作符对原字节进行赋值,则可“等效”实现对单个位的写操作。下面举例来说明MSP430中最重要的3个写位操作语句。

    例: P1.01P1.10P1.2取反,不影响其他位。 

    P1OUT |= 0x01;           //按位“或”,相当于置1	
    P1OUT &= ~0x02;          //取反后再按位“与”,相当于置0
    P1OUT ^= 0x04;           //按位“异或”,相当于取反

    在CCS新建工程时,都会包含“MSP430.h”,这个头文件其实相当于一个目录,会根据当前工程所选的芯片型号链接到对应的头文件,例如MSP430G2553芯片就会链接到“MSP430G2553.h”。这些头文件都在“C:\ti\ccsv5\ccs_base\msp430\include”目录下,其中包含了许多宏定义,利用这个宏定义可以帮助我们用更直观的方式来写寄存器,不用每次都把要写的值换算成16进制了。

    例如MSP430G2553.h中有如下宏定义:

    #define BIT0                   (0x0001)
    #define BIT1                   (0x0002)
    #define BIT2                   (0x0004)
    #define BIT3                   (0x0008)
    #define BIT4                   (0x0010)
    #define BIT5                   (0x0020)
    #define BIT6                   (0x0040)
    #define BIT7                   (0x0080)
    #define BIT8                   (0x0100)
    #define BIT9                   (0x0200)
    #define BITA                   (0x0400)
    #define BITB                   (0x0800)
    #define BITC                   (0x1000)
    #define BITD                   (0x2000)
    #define BITE                   (0x4000)
    #define BITF                   (0x8000)

    有了BIT0-BITF的宏定义,上面例子中的语句就可以改写为

    P1OUT |= BIT0;           //按位“或”,相当于置1	
    P1OUT &= ~BIT1;          //取反后再按位“与”,相当于置0
    P1OUT ^= BIT2;           //按位“异或”,相当于取反

    另外,也可以用加号对多位同时操作。例如要将P1.0、P1.1、P1.2均置1,不影响其他位,可以写

    P1OUT |= BIT0 + BIT1 + BIT2;

    请注意,采用按位操作并不意味着MSP430具备了位操作能力,按位操作实际上对整个字节的8位都进行了操作,只不过对其中7位的值没影响而已。

     

    2)读位操作

    读位操作主要是通过if语句判断的方式得到的。同样,这种变通的方法不意味着MSP430单片机可以对位进行读取,这种方法同样需要对1个字节的8位都操作。

    例: P2.0的输出设置成P1.1输入相反,读取P1.0输入状态到变量temp

    unsigned char temp = 0;
    if((P1IN&BIT1) == 0)    P2OUT |= BIT0;           //读P1.1 写P2.0
    else                    P2OUT &= ~BIT0;
    if(P1IN&BIT0)           temp = 1;                //读P1.0 写temp
    else                    temp = 0;

      

    1.5.3 MSP430寄存器的宏定义配置方法

    上一节提到了MSP430G2553.h这个头文件,实际上里面除了BIT0-BITF的宏定义之外还有很多的宏定义。这是因为MSP430的片上外设极为丰富,因此也有大量的寄存器来配置功能。MSP430上有数百个寄存器和近千个控制位,如果靠记忆这些寄存器的每一位的定义是不现实的,因此头文件的宏定义能帮助我们以更直观的方式来写程序。

    例如下图中给出了BCSCTL2寄存器中DIVMx控制位的位置,下方代码中给出了MSP430头文件中两种DIVMx的宏定义,即DIVM0/1和DIVM_0/1/2/3。图中rw-0表示该位可读可写,复位后初始值为0。

    #define DIVM_0                 (0x00)         /* MCLK Divider 0: /1 */
    #define DIVM_1                 (0x10)         /* MCLK Divider 1: /2 */
    #define DIVM_2                 (0x20)         /* MCLK Divider 2: /4 */
    #define DIVM_3                 (0x30)         /* MCLK Divider 3: /8 */

    这个8位寄存器中的DIVMx是用来控制MCLK的分频系数的,分频系数依次为1/2/4/8。例如我们要设置MCLK的时钟8分频,下列3条代码均可实现该功能:

    BCSCTL2 |= 0x30;           //人脑记忆+数脚趾头,最笨的方式
    BCSCTL2 |= BIT5 + BIT4;    //需记忆DIVMx在寄存器中的位置,不推荐
    BCSCTL2 |= DIVM_3;         //简洁明了,力荐
    

  • 对于我这种需要入门的同学可以说是通俗易懂了,求下面章节的教程!!!
  • 回复 user5335290:

    您好,此系列教程会在电赛论坛继续连载,请参考以下网址:

    https://bbs.nuedc-training.com.cn/forum-43-1.html

  • 回复 Shuyang Zhong:

    你好,请问有新的连接吗,这个板块不存在了