首页 > 其他分享 >DSP学习笔记(1)

DSP学习笔记(1)

时间:2024-04-29 17:47:38浏览次数:16  
标签:Register 笔记 学习 地址 DSP 寄存器 GPIO GpioDataRegs 存储空间

DSP28335

最小系统

  • 电源电路

    image-20240429100628991

  • 晶振电路

    作用:提供稳定的时钟

    晶振频率:一般为30MHz

image-20240429100442690

  • 复位电路

image-20240429100146514

使用JTag 烧录程序过程中不能复位,否则芯片可能锁死

  • 下载电路

    image-20240429100807840

F28335启动模式

image-20240429103302990

存储器与寄存器

F28335芯片内部的存储器包括了256K×16位的FLASH(ROM),34K×16位的SARAM,8K×16 位的 BOOT ROM以及2K×16 位的 OPT ROM,采用统一寻址方式(程序、数据和 I/O 统一寻址),从而提高了存储空间的利用率。

存储器的这些存储空间都是实际存在的物理空间,为了统一管理以及便于访问这些空间,需要给这些空间分配地址,同样,为了统一访问片上的I/O和外设,都需要分配相应的地址。这就好似快递员将快递送到你家一样,你家就是存储空间,快递员是CPU,快递是数据,如果快递员不知道你家地址,那么快递就无法到家,因此有必要填写家庭地址。

存储器映射

为存储器的存储空间分配地址的行为就是存储器映射。查阅F28335的数据手册,可得F28335的存储器映射地址如图所示。

在这里插入图片描述

作如下几点说明:

  1. 空间大小的计算:比如M1的地址范围为0x800-0x400,则0x800-0x400=0x400=1024(dec)=1k,也就是说有1k的存储空间,而每个存储空间的大小为16位(这一点大家在之后编程的时候会发现,F28335操作的每一个寄存器大多数都是16位的),因此为1k×16。可能有人说该空间的大小为2k,这也是正确的,这是因为原则上认为1位就是1bit,而8位构成1字节(byte),1024个字节构成1kb,因此1k×16的大小为1k×2×8=2k×8;

  2. FLASH的地址为0x30 0000-0x34 0000;BOOT ROM的地址为0x3F E000-0x3F FFC0;OPT ROM的地址为0x38 0000-0x38 0800;SARAM的地址就是0x00 0000-0x00 0800的M0、M1以及L0-L7;

  3. 外设帧 0/1/2/3,这 4 个空间也是存储空间同样分配了地址,但是它们只能是数据空间。设帧 1/2/3 空间是 Protected,表示这三个空间存放的寄存器不可以随便配置,若要对存放在 Protected 空间内的寄存器进行配置,要进行 EALLOW 声明,以 EDIS 结束声明,起到保护和警示作用。

寄存器映射

F28335片上集成了I/O以及多个外设,如SPI、SCI、EPWM、ECAP等,而操作F28335片上外设的本质就是在外设帧中相应存储空间写入或者读出数据,由于这一部分存储空间需要经常使用,人为操作频繁,因此正常编程时,需要频繁使用到这些存储空间的地址,而地址记忆时较为繁琐,因此可以为这些存储空间取人脑较为容易记忆的名字,取得名字我们称为Xx寄存器,而取名字的过程称为寄存器映射。这样,在编程时我们就可以在CCS中写这些寄存器的名字来替代原先的地址,也就能直接改变存储空间中的值,从而达到控制片上外设的作用。

从寄存器以及寄存器的映射概念可以看到,寄存器本质上就是存储器的中一些常用的存储空间。前面我说过,在CPU中也有一些寄存器,它们本质上也是存储空间,而在编写汇编语言时我们要经常用到CPU中的这些存储空间,因此为了书写的方便,我们也用同样的方法为这些存储空间编写名字,也就有了AX、BX、CX、DX、SI等。

下面我将以片上外设GPIO为例,说明在CCS中它是如何将GPIO下存储空间的地址进行映射。

先看下面这一条语句,这是一条非常简单的将GPIO68设置为高电平的语句。从该语句的结构上看,GpioDataRegs事实上是一个结构体,同时它也是映射后的寄存器。

GpioDataRegs.GPCSET.bit.GPIO68=1;

查看GpioDataRegs的说明,如下:

#ifdef __cplusplus
#pragma DATA_SECTION("GpioDataRegsFile")
#else
#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");
#endif
volatile struct GPIO_DATA_REGS GpioDataRegs;

可以看到,GpioDataRegs是一个volatile struct GPIO_DATA_REGS类型的结构体。

(从目前看到的情况来说,GpioDataRegs就是一个volatile struct GPIO_DATA_REGS类型的结构体变量,而我们前面说对GPIO的操作实际上是对GPIO存储空间地址下的存储器进行数据写入或读出,我们既需要将GpioDataRegs当作一个寄存器,也需要对存储空间地址操作,显然根据寄存器映射的概念,我们需要将GpioDataRegs与存储空间地址结合在一起,也就是给存储空间地址取名为GpioDataRegs,这是“#pragma DATA_SECTION(GpioDataRegs,“GpioDataRegsFile”);”语句的作用。)

打开“DSP2833x_Headers_nonBIOS.cmd”文件,找到GpioDataRegsFile存在的语句如下:

GpioDataRegsFile  : > GPIODAT      PAGE = 1

可以看到,GpioDataRegsFile指向了GPIODAT,那么在该文件中找到GPIODAT存在的语句如下:

GPIODAT     : origin = 0x006FC0, length = 0x000020     /* GPIO data registers */

可以看到,最终寄存器GpioDataRegs指向的地址为0x006FC0,长度为0x20,也就是32×16位。

下面说明寄存器GpioDataRegs为什么指向的地址为0x006FC0,其长度又为什么是32×16位。首先从寄存器的名字可以看到,这是GPIO数据寄存器,查阅F28335的数据手册中GPIO数据寄存器地址映射情况如图所示。

img

可以看到,寄存器GpioDataRegs实际上是一个大类寄存器,其下包括了GPADAT-GPCTOGGLE等多个寄存器,而GPADAT寄存器的起始地址为0x6FC0,因此GpioDataRegs的起始地址也应该为0x006FC0。

回到“volatile struct GPIO_DATA_REGS GpioDataRegs;”语句中,点击GPIO_DATA_REGS可以看到该结构体的定义为:

struct GPIO_DATA_REGS {
   union  GPADAT_REG       GPADAT;       // GPIO Data Register (GPIO0 to 31)
   union  GPADAT_REG       GPASET;       // GPIO Data Set Register (GPIO0 to 31)
   union  GPADAT_REG       GPACLEAR;     // GPIO Data Clear Register (GPIO0 to 31)
   union  GPADAT_REG       GPATOGGLE;    // GPIO Data Toggle Register (GPIO0 to 31) 
   union  GPBDAT_REG       GPBDAT;       // GPIO Data Register (GPIO32 to 63)
   union  GPBDAT_REG       GPBSET;       // GPIO Data Set Register (GPIO32 to 63)
   union  GPBDAT_REG       GPBCLEAR;     // GPIO Data Clear Register (GPIO32 to 63)
   union  GPBDAT_REG       GPBTOGGLE;    // GPIO Data Toggle Register (GPIO32 to 63)
   union  GPCDAT_REG       GPCDAT;       // GPIO Data Register (GPIO64 to 95)
   union  GPCDAT_REG       GPCSET;       // GPIO Data Set Register (GPIO64 to 95)
   union  GPCDAT_REG       GPCCLEAR;     // GPIO Data Clear Register (GPIO64 to 95)
   union  GPCDAT_REG       GPCTOGGLE;    // GPIO Data Toggle Register (GPIO64 to 95)
   Uint16                  rsvd1[8];
};

总结

  • F28335的内核CPU与存储器是相互独立的;
  • 寄存器与存储器本质是都是具体存在物理存储空间;
  • 给存储器的存储空间分配地址的过程称为存储器映射;
  • 一些存储空间需要经常操作,而直接操作地址的出错率较大,因此可以将存储空间的地址取人类容易记忆的名字,该过程称为寄存器映射,取得名字(指向存储空间的地址)称为寄存器。

标签:Register,笔记,学习,地址,DSP,寄存器,GPIO,GpioDataRegs,存储空间
From: https://www.cnblogs.com/youngwuu/p/18166348

相关文章

  • 【笔记】Burnside 引理
    (轨道公式)$$|G|=|G_x|\cdot|O_x|$$对于\(G\)在\(\Omega\)上的群作用,\(\forallx\in\Omega\),定义\(O_x:=\{g(x)\midg\inG\}\),称为\(x\)的\(G\)-轨道。定义\(G_x:=\{g\inG\midg(x)=x\}\),称为\(x\)的稳定子群,它的确是\(G\)的子群。而轨道有如下性质......
  • C# 002 新建项目前要学习的东西
    一、注释  在写代码前,需要知道的是代码的连个注释:单行注释//,换行就不起作用了。多行注释/*这里是内容*/,注释开头是/*,只要没找到*/,注释就不会结束。//单行注释staticvoidMain(string[]args){Console.WriteLine("Hello,World!");//这个是单行注释Console.Wri......
  • DSP学习笔记(1)
    DSP28335最小系统电源电路晶振电路作用:提供稳定的时钟晶振频率:一般为30MHz复位电路使用JTag烧录程序过程中不能复位,否则芯片可能锁死下载电路F28335启动模式存储器与寄存器F28335芯片内部的存储器包括了256K×16位的FLASH(ROM),34K×16位的SARAM,8K×16......
  • upload-labs挑战笔记
    Pass-01直接上传php木马,发现前端报错关掉JS,再次进行上传右键获取地址获取shellPass-02在服务器端对数据包的MIME进行检查,只让Content-Type为image/jpeg|image/png|image/gif的文件通过。由此可知,它只对Content-Type做了判断,并没有对文件进行判断,因此我们可以上传.ph......
  • 几种unhook手法的学习
    文章首发阿里云先知社区:https://xz.aliyun.com/t/14310了解过免杀的都知道,杀软会对敏感api进行hook操作,而我们通常有两种方式进行解决,syscall和unhook,而我们在syscall的时候有时候会导致堆栈不完整,在杀软看来是一些异常的行为,比如下图可以看到RIP指针直接已经在Progra......
  • Asp-Net-Core开发笔记:进一步实现非侵入性审计日志功能
    前言上次说了利用AOP思想实现了审计日志功能,不过有同学反馈还是无法实现完全无侵入,于是我又重构了一版新的。回顾一下:Asp-Net-Core开发笔记:实现动态审计日志功能现在已经可以实现对业务代码完全无侵入的审计日志了,在需要审计的接口上加上[AuditLog]特性,就可以记录这个接口......
  • 网络安全学习启航
     “没有网络安全,就没有国家安全”国家有人民子弟兵,在国家需要之时,国家和人民受到威胁之时,可以挺身而出,是我们可感知的世界的存在。而网络安全讲的是信息层面的安全,是隐藏在我们日常生活背后的安全。学好网络安全不但是一个人自身技能的提升,也是一份使命的承诺,当人民和国家的信......
  • git学习总结
    git总结 1、cdgitspace2、gitclone3、cd gitspace4、gitaddreadme.txt5、gitcommit-a-m 'study'6、gitpullssh://s7、gitpushoriginHEAD:refs/for/master 如果输入$gitremoteaddorigin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git ......
  • Binomial Sum 学习笔记
    BinomialSum如果我们有一个微分有限函数\(F(z)\),还有另外一个生成函数\(G(z)\),一个数列\(a\),如果我们能对\(k\in[0,n]\)的每一个\(k\)快速求出\(G^k(z)\)的前\(n\)项系数带权和,即\[b_k=\sum_{i=0}^na_i[z^i]G^k(z)\]那么我们可以在\(\Theta(n)\)的时间复杂度内......
  • 23种设计模式笔记-创建型模式
    23种设计模式-创建型模式笔记模板模式前提-模式:概念:规则:实现细节:应用场景:示意图:代码实现:创建型模式单例、工厂方法、抽象工厂、生成器、原型。单例模式-共享独占资源概念:创建型设计模式,保证一个类只有一个实例,提供全局访问点来对单个实例进行访问规则:......