wzq

博客介绍:

openMSP430 应用笔记

1
阅读(66) 评论(2)

openMsp430 是OpenCore 上的一款很小巧的开源MCU核,指令集完美兼容市面上MSP430 MCU。从2009年发布开始,一直到2015年,该core每年都有更新,可见作者对这个core是很认真的。而且从代码风格和注释来看,歪果仁做事果然认真。

这个除了core之外,作者还设计了很多外设,ClockModule,Watchdog,,sfr,乘法器,gpio等,还有一个专门用于调试的debug接口。难能可贵的是,ClockModule,Watchdog,Timer,gpio等与TI的MSP430F基本兼容,所以很多程序可以直接移植。

我们做设计,一般都是刚开始先做一个简单的框架,后面再在这个框架上添加很多东西,功能越来越强大,系统也越来越复杂。有时的做法又刚好相反,把一个庞大的系统,不断删减东西,直到不能再删为止,留下最精华的部分,也正是我们需要的部分。openMSP430这个系统不算庞大,可以说是很小巧,相对于OR1200,简洁很多了,不过性能也没有or1200强。但是各有各的用武之地。随人openMSP430已经很小巧了,但是对于FPGA实现来讲,还可以再删减,删减到只剩下内核。因为对于具体的应用,标准的外设并不一定适合我们的需求,而我们正好可以利用FPGA的灵活性,自己设计我们的外设。把流程控制交给软件做,而一些复杂的时序,接口,运算等,交由硬件完成。所以对于这个430核,留下内核就可以了,而其他外设,可以根据需要再集成。

所以,我对这个核做了进一步精简,只留下最核心的内核部分。精简后mcu核结构如下图所示。

mcu核主要有以下几组接口:

l  pmem interface,程序存储器接口

l  dmem interface,数据存储器接口

l  per interface,外设存储器接口

l  中断接口,irq,irq_acc

l  时钟复位:mclk,puc

精简后的mcu核顶层如下:

接口说明

Name

Dir.

Width

Descript


dmem_addr

Output

`DMEM_AWIDTH

数据存储器地址


dmem_cen

Output

1

数据存储器使能,低电平有效


dmem_din

Output

16

数据存储器数据输入


dmem_wen

Output

2

数据存储器写使能,地有效


dmem_dout

Input

16

数据存储器数据输出







pmem_addr

Output

`PMEM_AWIDTH

程序存储器地址


pmem_cen

Output

1

程序存储器使能,低电平有效


pmem_din

Output

16

程序存储器数据输入


pmem_wen

Output

2

程序存储器写使能,地有效


pmem_dout

Input

16

程序存储器数据输出







per_addr

Output

8

外设总线地址


per_din

Output

16

外设总线数据输入,mcu-》peripheral


per_wen

Output

2

外设总线数据写使能,高有效


per_en

Output

1

外设总线使能,高有效


per_dout

Input

16

外设总线数据输出,Peripheral--》mcu







irq_acc

Output

14

中断相应握手


irq

Input

14

中断输入







mclk

Input

1

mcu 运行时钟


puc

Input

1

mcu复位信号


 

接口时序图

PMEM 接口时序仿真图

 

 

 

 

 

DMEM接口时序仿真图

 

 

Peripheral时序

 

 

2         omsp430ik

2.1       逻辑电路说明

omsp430ik(integrated kits)是应用openMSP430核的最小soc平台。为了验证mcu功能,集成了GPIO和UART两个最基本的输入输出模块。在这个平台上,通过添删外设,可以快速的搭建您的目标SOC系统。

模块层次如下图。

 

 

omsp430ikmcu结构图

GPIO和UART寄存器说明

GPIO和430的GPIO兼容,UART是自己定义的。

RegAddr

RegName

R/W

Width

Description

0x20

P1IN

R

8

P1输入

0x21

P1OUT

R/W

8

P1输出

0x22

P1DIR

R/W

8

P1方向控制,0=输入,1=输出。

0x23

P1IFG

R/W

8

P1中断标志

0x24

P1IES

R/W

8

P1中断边沿选择。0=上升沿;1=下降沿;

0x25

P1IE

R/W

8

P1中断使能。高有效






0x40

UTXBUF

R/W

8

UART发送缓存。

0x41

URXBUF

R/W

8

UART接收缓存

0x42

UCTL

R/W

1

Bit0:UART接收中断使能。高有效。

0x43

UFLAG

R/W

2

Bit0:收到1字节数据标志。需软件清零

Bit1:发送忙标志。1表示正在发送。

0x44

BR0

R/W

8

波特率设置低8位

0x45

BR1

R/W

8

波特率色合作高8位。

BR0,BR1配置值计算:系统时钟/波特率

 

 

3         IAR-FOR-430程序编译说明

由于omsp430完全兼容430的指令集,所以可以用任何430的编译软件编译C代码或汇编代码。我用的是IAR for 430,5.5版本。

 

寄存器的定义可用__no_init 指令定义,如下表是UART寄存器的定义

#define UART_BASIC  0x40

__no_init volatile unsigned char UTXBUF @ (UART_BASIC + 0x0);

__no_init volatile unsigned char URXBUF @ (UART_BASIC + 0x1);

__no_init volatile unsigned char UCTL   @ (UART_BASIC + 0x2); /*[0]=uart rx irqen*/

__no_init volatile unsigned char UFLAG  @ (UART_BASIC + 0x3); /*[0]=rxflag;[1]=txbusy*/

__no_init volatile unsigned char UBR0   @ (UART_BASIC + 0x4); /*baudrate[7:0]*/

__no_init volatile unsigned char UBR1   @ (UART_BASIC + 0x5); /*baudrate[15:8]*/

 

也可以用定义指针的方式定义寄存器,如下:

#define  P1IN        (*(volatile unsigned char *) 0x0020)

#define  P1OUT      (*(volatile unsigned char *) 0x0021)

#define  P1DIR       (*(volatile unsigned char *) 0x0022)

#define  P1IFG       (*(volatile unsigned char *) 0x0023)

#define  P1IES       (*(volatile unsigned char *) 0x0024)

#define  P1IE        (*(volatile unsigned char *) 0x0025)

#define  P1SEL       (*(volatile unsigned char *) 0x0026)

 

 

在使用IAR进行软件开发时,需要设置以下几个地方

1       选择合适的器件

选择一款ROM和RAM容量相适配的器件。选择方式如下图。

 

可在Output项下面点击*.xcl看我们选择的器件的信息,如下

 

上图信息:     ROM容量, E000-FFFF,8K.         RAM容量:0200-02ff. 256byte。

 

ROM的配置必须跟omsp的设置一样,否则程序运行错误。

 

如果找不到适合的器件,也可以手动自己修改xcl文件。修改xcl文件的以下几个语句:

修改ram:

// -----------------------------------------------

// Read/write memory

//

 

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-02FF

-Z(DATA)CODE_I

-Z(DATA)CSTACK+_STACK_SIZE#

上表是256Byte的,如需修改成512Byte,

0200-02FF -》       0200-03FF

 

修改rom

// -------------------------------------

// Constant data

//

 

-Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=E000-FFDF

 

// -------------------------------------

// Code

//

 

-Z(CODE)CSTART,ISR_CODE,CODE_ID=E000-FFDF

-P(CODE)CODE=E000-FFDF

 

2       输出文件设置

如下图选择 msp430-txt

 

 

编译后,会在Debug/Exe下,生成机器指令,如hellow.txt。

 

设置#include文件夹,PROJDIRPROJDIR 表示当前的工程路径。如下图。

 


  1. @木易   

    是TI把MSP430开源了?

    TI的没有开源,这个是openCore网址(Author: Olivier GIRARD)上发布的的个人写的开源的核,学习用的,不是商业的IP核。

  2. 是TI把MSP430开源了?