【精品博文】openMSP430 应用笔记
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 表示当前的工程路径。如下图。