MPC5634的eTPU模块学习笔记(一)

一、 MPC5634的eTPU简介

eTPU2是一种片上可编程的I/O控制器,具有自己的核心和内存系统,使其能够独立于设备CPU执行复杂的定时和I/O管理。eTPU2本质上是一个独立的微控制器,设计用于定时控制、I/O处理、串行通信、电机控制和发动机控制应用,重点包括:

  1.  独立于主机核心执行程序
  2. 检测并精确记录输入事件的时间安排
  3. 生成复杂的输出波形
  4. 由核心控制,而不需要实时的主机处理
  5. eTPU2专用通道包括两个匹配寄存器和两个捕获寄存器
  6. eTPU2包括最多两个eTPU引擎,它们通过服务通道硬件的特定指令进行优化
  7. eTPU2不会为服务定时事件创建主机开销

eTPU框图:

MPC5634的eTPU模块学习笔记(一)_第1张图片

eTPU引擎的方框图:

 MPC5634的eTPU模块学习笔记(一)_第2张图片

      eTPU2是一个实时微处理器子系统。因此,它从指令存储器(SCM)中运行微引擎代码来处理特定的事件,并为参数、工作数据和应用程序状态信息访问数据存储器(SDM)。事件可以来自I/O通道(由于引脚转换和/或时间基础匹配)、设备核心请求或通道间请求。调用本地eTPU处理的事件通过发出服务请求来激活微引擎。服务请求微码可以向设备核心发送一个中断,但设备核心不能被I/O通道事件直接中断。 

  每个通道都与一个定义其行为的函数相关联。函数是由一组微引擎例程组成的软件实体,称为线程,它们响应eTPU2服务请求。位于单片机中的功能例程也负责通道配置。一个函数可以分配给多个通道,但一个通道只能在给定的时刻与一个函数相关联。如果设备核心重新配置了通道功能,则eTPU2可以改变分配给该通道的功能。功能和通道之间的关联由设备核心定义。

     eTPU2引擎处理输入引脚转换并产生输出引脚波形。这些事件是由eTPU2计时器(时间基)触发的,它由一个系统时钟驱动,以提供绝对的时间控制,或由一个异步计数器,如一个角度时钟,可以跟踪一个旋转轴的角度。

     eTPU引擎有两个24位计数寄存器(TCR1和TCR2),它们为所有匹配和输入捕获事件提供参考时间基础。这两个时间基的预测器都由设备核心通过eTPU引擎配置寄存器中的位字段来控制。每个TCR1和TCR2计数器寄存器的值可以独立地从系统时钟或通过TCRCLK引脚从外部输入中导出。此外,TCR2时间基可以从特殊的角度时钟硬件中获得,从而能够实现基于角度的功能。添加此功能是为了支持高级的基于角度的引擎控制应用程序。TCR还可以通过共享时间和计数器(STAC)总线驱动eMIOS时间库,或者它们可以由eTPU2功能软件编写。

     eTPU2引擎有32个相同的独立通道。每个通道对应于一个输入/输出信号对。每个通道都可以访问24位计数器寄存器,TCR1和TCR2。每个通道由事件逻辑组成,它总共支持四个事件:两个捕获和两个匹配事件。事件逻辑包含两个24位捕获寄存器和两个24位匹配寄存器。匹配寄存器通过大于或等于仅的比较器与选定的TCR进行比较。匹配和比较寄存器对支持单操作功能和双操作函数的许多组合。

      eTPU2微引擎是一个简单的RISC实现,它在两个系统时钟的微周期中执行每一条指令,同时通过一个指令管道预抓取下一条指令。对于算术逻辑单元(ALU),指令执行时间是恒定的,除非它从SDM仲裁中获得等待状态。 

    二、编程知识点

    2.1.硬件底层简介

    编程其实还是配置基本的底层寄存器,这里我们需要了解eTPU的基本工作模式,它的基本工作模式主要有以下几个:

  1. 用户配置模式:通过访问共享代码存储器(SCM),该核心能够用时间函数对eTPU2核心进行                          编 程。
  2. 用户工作模式:该模式下,核心不访问eTPU2共享代码内存,使用eTPU2预定义的功能。
  3. 编程调试模式:通过Nexus接口访问特殊的跟踪和调试功能(需要自己开发接口)
  4. 模块禁用模式 :节省电源(停止输入采样),eTPU2引擎可以独立地处于禁用模式。模块禁用模式只停止eTPU引擎时钟,以便可以访问共享的BIU和全局通道寄存器

 内存地址映射图

MPC5634的eTPU模块学习笔记(一)_第3张图片

  主要常用寄存器有:

  1.  ETPU_MCR: eTPU模块配置寄存器,ETPU_MCR收集eTPU系统中的全局配置和状态,包括全局异常
  2. ETPU_ECR:eTPU引擎配置寄存器,ETPU_ECR保存在eTPU引擎中编程的配置和状态字段
  3. ETPU_MISCCMPR:eTPUMISC比较寄存器,该寄存器必须由主机编写的32位字,以便在MISC周期结束时与计算出的签名进行比较。

2.2.编程思路

   2.2.1初始化:由于eTPU是独立运行的,首先我们要配置它,这里需要把配置写到它的RAM里,第一步首先初始化eTPU的RAM。初始化好eTPU内存才可以配置,好了,我们先初始化它的内存,必须先让它停下来,配置CPU可以写eTPU。    

eTPU->ECR_A.B.MDIS = 1;    /* 关闭eTPU_A */
eTPU->ECR_B.B.MDIS = 1;    /* 关闭eTPU_B */
eTPU->MCR.B.VIS = 1;       /* 打开CPU写eTPU内存  */

         以下是相关寄存器:MPC5634的eTPU模块学习笔记(一)_第4张图片

MPC5634的eTPU模块学习笔记(一)_第5张图片 

 把需要控制的基地值和代码命令拷贝到eTPU内存中,其余不用的必须清零处理

   //举例,类似C代码复制拷贝内存,基地值,配置内存代码,和尺寸
code_end = fs_memcpy32((uint32_t*)0xC3FD0000, code, code_size); 
  
fs_memset32(uint32_t *code_end, 0, unused_code_ram);//不用的内存清零

	eTPU->MCR.B.VIS = 0;		/* 关闭CPU写eTPU */

 到这里我们的eTPU的内存已经初始化好了,我们可以直接操作寄存器进行配置了。

	// 配置 MISC 
	eTPU->MISCCMPR.R = 0xA9C75408; //在MCR中启用之前写入MISC值 
	eTPU->MCR.R = 0x00000000;

    /*配置eTPU A */
    eTPU->ECR_A.R = 0x00048000;
    eTPU->TBCR_A.R = 0x5a008000;
    eTPU->REDCR_A.R = 0x40004000;

    /* 配置eTPU B */

    eTPU->ECR_B.R = 0x00000000;
    eTPU->TBCR_B.R = 0x18000000;
    eTPU->REDCR_B.R = 0x40004000;

 总结:

      初始化分为两个步骤,一是eTPU内存初始化和配置初始化,个人理解,如果有误欢迎指导!

你可能感兴趣的:(MPC634底层硬件学习,fpga开发,单片机,嵌入式硬件)