MSP430 开发与 Linux

作者:Brian C. Lane

Linux 嵌入式开发不仅仅意味着将 Linux 嵌入到产品中,它还意味着使用 Linux 作为嵌入式微处理器的开发平台。 大多数计算机处理器不在桌面电脑或 Beowulf 集群中,它们嵌入在您每天使用的数百万个设备中:闹钟、微波炉、恒温器、汽车、手机等等。 Linux 可用于开发使用微处理器(如 Microchip PIC、Atmel AVR、Philips LPC ARM 和 TI MSP430 设备)的嵌入式项目的软件。

您无需成为专业的开发人员即可享受这些微型计算机设备的乐趣。 开发工具价格低廉,所需的硬件极少。 焊接技能和一些 C 语言编写经验是您开始为您的下一个相扑机器人、遥控直升机或数字锁创建控制器所需的全部。

德州仪器 (TI) MSP430 系列微处理器具有广泛的功能

  • 关机模式下功耗低至 0.1uA。

  • 多个带捕获/比较功能的 16 位定时器。

  • PWM 输出,对于机器人技术非常有用。

  • 用于监控传感器的 A/D 转换器。

  • 用于通信的 SPI 和异步 UART。

  • 集成 LCD 显示控制器。

  • 板载振荡器。

  • 用于低功耗睡眠模式的多个时钟源。

'430 系列包括四个主要组别的 80 多个器件。 闪存(程序存储位置)的范围从微不足道的 1KB 到奢侈的 60KB。 可用 RAM 最大为 5KB,最小为 128 字节。

当然,128 字节的 RAM 不算多,但对于小型项目来说也足够完成工作。 我的许多嵌入式项目都是用汇编代码编写的,以节省空间,但对于 MSP430,我发现自己主要使用 C 语言。 我没有使用商业编译器或 IDE,而是选择使用 GNU GCC 工具链,它已经添加了对 MSP430 的支持。 GCC 编译器在生成代码方面做得相当不错,而且如果代码要在未来几年内维护,C 语言无疑是更好的选择。 没有什么比五年后回到高度优化的汇编项目并试图进行调整而导致整个系统崩溃更糟糕的了。

对于我在 1998 年写过的 Microchip PIC 处理器,开发过程有点乏味。 我会编写一些代码,编译它,刷写到 PIC,想知道为什么它不起作用,然后重复。 我使用几个 I/O 线和 LED 作为调试工具,但您只能从两个闪烁的 LED 中理解这么多信息。 当事情出错时,我真的无法确切地知道处理器内部发生了什么。 一种解决方案可能是购买在线电路仿真器 (ICE)。 在线电路仿真器是一种插入处理器通常所在插槽的设备。 它模拟 CPU,让您可以检查每条指令、内存位置等等。 但 ICE 超过 1,200 美元的价格超出了我的承受能力。

今天,对于业余爱好者和专业人士来说,情况都变得容易得多。 许多较新的处理器都包含内置的实时调试支持,使用 IEEE Std 1149.1 JTAG 规范。 这种六线接口允许对目标设备上运行的软件进行实时调试。 您可以单步执行代码,观察寄存器和内存位置的变化,插入断点并动态修改 RAM。 与旧的 1 位或 2 位诊断线相比,这是一个巨大的进步。

您无需花费数百美元购买昂贵的调试工具,就可以从 Olimex 购买并行端口 JTAG 适配器,价格仅为 15 美元。 这使得人们可以使用 gdb 等交互式调试器来调试他们的代码,而不是依赖闪烁的 LED 和串行端口。

设置 MSP430 软件开发

Dimitry Diky 和 Chris Lichti 领导的小组将 MSP430 支持添加到 GCC 中。 他们的项目包括 gcc 编译器、链接器、库、gdb 调试器以及并行 JTAG 适配器的闭源接口。 mspgcc 项目的主要重点是 Windows。 在 Linux 上使其工作有点困难,需要编译备用工具链、库等等。 也许我变老了、变懒了,或者只是习惯了 .deb 和 .rpm 包,但现在,我更喜欢不与我安装的软件作斗争。 运行rpm -Uhv <package>节省了我的精力来调试我的 MSP430 代码。

感谢 Stephan Linz 及其 MSP430 交叉开发工具包,我无需花费超过五分钟的时间来安装开发工具。 他已经完成了将 mspgcc 编译并打包为 RPM 的所有艰苦工作。 Stephen 还为 AVR 处理器和 Altera 软核 NIOS 创建了交叉开发工具包,如果您对这些目标处理器感兴趣。 如果我将来需要为 AVR 编写代码,我知道该去哪里。

cdk4msp 项目可从 SourceForge 获得,以下是需要从 cdk4msp SourceForge 下载页面安装的软件包的最低列表

  • cdk-msp-base-0.2-20031111.i386.rpm

  • cdk-msp-binutils-2.14-20031106.i386.rpm

  • cdk-msp-examples-libc-20031101cvs-20031102.noarch.rpm

  • cdk-msp-examples-mspgcc-20031101cvs-20031102.noarch.rpm

  • cdk-msp-gcc-3.3.2-20031106.i386.rpm

  • cdk-msp-gdb-5.1.1-20031106.i386.rpm

  • cdk-msp-gdb-proxy-5.1.1-20031106.i386.rpm

  • cdk-msp-jtag-lib-20031101cvs-20031102.i386.rpm

  • cdk-msp-libc-20031101cvs-20031102.noarch.rpm

可以下载其他文档包,具体取决于您对 man 页面、info 文件、PDF 或 HTML 页面的偏好。 我已在 Fedora Core 版本 1 到 4 上成功使用了这些软件包,虽然我没有尝试过任何其他基于 RPM 的发行版,但我希望它们也能正常工作。 这些 RPM 软件包作为一个独立的单元运行,不依赖于任何外部软件包。

按以下顺序使用以下命令安装软件包

rpm -Uhv cdk-msp-base-0.2-20031111.i386.rpm
rpm -Uhv cdk-msp-binutils-2.14-20031106.i386.rpm
rpm -Uhv cdk-msp-libc-20031101cvs-20031102.noarch.rpm
rpm -Uhv cdk-msp-gcc-3.3.2-20031106.i386.rpm
rpm -Uhv cdk-msp-gdb-5.1.1-20031106.i386.rpm
rpm -Uhv cdk-msp-jtag-lib-20031101cvs-20031102.i386.rpm
rpm -Uhv cdk-msp-gdb-proxy-5.1.1-20031106.i386.rpm
rpm -Uhv cdk-msp-examples-libc-20031101cvs-20031102.noarch.rpm
rpm -Uhv cdk-msp-examples-mspgcc-20031101cvs-20031102.noarch.rpm

安装会将所有内容放置在 /opt/cdk4msp 目录树下。 查看 /opt/cdk4msp/examples/mspgcc 中的示例以及 /opt/cdk4msp/doc、info 和 man 目录中的文档,具体取决于您安装的文档样式。

一个简单的闪烁 LED

闪烁 LED 相当于嵌入式领域的“Hello World”。 我们将修改其中一个示例,使其更容易理解。 将 leds 示例从 /opt/cdk4msp/examples/mspgcc/leds/ 复制到工作目录,并将 main.c 替换为下面的简化版本。 编辑 Makefile 并将 CPU 变量设置为 msp430x149,以便为正确的目标编译。 如果您使用的是不同版本的 MSP430,您可以通过运行以下命令获取支持类型的列表msp430-gcc --target-help | less然后将 CPU 设置为适当的类型。

MSP430 Development with Linux

图 1. 我的 LED 闪烁器开发板和 JTAG 适配器图片

MSP430 Development with Linux

图 2. LED 闪烁器设置的简单原理图

main.c 的替换内容

/* Simple LED Blinker program for MSP430 */
#include <msp430x14x.h>

/* Brute Force delay loop */
void delay(unsigned int d)
{
    for (; d>0; d--) {
        nop();
        nop();
    }
}

int main( void )
{
    /* Init watchdog timer to off */
    WDTCTL = WDTPW|WDTHOLD;

    /* Init Output ports to GND */
    P1OUT  = 0x00;
    P2OUT  = 0x00;

    /* I/O not module control */
    P1SEL  = 0x00;
    P2SEL  = 0x00;

    /* Setup the data direction registers
       P1.0 output, input on the rest
    */
    P1DIR  = 0x01;
    P2DIR  = 0x00;

    /* No Interrupts on Port Pins */
    P1IES  = 0x00;
    P2IES  = 0x00;
    P1IE   = 0x00;
    P2IE   = 0x00;

    /* Loop until the universe breaks down */
    while (1) {
        /* Toggle P1.0 ouput pin */
        P1OUT ^= 0x01;

        /* Delay for a while before blinking */
        delay(0x4fff);
    }  /* while */
}

运行make进行编译。 您应该看不到任何警告或错误

msp430-gcc -mmcu=msp430x149 -O2 -Wall -g   -c -o main.o main.c
msp430-gcc -mmcu=msp430x149 -o leds.elf main.o
msp430-objcopy -O ihex leds.elf leds.a43
msp430-objdump -dSt leds.elf >leds.lst

此时,我们已经设置了软件开发,但没有硬件来运行它或 LED 来闪烁。

MSP430 简单硬件设置

开始使用 MSP430 只需要极少的硬件或资金。 您需要一个带有处理器的 PC 板和一个 JTAG 适配器,用于将板连接到并行端口。 Olimex 为 MSP430、ARM、AVR 和 PIC 制造了许多廉价的评估板和 JTAG 适配器。 在美国,他们的产品由一家名为 Spark Fun Electronics 的好地方销售,该公司销售 Olimex 板以及其自己独特的适配器板和项目系列。 表 1 显示了在图 1 中的原理图上构建电路所需的材料。

表 1. 电路材料和成本

描述零件编号价格(美元)
Olimex MSP430F149 接头板MSP-H149$22
Olimex MSP430 JTAG 适配器MSP-JTAG$15
来自 DigiKey 的 AA 电池组2463K-ND$0.78
来自 DigiKey 的红色 LED160-1499-ND$3.60/10
330 欧姆电阻220QBK-ND$0.56/10
 总计$41.96

像 MSP430 这样的低功耗设备的一个问题是,当您尝试关闭它们时,它们不会将电源电容器完全放电到地。 这可能会导致欠压情况,处理器将无法重新启动,直到正确复位。 为了简单起见,我们将直接使用一对 AA 电池为处理器供电。 如果您手头没有任何电池,它也可以从 JTAG 适配器本身的电源供电。

在生产设计中,我会添加一个带有复位管理器的电源,以防止任何欠压问题,但对于我们简单的电路,松开电池几秒钟就足以复位它。

接下来我们需要做的是设置 gdb 代理和 JTAG 软件。 这需要使用 PC 的并行端口,如果您的 Linux 安装程序设置为使用本地打印机,则您需要移除打印机并禁用打印机守护程序,然后才能将端口用于 JTAG。 您可能还需要将您的开发用户添加到有权访问该端口的组。 在 Fedora Core 上,这是 lp 组,您可以通过以 root 身份编辑 /etc/group 文件将用户添加到该组。

现在我们已经设置了所需的硬件,是时候编译和刷写我们的 LED 闪烁程序了。 在我们运行的目录中make之前,您现在可以运行make download-jtag,程序将被刷写到目标处理器中

msp430-jtag -e leds.elf
MSP430 parallel JTAG programmer Version: 1.3
SHF_MASKPROC    = 0xf0000000
Mass Erase...
Program ...
188 bytes programmed.

接下来,我们需要启动 gdb 代理,它创建一个本地端口供 gdb 连接,并处理与目标硬件的通信。 在第二个窗口中运行它,因为它在运行时将调试信息输出到 stdout

msp430-gdbproxy --debug --port=2000 msp430

Remote proxy for GDB, v0.7.1, Copyright (C) 1999 Quality Quorum Inc.
MSP430 adaption Copyright (C) 2002 Chris Liechti and Steve Underwood

GDBproxy comes with ABSOLUTELY NO WARRANTY; for details
use --warranty' option. This is Open Source software. You are
welcome to redistribute it under certain conditions. Use the
'--copying' option for details.

debug:     msp430: msp430_open()
info:      msp430: Target device is a 'MSP430F149' (type 7)
notice:    msp430-gdbproxy: waiting on TCP port 2000
MSP430 Development with Linux

图 3. GDB 到目标板连接的简单图

GDB 需要知道如何连接到 MSP430 JTAG 代理端口。 在您的工作目录中创建一个名为 .gdbinit 的文件,并将以下三行放入其中

set remoteaddresssize 64
set remotetimeout 999999
target remote localhost:2000

现在我们准备好调试我们的 LED 闪烁程序了。 当您运行make download-jtag时,LED 应该已经开始闪烁,当 gdbproxy 启动时,它应该已经停止,因为处理器被 JTAG 保持在复位状态。

通过使用 msp430-gdb 程序开始调试

msp430-gdb leds.elf

通过输入以下内容运行到 main()

break main
c

像往常一样调试。 这是一个会话示例

(gdb) break main
Breakpoint 1 at 0x1152: file main.c, line 16.
(gdb) c
Continuing.

Breakpoint 1, main () at main.c:16
16          WDTCTL = WDTPW|WDTHOLD;
(gdb) n
19          P1OUT  = 0x00;
(gdb) n
20          P2OUT  = 0x00;
(gdb) break delay
Breakpoint 2 at 0x1140: file main.c, line 7.
(gdb) c
Continuing.

Breakpoint 2, delay (d=20479) at main.c:7
7           for (; d>0; d--) {
(gdb) n
8               nop();
(gdb) n
9               nop();
(gdb) n
7           for (; d>0; d--) {
(gdb) print d
$1 = 20479
(gdb)

这里发生的事情是,代理正在与 JTAG 适配器通信,并打开端口 2000 以接受来自 gdb 调试器的连接。 调试器需要知道连接到哪里,因此创建了包含端口号和超时时间的 .gdbinit 文件。 当您运行 msp430-gdb 时,它正在与 JTAG 代理程序建立 TCP/IP 连接,而 JTAG 代理程序又在与目标硬件通信(如果一切顺利)。

原理图和定制 PC 板

闪烁 LED 很快就会变得无聊。 一旦您解决了闪烁 LED 的错误,您可能就想要设计一个带有与外部世界接口的定制 PC 板。 我的一个项目是一个带 RS232 接口的单线锁控制器,它使用 Dallas Semiconductor iButton 进行访问控制。

对于这个项目,我选择了该系列中最小的 MSP430F1101,它具有 1KB 闪存和 128 字节 RAM。 它使用一对晶体管来开关直流电机,并使用 MAX3221 进行与 PC 的串行通信。 控制锁的 C 代码几乎刚好适合 '1101 的 1K 闪存空间。 低压差稳压器用于为电路板供电并为处理器提供干净的复位。 我在 Linux 下使用 Eagle CAD Lite 绘制了原理图并设计了电路板。 Eagle 有多个版本的原理图和 PCB 自动布线器,包括用于非商业用途的免费版本

  • 免费用于非商业用途。

  • 电路板尺寸限制为 3.2 英寸 x 4 英寸和两层。

  • 一张原理图纸。

  • Lite 版本售价 49 美元,与免费版本具有相同的限制。

  • 标准版本售价 600 美元。

  • Pro 版本售价 1,200 美元。

  • 提供 Linux、Windows 和 Mac 版本

MSP430 Development with Linux

图 4. 来自 Eagle 的锁项目 PC 板布局

MSP430 Development with Linux

图 5. 原型 PC 板的图片

Eagle CAD 易于上手、成本低且功能非常强大。 用户脚本语言允许您添加功能并自定义程序以满足您的需求。 对 Eagle 的用户支持非常强大,并且网站上有大量用户创建的库。

Eagle 自动布线器支持高级功能,如反向注释、禁布区、设计规则检查以及我最喜欢的功能之一——带热焊盘的铺铜。 如果您曾经尝试焊接被大面积接地层包围的引脚,您就会体会到电源引脚上使用热焊盘的优势。 如果没有它,接地层会像一个大型散热器一样,焊锡不会粘住。 PCB 和原理图编辑器的所有级别都支持反向(和正向)注释的概念。 您可以在 PCB 上进行更改,它们将反映在原理图上,并且对原理图的更新也会反映在 PCB 上。

在设计完 PC 板之后,您实际上需要制作一块。 您可以自己腐蚀,但很难达到即使是最便宜的电路板制造商的质量。 一些制造商将直接接受 Eagle PCB 文件,这为您省去了将设计转换为 Gerber 格式的步骤。 Gerber 格式很像旧的笔式绘图仪,它告诉 PCB 蚀刻设备在哪里绘制走线以及绘制多粗的线条。 大多数 PCB 制造商仍然需要 Gerber 文件,因此 Eagle 包含一个脚本来输出必要的 Gerber 文件。

处理 Gerber 文件的一个困难是,虽然 Eagle 可以以正确的格式导出 PCB,但它无法查看输出以验证转换是否正确。 Linux 多年来一直需要一个好的 Gerber 查看器,但它仅在 gerbv 程序的最新版本中才可用。 它不像我希望的那样直观,但它确实可以很好地显示 Gerber 文件,以便您可以在将最终输出发送出去以创建 1000 个最新的小部件设计之前检查它。

MSP430 Development with Linux

图 6. LinkWiFi PC 板的图片

我自己使用过四家不同的 PCB 制造商。 他们的价格和功能各不相同,但所有四家的客户服务和质量都非常出色。 Olimex 和 PCB Pool 都直接接受 Eagle CAD 文件,无需转换为 Gerber 格式。 Olimex 位于保加利亚,周转时间可能长达三周,但价格非常优惠。 PCB Pool 位于爱尔兰,具有快速周转时间或较长周转时间,具体取决于价格(大多数都是如此)。 我将 PCB Pool 用于单线 Wi-Fi 板(图 6)。

AP Circuits 位于加拿大,价格非常优惠,周转速度非常快。 裸单线锁板是在星期六订购的,我在星期三收到了它们。 我订购它们时没有丝印或阻焊层,以保持价格低廉。 对于生产,我将 E-Teknet 用于我的 DT-1A 温度传感器板,效果非常好。

MSP430 是一款有趣且易于使用的处理器;其广泛的功能以及免费开发工具和低成本 JTAG 硬件使其成为业余爱好者和专业开发人员的绝佳选择。 使用 GNU gcc 工具链降低了学习曲线,并允许您使用与开发 Linux 项目相同的工具来开发 MSP430 上的代码。 我的开发工具集包括 make、gcc、gdb 和 joe。

本文资源: /article/8697

Brian C. Lane 与他的妻子和儿子住在华盛顿州 Port Orchard,他的儿子是 Tux Racer 的忠实粉丝。 他担任 Kitsap Peninsula Linux 用户组的终身网站管理员,并在业余时间编写 Linux 应用程序。

加载 Disqus 评论