Tiy 发表于 2014-1-1 20:41:25

开源MSP430F147单片机软核添加自定义外设

本帖最后由 Tiy 于 2014-1-2 10:09 编辑

          学习过nios的小伙伴应该知道nios可以添加自定义外设,下面将以为软核SCore430添加PWM外设为例,讲解如何为SCore430添加外设。             添加外设应该了解以下几点知识:            1.SCore430外设接口时序            2.SCore430的memory map            3.外设控制器ExphCtrl源码的添加新增外设接口         SCore430的外设接口时序         主机接口
名称说明
out_writeexphaddr写外设地址
out_writeexphdata写外设数据
out_writeexphbyten(可选)16bit数据分为两个字节,对应out_writebyten的两个bit位,当对应位置位时,对应字节有效。有这个信号的原因是430指令集中大部分指令有16bit和8bit两种操作模式
out_writeexphen写数据使能,当时钟上升沿到来,且此信号为高电平时,数据被写入。
out_readexphaddr读外设寄存器地址,用作数据选择器的输入参数,从而输出指定寄存器数据。
      外设接口
名称说明
in_clk系统时钟
in_rst系统复位
in_writeaddr写数据地址
in_writeen写数据使能
In_writebyten (可选)数据的字节使能
in_writedata写入的数据
in_readaddr读数据地址
out_readdata读取数据输出

      SCore430内存区域划分http://img.blog.csdn.net/20140101193453109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlndWFuZ21pbjEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

            上图是TI官方文档MSP430x1xx系列的内存映射图,从图中可以看出外设内存地址范围是010h~1FFh,并且010~0FFh范围了只支持8bit的字节访问,SCore430没         有此限制。            010h~1FFh地址范围大部分地址已被标准外设占用,但是我们可以不添加无用的标准外设,将地址让出来,留给自定义外设使用。
         SCore430外设控制器的源码修改         在写自定义外设前首先确定外设有几个寄存器(为了操作和理解方便,在此规定所有寄存器为16bit),然后为这些寄存器分配地址。打开quartus II工程目录下的 symbol.v文件/********************************************************************建立时间:2013.12.20                  作者:李广敏,all rightsreserved*邮箱:523659033@qq.com          版本:V1.0            *修改时间:                                        修改人:*功能:符号定义文件,包含指令名称和外设寄存器名称/******************************************************************//*************单操作数指令************/`define PUSH    5'b00100`define SWPB   5'b00001`define SXT               5'b00011`define RRA   5'b00010`define RRC               5'b00000`define CALL   5'b00101/***********跳转指令**********/`define JC          3'b011`define JZ         3'b001`define JGE       3'b101`define JL 3'b110`define JMP      3'b111`define JN         3'b100`define JNC       3'b010`define JNE       3'b000/**********双操作数指令***********/`define MOV    4'b0100`define ADD 4'b0101`define ADDC 4'b0110`define DADD 4'b1010`define SUB 4'b1000`define SUBC 4'b0111`define CMP 4'b1001`define AND 4'b1111`define BIC 4'b1100`define BIS 4'b1101`define BIT 4'b1011`define XOR 4'b1110/*************复位地址*************/`define RESET 16'h8002/**************外设地址***************//******P1**************/`define P1DIR16'h0022`define P1OUT16'h0021`define P1IN16'h0020/*********P2************/`define P2DIR 16'h002a`define P2OUT 16'h0029`define P2IN16'h0028/******Multipilier*****/`define MPY    16'h0130`define MPYS 16'h0132`define MAC            16'h0134`define MACS   16'h0136`define OP2    16'h0138`define RESLO16'h013a`define RESHI   16'h013c`define SUMEXT       16'h013e
          文件后面内容是外设地址定义,假设我们PWM只有一个寄存器,占空比寄存器,可以在symbol.v最后接着乘法器地址后面写入`define DUTY    16’h0140             当外设寄存器当做16bit访问时,地址必须为偶数。         所有外设可以共用同一条写入总线,但是数据输出总线要分离,通数据选择器送入SCore430内部,外设控制器ExphCtrl主要充当数据选择器的作用。打开ExphCtrl.v文件。/********************************************************************建立时间:2013.12.20                  作者:李广敏,all rightsreserved                *邮箱:523659033@qq.com          版本:V1.0*修改时间:                                        修改人:*功能:外设访问控制器,对外设反馈的数据,根据读取地址,*选择正确的外设数据传送给memctrl模块/******************************************************************/`include "symbol.v"module ExphCtrl(                   inputin_clk,                   inputin_rst,                   /**********memctrlinterface************/                   inputin_exphreadaddr,    //外设寄存器读地址                   outputreg out_exphdata,         //读外设数据接口                   /***********exphinterface*************/      /****P1 port***/                   inputin_readP1data,                       /*****MultiplierPort***/                   inputin_readmultiplier,                   /******P2Port******/                   inputin_readP2data);

/************************************************对外设反馈的数据根据地址选择,时钟上升沿输出数据,*当用户添加自定义外设时,需要修改此always模块/**********************************************/always@(posedge in_clk)begin         case(in_exphreadaddr)         /************P1Interface***********/         `P1DIR:    out_exphdata <= in_readP1data;         `P1OUT:   out_exphdata <= in_readP1data;         `P1IN:       out_exphdata <= in_readP1data;         /*************P2interface************/         `P2DIR:    out_exphdata <= in_readP2data;         `P2OUT:   out_exphdata <= in_readP2data;         `P2IN:       out_exphdata <= in_readP2data;         /************MultiplierInterface*****/         `MPY:               out_exphdata <=in_readmultiplier;         `MPYS:   out_exphdata <= in_readmultiplier;         `MAC:                out_exphdata <=in_readmultiplier;         `MACS:   out_exphdata <= in_readmultiplier;         `OP2:                  out_exphdata <=in_readmultiplier;         `RESLO:    out_exphdata <= in_readmultiplier;         `RESHI:   out_exphdata <= in_readmultiplier;         `SUMEXT:          out_exphdata <= in_readmultiplier;         default:out_exphdata <= 0;         endcaseendendmodule
          可以看出,外设控制器中代码就是一个数据选择器,首先增加我们自定义外设的数据反馈接口 inputin_readpwmdata          在case语句块中添加对PWM反馈数据的选择   Case(in_exphreadaddr)   …   …   `DUTY: out_exphdata <= in_readpwmdata;   …   ...   Endcase          外设控制器修改完成,最后修改好的文件可以查看附件提供的最新工程。PWM外设添加         PWM代码可以查阅附件工程中文件,在此对PWM定义端口做出解释说明modulePWM(                            input in_clk,                            input in_rst,                            inputin_writeaddr,                            input in_writeen,                            inputin_writedata,                            inputin_readaddr,                            output regout_pwmdata,                            output regout_pwmout                   );         可以看出,PWM包含了上面提到外设接口除了In_writebyten外的所有必需接口,out_readdata被重命名为out_pwmdata,out_pwmout是用户自定义端口。      按照上述步骤添加PWM文件并且修改symnol.v和ExphCtrl.v后,开始按下图创建PWM和ExphCtrl的符号文件。
http://img.blog.csdn.net/20140101193905234          打开CPUCore430.bdf顶层文件添加PWM并更新ExphCtrlhttp://img.blog.csdn.net/20140101193951968
               找到ExphCtrl模块,右键更新如上图所示。http://img.blog.csdn.net/20140101194218187
                  更新后可以发现多出了我们添加的in_readPwmdata接口,此接口为下面添加的PWM模块的数据反馈接口http://img.blog.csdn.net/20140101194359062


               双击空白处,弹出上图画框,在project目录下选择PWM模块添加到P2MODULE下方,如下图所示http://img.blog.csdn.net/20140101194438968

                  将PWM左边数据接口与左边数据总线连接,连接方式参照P2MODULE,所以外设输入端口与数据总线连接方式相同。将out_pwmdata与ExphCtrl增加的                in_readPwmdata端口相连。http://img.blog.csdn.net/20140101194519906

            右键PWM为out_pwmout添加pin管脚。
到此外设添加工作完毕,可以编译工程检测有没有错误。C语言代码驱动外设
#include<msp430x14x.h>      
#definePwmDuty   (* (int*)0x140)   //0x140对应symbol.v中语句`define DUTY 16'h0140
void delay()                                             //100Mhz主频,每条指令机器周期6~8
{
int i,j;
for(i=0;i<1000;i++)
    for(j=0;j<1000;j++);
}


int main( void )
{

char counter = 0;
   while(1)
   {
      delay();
   PwmDuty = counter++;
   }
   return 0;
}
按照文件件包V1.1中的《使用手册》编译此文件,将最终转换获得mif文件添加到quartusII工程中,将out_pwm管脚与LED连接,运行时即可看到LED呼吸灯。各位可以按照此方法添加自己的外设(无中断请求功能)。具有中断功能的V2.0版将会再两个月内完成。
    所有软件设置和代码编写以最新文件包中的《使用手册》知道为准。文件包V1.1

justin_n 发表于 2014-1-1 21:30:29

学习了。。。

PCBBOY1991 发表于 2014-1-1 23:15:45

这个难道是430编程软件里边自带的类似于FPGA画图的东东?

sky5566 发表于 2014-1-1 23:46:40

如果能使用 (IAR 或 KEIL) JATG 控制仿真就非常完美.{:smile:}

Tiy 发表于 2014-1-2 00:03:49

sky5566 发表于 2014-1-1 23:46
如果能使用 (IAR 或 KEIL) JATG 控制仿真就非常完美.

第一次尝试,还有很多不足,后期会添加,opencores上有个openMSP430软核,前几天看了,写的很好,你可以去看看
页: [1]
查看完整版本: 开源MSP430F147单片机软核添加自定义外设