打印
[活动]

【开发板评测】像玩Arduino一样玩LaunchPad MSP430G2开发板

[复制链接]
852|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2020-3-1 10:50 编辑

近期因为疫情,一直关在家里,找到了几块好多年前在21ic.com参加活动弄的板子。其中就有我的第一块论坛获取的开发板MSP430G2的LaunchPad开发板。
之前才用CCStudio开发,需要熟悉很多寄存器的配置。最近我看到其实可以用MSP430版本的Arduino,也就是energia。下载这个软件超级难的。废了两天时间终于下载到最新版了,经过测试发现该版本的energia,可以正常编译,却无法上传,我不知道如何修复这个问题,搜索了一下,有一些国外网友发帖咨询过,但是没有人给出答案,这也许要深入研究Arduino的上传功能才行。然后我加了很多430的群,终于打探到了上一个版本。经过测试上一个版本energia-1.8.7E21可以正常上传,但是编译后的文件时间系统是错误的,比正常的定时慢了十几倍,也就是说,如果我在程序中定时1S,实际运行确实十几秒。经过研究,复制时间的代码在core里面,然后我从最新版的core里面复制过去,覆盖了energia-1.8.7E21版本的core代码文件。终于修复出来了一个可以正常编译,正常上传的energia开发软件了。
修复后的energia-1.8.7E21下载地址:https://bbs.21ic.com/icview-2925598-1-1.html
默认的该软件具备了MSP430各个版本的LaunchPad开发功能。而其他的LaunchPad需要在线安装支持文件,但是因为国内网络的问题,你很难联系到外网进行更新。所以这里我只能体验430的开发板了。刚好我手里有的就是MSP-EXP430G2的LaunchPad开发板。

我手里的是1.5版本。
据官网介绍,MSP430G2 LaunchPad套件有一个新版本– MSP-EXP430G2ET,其中包括改进的EnergyTrace测量以及用于编程和调试的板上仿真。不过管脚都是完全兼容的,因为用的MCU还是2553或2452(说明:该开发板提供了两个MCU,可以替换)。该开发板的用户指南 MSP-EXP430G2 LaunchPad 试验板用户指南.pdf (971.37 KB)
MSP430G2452的片上配置: 16 位超低功耗微控制器,  8kB 闪存、256B RAM、10 位 SAR A/D、比较器、用于 SPI/I2C 的 USI、16 个触控式使能 I/O 引脚。
MSP430G2533的片上配置:16 位超低功耗微控制器,16kB 闪存、512B RAM、10 位 SAR A/D、比较器、用于 I2C/SPI/UART 的USCI、24 个触控式使能 I/O 引脚
可以看出2533比2452在闪存和内存的配置上都比2452高一倍。
接下来就体验energia的开发模式。
1,用mini-USB连接线,连接开发板与电脑USB接口,打开Energia开发软件,如下图所示。


单击工具菜单,选择你的开发板配置的MCU

如上图所示,选择你板子上此时安装的MCU型号。然后再选择端口为你开发板的串口号。
接下来就是跑一个例子试试了,最简单的点灯(Blink):文件—>示例—>01.Basics—>Blink.
如下图所示。


接下来就是编译运行了,如下图所示的五个按钮分别是:验证,上传,新建,打开,保存。其中验证就是编译源文件。上传就是烧写固件到芯片。因此我们需要先按验证(第一个按钮),完成后再按第二个按钮

接下来见证奇迹的时刻到了


项目使用了 802 字节,占用了 (9%) 程序存储空间。最大为 8192 字节。
全局变量使用了20字节,(7%)的动态内存,余留236字节局部变量。最大为256字节。
MSPDebug version 0.24 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2016 Daniel Beer <dlbeer@gmail.com>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
----------------- NOTE ------------------
Modified version of mspdebug for Energia
            Do not use standalone
-----------------------------------------
Chip info database from MSP430.dll v3.3.1.4 Copyright (C) 2013 TI, Inc.

Using new (SLAC460L+) API
MSP430_GetNumberOfUsbIfs
MSP430_GetNameOfUsbIf
Found FET: HID0006:COM3
MSP430_Initialize: HID0006:COM3
Firmware version is 20409001
MSP430_VCC: 3000 mV
MSP430_OpenDevice
MSP430_GetFoundDevice
Device: MSP430G2xx2 (id = 0x00cf)
2 breakpoints available
MSP430_EEM_Init
Chip ID data:
  ver_id:         5224
  ver_sub_id:     0000
  revision:       00
  fab:            a0
  self:           0000
  config:         00
Device: MSP430G2xx2
Erasing...
Programming...
Writing  770 bytes at e000...
Writing   32 bytes at ffe0...
Done, 802 bytes total
MSP430_Run
MSP430_Close
顺利完成编译。然后板子上的红色灯泡就开始闪闪发光了。
接下来我们修改一下程序,让板子上的绿色灯泡也一闪一闪的。
/*
  Blink
  The basic Energia example.
  Turns on an LED on for one second, then off for one second, repeatedly.
  Change the LED define to blink other LEDs.
  
  Hardware Required:
  * LaunchPad with an LED
  
  This example code is in the public domain.
*/

// most launchpads have a red LED
//#define LED RED_LED

//see pins_energia.h for more LED definitions
//#define LED GREEN_LED
  
// the setup routine runs once when you press reset:
void setup()
{               
  // initialize the digital pin as an output.
  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);      
}

// the loop routine runs over and over again forever:
void loop()
{
  digitalWrite(RED_LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(GREEN_LED, LOW);   // turn the LED on (HIGH is the voltage level)

  delay(1000);               // wait for a second
  digitalWrite(RED_LED, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(GREEN_LED, HIGH);   // turn the LED on (HIGH is the voltage level)  
  delay(1000);               // wait for a second

  
}
这样就可以红绿灯交替点亮了,看起来这才好嘛。




Gif_20200301_104618.gif (3.28 MB )

Gif_20200301_104618.gif

使用特权

评论回复

相关帖子

沙发
gaoyang9992006|  楼主 | 2020-3-1 10:57 | 只看该作者
那么如何知道开发板上芯片管脚在Energia中定义的名字呢?打开软件的安装目录,如下所示

energia-1.8.7E21\hardware\energia\msp430\variants\MSP-EXP430G2452LP

例如找到2452定义文件
pins_energia.h
/*
  ************************************************************************
  *   pins_energia.h
  *
  *   Energia core files for MSP430
  *      Copyright (c) 2012 Robert Wessels. All right reserved.
  *
  *     Contribution: Rei VILO
  *
  ***********************************************************************
  Derived from:
  pins_arduino.h - Pin definition functions for Arduino
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2007 David A. Mellis

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA
*/

#ifndef Pins_Energia_h
#define Pins_Energia_h
#ifndef BV
#define BV(x) (1 << (x))
#endif

static const uint8_t SS      = 8;  /* P2.0 */
static const uint8_t SCK     = 7;  /* P1.5 */
static const uint8_t MOSI    = 15; /* P1.7 */
static const uint8_t MISO    = 14; /* P1.6 */
static const uint8_t TWISCL1  = 9;   /* P2.1 SW I2C */
static const uint8_t TWISDA1  = 10;  /* P2.2 SW I2C */
static const uint8_t TWISDA0  = 15;  /* P1.7 */
static const uint8_t TWISCL0  = 14;  /* P1.6 */
static const uint8_t DEBUG_UARTRXD = 3;  /* Receive  Data (RXD) at P1.1 */
static const uint8_t DEBUG_UARTTXD = 4;  /* Transmit Data (TXD) at P1.2 */
#define TWISDA1_SET_MODE  (INPUT)
#define TWISCL1_SET_MODE  (INPUT)
#if defined(__MSP430_HAS_USCI__)
#define TWISDA0_SET_MODE  (PORT_SELECTION0 | PORT_SELECTION1 /* | INPUT_PULLUP*/) /* do not enable the pull ups for this device */
#define TWISCL0_SET_MODE  (PORT_SELECTION0 | PORT_SELECTION1 /* | INPUT_PULLUP*/)
#define DEBUG_UARTRXD_SET_MODE (PORT_SELECTION0 | PORT_SELECTION1 | INPUT)
#define DEBUG_UARTTXD_SET_MODE (PORT_SELECTION0 | PORT_SELECTION1 | OUTPUT)
#define SPISCK_SET_MODE (PORT_SELECTION0 | PORT_SELECTION1)
#define SPIMOSI_SET_MODE (PORT_SELECTION0 | PORT_SELECTION1)
#define SPIMISO_SET_MODE (PORT_SELECTION0 | PORT_SELECTION1)
#endif
#if defined(__MSP430_HAS_USI__)
#define TWISDA0_SET_MODE  (PORT_SELECTION0 | INPUT_PULLUP)
#define TWISCL0_SET_MODE  (PORT_SELECTION0 | INPUT_PULLUP)
#define DEBUG_UARTRXD_SET_MODE (PORT_SELECTION0 | INPUT)
#define DEBUG_UARTTXD_SET_MODE (PORT_SELECTION0 | OUTPUT)
#define SPISCK_SET_MODE (PORT_SELECTION0)
#define SPIMOSI_SET_MODE (PORT_SELECTION0)
#define SPIMISO_SET_MODE (PORT_SELECTION0)
#endif

/* Define the default I2C settings */
#define DEFAULT_I2C -1 /* indicates SW I2C on pseudo module 1 */
#define TWISDA TWISDA1
#define TWISCL TWISCL1
#define TWISDA_SET_MODE  TWISDA1_SET_MODE
#define TWISCL_SET_MODE  TWISCL1_SET_MODE

#define DEBUG_UART_MODULE_OFFSET 0x0

#define DEBUG_UART_MODULE 0x0

static const uint8_t A0  = 2;
static const uint8_t A1  = 3;
static const uint8_t A2  = 4;
static const uint8_t A3  = 5;
static const uint8_t A4  = 6;
static const uint8_t A5  = 7;
static const uint8_t A6  = 14;
static const uint8_t A7  = 15;
static const uint8_t A10 = 128 + 10; // special. This is the internal temp sensor

//                      +-\/-+
//               VCC   1|    |20  GND
//         (A0)  P1.0  2|    |19  XIN
//         (A1)  P1.1  3|    |18  XOUT
//         (A2)  P1.2  4|    |17  TEST
//         (A3)  P1.3  5|    |16  RST#
//         (A4)  P1.4  6|    |15  P1.7  (A7) (SCL) (MISO) depends on chip
//         (A5)  P1.5  7|    |14  P1.6  (A6) (SDA) (MOSI)
//               P2.0  8|    |13  P2.5
//               P2.1  9|    |12  P2.4
//               P2.2 10|    |11  P2.3
//                      +----+
//

// Pin names based on the silkscreen
//
static const uint8_t P1_0 = 2;
static const uint8_t P1_1 = 3;
static const uint8_t P1_2 = 4;
static const uint8_t P1_3 = 5;
static const uint8_t P1_4 = 6;
static const uint8_t P1_5 = 7;
static const uint8_t P2_0 = 8;
static const uint8_t P2_1 = 9;
static const uint8_t P2_2 = 10;
static const uint8_t P2_3 = 11;
static const uint8_t P2_4 = 12;
static const uint8_t P2_5 = 13;
static const uint8_t P1_6 = 14;
static const uint8_t P1_7 = 15;
static const uint8_t P2_7 = 18;
static const uint8_t P2_6 = 19;

static const uint8_t RED_LED = 2;
static const uint8_t GREEN_LED = 14;
static const uint8_t PUSH2 = 5;
static const uint8_t TEMPSENSOR = 128 + 10; // depends on chip


#ifdef ARDUINO_MAIN

const uint16_t port_to_input[] = {
   NOT_A_PORT,
   (const uint16_t) (&P1IN),
   (const uint16_t) (&P2IN),
#ifdef __MSP430_HAS_PORT3_R__
   (const uint16_t) (&P3IN),
#endif
};

const uint16_t port_to_output[] = {
   NOT_A_PORT,
   (const uint16_t) (&P1OUT),
   (const uint16_t) (&P2OUT),
#ifdef __MSP430_HAS_PORT3_R__
   (const uint16_t) (&P3OUT),
#endif
};

const uint16_t port_to_dir[] = {
   NOT_A_PORT,
   (const uint16_t) (&P1DIR),
   (const uint16_t) (&P2DIR),
#ifdef __MSP430_HAS_PORT3_R__
   (const uint16_t) (&P3DIR),
#endif
};

const uint16_t port_to_ren[] = {
   NOT_A_PORT,
   (const uint16_t) (&P1REN),
   (const uint16_t) (&P2REN),
#ifdef __MSP430_HAS_PORT3_R__
   (const uint16_t) (&P3REN),
#endif
};

const uint16_t port_to_sel0[] = {  /* put this PxSEL register under the group of PxSEL0 */
   NOT_A_PORT,
   (const uint16_t) (&P1SEL),
   (const uint16_t) (&P2SEL),
#ifdef __MSP430_HAS_PORT3_R__
   (const uint16_t) (&P3SEL),
#endif
};

const uint16_t port_to_sel2[] = {
   NOT_A_PORT,
#if (defined(P1SEL2_) || defined(P1SEL2) || defined(__MSP430_HAS_P1SEL2__))
   (const uint16_t) (&P1SEL2),
#else
        NOT_A_PORT,
#endif
#if (defined(P2SEL2_) || defined(P2SEL2) || defined(__MSP430_HAS_P2SEL2__))
   (const uint16_t) (&P2SEL2),
#else
        NOT_A_PORT,
#endif
#if (defined(P3SEL2_) || defined(P3SEL2) || defined(__MSP430_HAS_P3SEL2__))
   (const uint16_t) (&P3SEL2),
#else
        NOT_A_PORT,
#endif
};


/*
* Defines for devices with 2x TA3 timers (e.g. MSP430g2553). On the 20pin devices, upto 3 analog outputs are available
* T0A1, T1A1 and T1A2
*/
const uint8_t digital_pin_to_timer[] = {
   NOT_ON_TIMER, /*  dummy */
   NOT_ON_TIMER, /*  1 - VCC */
   NOT_ON_TIMER, /*  2 - P1.0 */
   NOT_ON_TIMER, /*  3 - P1.1, note: A0 output cannot be used with analogWrite */
   T0A1,         /*  4 - P1.2 */
   NOT_ON_TIMER, /*  5 - P1.3 */
   NOT_ON_TIMER, /*  6 - P1.4 note: special case. Leaving as no timer due to difficulty determining if available */
   NOT_ON_TIMER, /*  7 - P1.5 note: A0 output cannot be used with analogWrite  */
#if defined(__MSP430_HAS_T1A3__)
   NOT_ON_TIMER, /*  8 - P2.0 note: A0 output cannot be used with analogWrite */
   T1A1,         /*  9 - P2.1 */
   T1A1,         /* 10 - P2.2 */
   NOT_ON_TIMER, /* 11 - P2.3 note: A0 output cannot be used with analogWrite  */
   T1A2,         /* 12 - P2.4 */
   T1A2,         /* 13 - P2.5 */
#else
   NOT_ON_TIMER, /*  8 - P2.0 */
   NOT_ON_TIMER, /*  9 - P2.1 */
   NOT_ON_TIMER, /* 10 - P2.3 */
   NOT_ON_TIMER, /* 11 - P2.4 */
   NOT_ON_TIMER, /* 12 - P2.5 */
   NOT_ON_TIMER, /* 13 - P2.6 */
#endif
   T0A1,         /* 14 - P1.6 */
   NOT_ON_TIMER, /* 15 - P1.7 */
   NOT_ON_TIMER, /* 16 - /RESET */  
   NOT_ON_TIMER, /* 17 - TEST */  
   NOT_ON_TIMER, /* 18 - XOUT - P2.7 */
   T0A1,         /* 19 - XIN - P2.6: */
   NOT_ON_TIMER, /* 20 - GND */
};

const uint8_t digital_pin_to_port[] = {
   NOT_A_PIN, /* dummy */
   NOT_A_PIN, /* 1 */
   P1, /* 2 */
   P1, /* 3 */
   P1, /* 4 */
   P1, /* 5 */
   P1, /* 6 */
   P1, /* 7 */
   P2, /* 8 */
   P2, /* 9 */
   P2, /* 10 */
   P2, /* 11 */
   P2, /* 12 */
   P2, /* 13 */
   P1, /* 14 */
   P1, /* 15 */
   NOT_A_PIN, /* 16 */
   NOT_A_PIN, /* 17 */
   P2, /* 18 */
   P2, /* 19 */
   NOT_A_PIN, /* 20 */
};

const uint8_t digital_pin_to_bit_mask[] = {
   NOT_A_PIN, /* 0,  pin count starts at 1 */
   NOT_A_PIN, /* 1,  VCC */
   BV(0),     /* 2,  port P1.0 */
   BV(1),     /* 3,  port P1.1 */
   BV(2),     /* 4,  port P1.2 */
   BV(3),     /* 5,  port P1.3*/
   BV(4),     /* 6,  port P1.4 */
   BV(5),     /* 7,  port P1.5 */
   BV(0),     /* 8,  port P2.0 */
   BV(1),     /* 9,  port P2.1 */
   BV(2),     /* 10, port P2.2 */
   BV(3),     /* 11, port P2.3 */
   BV(4),     /* 12, port P2.4 */
   BV(5),     /* 13, port P2.5 */
   BV(6),     /* 14, port P1.6 */
   BV(7),     /* 15, port P1.7 */
   NOT_A_PIN, /* 16, RST */
   NOT_A_PIN, /* 17, TEST */
   BV(7),     /* 18, XOUT */
   BV(6),     /* 19, XIN */
   NOT_A_PIN, /* 20, GND */
};
const uint32_t digital_pin_to_analog_in[] = {
        NOT_ON_ADC,     /*  dummy   */
        NOT_ON_ADC,     /*  1 - 3.3V*/
        0,            /*  2 - A0 */
        1,              /*  3 - A1 */
        2,             /*  4 - A2 */
        3,             /*  5 - A3 */
        4,             /*  6 - A4 */
        5,            /*  7 - A5 */
        NOT_ON_ADC,    /*  8 - P2.0 */
        NOT_ON_ADC,    /*  9 - P2.1 */
        NOT_ON_ADC,    /*  10 - P2.2 */
        NOT_ON_ADC,    /*  11 - P2.3 */
        NOT_ON_ADC,    /*  12 - P2.4 */
        NOT_ON_ADC,    /*  13 - P2.5 */
        6,              /*  14 - A6 */
        7,              /*  15 - A7 */
        NOT_ON_ADC,    /*  16 - RST */
        NOT_ON_ADC,     /*  17 - PF0 */
        NOT_ON_ADC,    /*  18 - PE0 */
        NOT_ON_ADC,     /*  19 - PB2 */
        NOT_ON_ADC     /*  20 - GND */
};

#endif
#endif


使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2020-3-1 11:00 | 只看该作者
本帖最后由 gaoyang9992006 于 2020-3-1 11:01 编辑

对于测试PWM的功能,可以找到基本例程的fade
/*
  Fade

  This example shows how to fade an LED on pin 14
  using the analogWrite() function.

  Hardware Required:
  * MSP-EXP430G2 LaunchPad
  
  This example code is in the public domain.

*/

int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

void setup()  {
  // declare pin 14 to be an output:
  pinMode(GREEN_LED, OUTPUT);
}

void loop()  {
  // set the brightness of pin 9:
  analogWrite(GREEN_LED, brightness);   

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }     
  // wait for 30 milliseconds to see the dimming effect   
  delay(30);                           
}

即可完美的体验一把PWM的超级简单的操作方式。使用analogWrite()函数,指定管脚编号,指定输出值,0到255,0表示关闭,255为100%占空比,共计255个划分。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1909

主题

15687

帖子

204

粉丝