首页 > 应用与设计 > 工业应用 > C2837x入门指南 >

电机驱动

最新课程

热门课程

C2837x入门指南(十四) — CLA模块

这一章我们讲C2000最突出的部分 CLA 这章分为3部分 第一部分是CLA的设计目的 以及工作原理 第二部分 CLA的初始化过程 第三部分 CLA的寄存器 编程流程 调试流程 CLA是C2000非常特殊的一个协处理器 可以通过自定义的程序 和CPU并行处理程序 CLA是一个32位的浮点型内核 可以直接进行浮点数的运算 主要处理CPU中断时来不及处理的算法 分担CPU的负载率 CLA可以控制PWM HRPWM capture以及读取ADC的结果寄存器 及控制比较器等等 在F2837X产品中 CLA还可以控制 DAC SDFM SPI MCBSP GPIO以及UPP外设 让CLA控制更加灵活 还可以分担CPU通讯的负载 我们看看CLA的架构 由八个任务构成 任务1到8 任务1的优先级最高 任务8最低 CLA有自己的地址总线 和数据总线 分别和它数据和RAM通讯 还有一个和CPU交互的RAM空间 同时 CPU数据总线 还可以控制刚才提到的外设 任务方面 CPU任务结束后 还可以触发CPU的中断 以及CPU CLA任务的完成 我们看看CLA的组成结构 CLA的程序和数据空间 是LS0到4的RAM区域分配 可以设置6个量 [听不清]的RAM任务 给程序和数据 当然至少占用一个2K的RAM 分配个CLA的RAM区域 由CLA读写 CPU的控制权被降低 这是RAM分配 初始化 CPU的程序初始化的时候 进行处理 另外 还有128个word的交互区域 用于CPU和CLA的数据交互 同时 在DMA的章节提到了 PF外设必须有CLA或DMA单独控制 并且只能选择其一 当然 默认CLA控制 UDC寄存器和GPL数据 进行控制 CLA的8个任务相当于CPU的中断 每个任务都可以被多个软件或外设触发执行 但区别是 一个任务一旦执行 就不能被其他高优先级的任务打断 只能等到它执行完 才可进行新任务 这相当于CPU不支持中断嵌套的一个功能 CLA可以通过软件触发 有两种写法 第一种是通过MIFRC寄存器 写到对应位 比如CLA任务4 就是在MI FORCE.BIT.INT4-1 写上1 就被软件触发跑CLA task4的任务 还可以通过写IACK指令 也就是在汇编混合编程中 写IACk 后面写对应的数据 就可以触发相对应的任务 CLA有自己的优先级[听不清] 以及 MIFR MIER 在CLA中称为MIFR MIER 用于选择使能不同的任务 每次当一个触发源生效 就会选择相应的更高优先级的任务 载入MVECT 入口 也就是CLA的程序入口指针 到MPC 也就是程序指针地址 开始运行其中的程序 所有程序在program RAM中 读取 如果要读取数据 就需要到data memory中读取 而data RAM从MAR0MAR1读取数据 而MAR0和1是CLA的辅助寄存器 由于CLA本身是浮点内核 所以它的运算结果 都会存在MR0到3寄存器中 这张表我们简单看看CLA的寄存器 主要是 设置 状态 控制寄存器 首先是控制寄存器 主要是使能或禁止CLA的任务 以及软硬件的复位功能 CLA的RAM分配 前面提到了 这些寄存器在CPU中设置 可以把LS0到5 分配个CLA的数据和程序功能 也可以让某些区域不分配 所以这些RAM还可以还给CPU使用 也就是相对应 LS5可以分配给CPU 也可以分配给CLA CLA的8个任务 都可以选择触发源 下一页有一个触发源表 当然 可以选择软件触发 只要给每个寄存器的位写上0即可 这一页是CLA的任务触发源 可以是ADC的中断事件 PWM的中断事件 定时器 MCBSP ECAP EQEP SDLM UPP以及SPI的中断 或者事件来触发 CLA的每个任务都可以触发CPU的中断 所以 中断寄存器用于CPU中断的使能 CLA的初始化流程 比较简单 由6步组成 第一步在程序CMD中设置好CLA的下载地址 然后初始化时 把它拷贝到RAM 然后初始化CLA的RAM 接下来 初始化CLA的配置寄存器 包括使能CLA的时钟 写入函数地址 设置终端源 同时强制触发下一个CLA的 优先级任务来初始化CLA的RAM 第四步 是可选步骤 设置CLA任务来触发CLA中断 使能任务的MIER寄存器就可以 最后 设置触发任务的外设 这一页 重点提一下 如果要用CLA 就需要检查在项目的属性选项中 [听不清]是否使能了CLA 如图所示 如果是CLA0或者11 说明在编译器中使能了 CLA程序的特殊编译 CLA可以用C语言或者汇编语言编程 C语言用于对实时性要求没那么高的任务 C语言的优点就是可读性较高 编程比较方便 而汇编语言主要用于 高实时性控制的 当然对于编程方法 以及可读性会降低 CLA的数据定义和CPU不同 这里重点的是CLA不支持任何64位数据定义和运算 无论是long long或者long double型 在CLA的定义中 都会定义为32位 这一点和CPU非常不同 CLA的[听不清]定义也不一样 CLA不支持全局 或者静态变量的直接初始化 CLA的C语言文件 由.cla结尾 在.cla文件中 不能直接初始化全局变量 而是需要在.c文件中初始化好 然后在CLA中调用 或者直接使用宏定义定义好 当然可以用一个CLA任务 来运行 然后改变它的值来初始化 同时 这里重点提出的是 CLA静止函数的低轨应用 以及指针的使用 CLA不支持一些标准C的运算 比如除法去除运算 以及无符号32位整形的数据比较 但是 TI提供一整套CLA的数学库 在controlSUITE中可以找到 名字是CLA math 这个库里以适合CLA预算的方式 提供一套高效率的数学运算库 这张图我们看到 在controlSUITE中 我们提供非常多的CLA历程供用户测试 如图所示 CLA的应用 和CPU一样 它的预算会产生临时数据 所以CLA需要自己的堆栈 这里叫做sctratchpad 主要用于CLA存储临时数据 但这个区域需要在CMD中固定定义一个CLA的RAM给它 这边举例 我们把它定义在RAM L40中 当然 前提是RAM L40已经分给CLA 作为数据存储单元 这一页我们看看CAL的C语言程序举例 任务1触发为例 CLA的C语言程序 需要写在.cla的文件里 编译器才会识别 这个界面提到 对于程序 复制语句等等 都会存储于程序空间 临时变量 比如xdelay 等数组都会存储在数据空间 全局变量或者静态变量 也会存在数据空间 在程序中 使用的寄存器图文件 从LAB.H的库中调用 最后结尾的大括号[听不清] 会用mstop语句代替 表示任务的结束 CLA的初始化头文件 LAB.H主要是定义CLA的数据类型 以及调动外设的寄存器库 CLA的任务在程序中 被定义为中断类型函数 在.cla文件中 复制地址给对应CLA的寄存器 最后 我们看看最重要的CLA调试 它非常方便 简单 不需要额外的JTAG路 CPU功能一个JTAG的口 可以单步 全速运行调试 但是 CLA的单步是一个CLA的指令周期进行 不是常规和CPU一样 单个指令 单个语句的调试 有很大区别 主要分为6步 第一步 需要CLA任务在停下来的地方 加入medbugstop指令 可以用C语言或者汇编指令 第二步 在CCS调制中 连接你的CLA设备 第三步 运行CPU程序 这样 CLA会在CPU运行时 被触发 第四步 在CCS中 选择CLA 然后load code symbol 这样进入第五步 load symbol后 程序会停在刚刚设定的mdebugstop指令处 然后这个时候 我们就可以单步调试CLA程序了 但是如果有其他任务在等待 CLA会从其他任务的结尾处执行 最后 如果你不想调试CLA 那可以在连接的时候就disconnect CLA 这样CLA会在后台 自动全速运行它的程序

这一章我们讲C2000最突出的部分

CLA

这章分为3部分 第一部分是CLA的设计目的

以及工作原理

第二部分 CLA的初始化过程

第三部分 CLA的寄存器 编程流程 调试流程

CLA是C2000非常特殊的一个协处理器

可以通过自定义的程序

和CPU并行处理程序 CLA是一个32位的浮点型内核

可以直接进行浮点数的运算

主要处理CPU中断时来不及处理的算法

分担CPU的负载率

CLA可以控制PWM

HRPWM capture以及读取ADC的结果寄存器

及控制比较器等等

在F2837X产品中 CLA还可以控制

DAC SDFM SPI MCBSP GPIO以及UPP外设

让CLA控制更加灵活

还可以分担CPU通讯的负载

我们看看CLA的架构 由八个任务构成

任务1到8 任务1的优先级最高 任务8最低

CLA有自己的地址总线 和数据总线

分别和它数据和RAM通讯

还有一个和CPU交互的RAM空间

同时 CPU数据总线 还可以控制刚才提到的外设

任务方面 CPU任务结束后 还可以触发CPU的中断

以及CPU CLA任务的完成

我们看看CLA的组成结构

CLA的程序和数据空间 是LS0到4的RAM区域分配

可以设置6个量 [听不清]的RAM任务

给程序和数据

当然至少占用一个2K的RAM

分配个CLA的RAM区域 由CLA读写

CPU的控制权被降低

这是RAM分配 初始化 CPU的程序初始化的时候

进行处理

另外 还有128个word的交互区域

用于CPU和CLA的数据交互

同时 在DMA的章节提到了

PF外设必须有CLA或DMA单独控制

并且只能选择其一

当然 默认CLA控制

UDC寄存器和GPL数据

进行控制

CLA的8个任务相当于CPU的中断

每个任务都可以被多个软件或外设触发执行

但区别是 一个任务一旦执行 就不能被其他高优先级的任务打断

只能等到它执行完

才可进行新任务 这相当于CPU不支持中断嵌套的一个功能

CLA可以通过软件触发

有两种写法 第一种是通过MIFRC寄存器

写到对应位 比如CLA任务4 就是在MI FORCE.BIT.INT4-1

写上1 就被软件触发跑CLA task4的任务

还可以通过写IACK指令

也就是在汇编混合编程中

写IACk 后面写对应的数据

就可以触发相对应的任务

CLA有自己的优先级[听不清]

以及 MIFR MIER

在CLA中称为MIFR MIER

用于选择使能不同的任务

每次当一个触发源生效

就会选择相应的更高优先级的任务 载入MVECT

入口 也就是CLA的程序入口指针

到MPC 也就是程序指针地址

开始运行其中的程序

所有程序在program RAM中

读取 如果要读取数据

就需要到data memory中读取

而data RAM从MAR0MAR1读取数据

而MAR0和1是CLA的辅助寄存器

由于CLA本身是浮点内核 所以它的运算结果

都会存在MR0到3寄存器中

这张表我们简单看看CLA的寄存器

主要是 设置 状态 控制寄存器

首先是控制寄存器

主要是使能或禁止CLA的任务

以及软硬件的复位功能

CLA的RAM分配 前面提到了

这些寄存器在CPU中设置 可以把LS0到5

分配个CLA的数据和程序功能

也可以让某些区域不分配

所以这些RAM还可以还给CPU使用

也就是相对应 LS5可以分配给CPU

也可以分配给CLA

CLA的8个任务 都可以选择触发源

下一页有一个触发源表

当然 可以选择软件触发

只要给每个寄存器的位写上0即可

这一页是CLA的任务触发源

可以是ADC的中断事件

PWM的中断事件 定时器 MCBSP

ECAP EQEP SDLM

UPP以及SPI的中断

或者事件来触发

CLA的每个任务都可以触发CPU的中断

所以 中断寄存器用于CPU中断的使能

CLA的初始化流程 比较简单

由6步组成 第一步在程序CMD中设置好CLA的下载地址

然后初始化时 把它拷贝到RAM

然后初始化CLA的RAM

接下来 初始化CLA的配置寄存器

包括使能CLA的时钟

写入函数地址 设置终端源 同时强制触发下一个CLA的

优先级任务来初始化CLA的RAM

第四步 是可选步骤

设置CLA任务来触发CLA中断

使能任务的MIER寄存器就可以

最后 设置触发任务的外设

这一页 重点提一下 如果要用CLA

就需要检查在项目的属性选项中

[听不清]是否使能了CLA

如图所示

如果是CLA0或者11 说明在编译器中使能了

CLA程序的特殊编译

CLA可以用C语言或者汇编语言编程

C语言用于对实时性要求没那么高的任务

C语言的优点就是可读性较高

编程比较方便 而汇编语言主要用于

高实时性控制的 当然对于编程方法

以及可读性会降低

CLA的数据定义和CPU不同

这里重点的是CLA不支持任何64位数据定义和运算

无论是long long或者long double型

在CLA的定义中

都会定义为32位 这一点和CPU非常不同

CLA的[听不清]定义也不一样

CLA不支持全局 或者静态变量的直接初始化

CLA的C语言文件 由.cla结尾

在.cla文件中 不能直接初始化全局变量

而是需要在.c文件中初始化好

然后在CLA中调用 或者直接使用宏定义定义好

当然可以用一个CLA任务 来运行

然后改变它的值来初始化

同时 这里重点提出的是 CLA静止函数的低轨应用

以及指针的使用

CLA不支持一些标准C的运算 比如除法去除运算

以及无符号32位整形的数据比较

但是 TI提供一整套CLA的数学库

在controlSUITE中可以找到 名字是CLA math

这个库里以适合CLA预算的方式 提供一套高效率的数学运算库

这张图我们看到 在controlSUITE中

我们提供非常多的CLA历程供用户测试

如图所示

CLA的应用 和CPU一样

它的预算会产生临时数据 所以CLA需要自己的堆栈

这里叫做sctratchpad

主要用于CLA存储临时数据

但这个区域需要在CMD中固定定义一个CLA的RAM给它

这边举例 我们把它定义在RAM L40中

当然 前提是RAM L40已经分给CLA

作为数据存储单元

这一页我们看看CAL的C语言程序举例

任务1触发为例

CLA的C语言程序 需要写在.cla的文件里

编译器才会识别

这个界面提到 对于程序 复制语句等等

都会存储于程序空间 临时变量 比如xdelay

等数组都会存储在数据空间

全局变量或者静态变量 也会存在数据空间

在程序中 使用的寄存器图文件

从LAB.H的库中调用

最后结尾的大括号[听不清]

会用mstop语句代替 表示任务的结束

CLA的初始化头文件 LAB.H主要是定义CLA的数据类型

以及调动外设的寄存器库

CLA的任务在程序中 被定义为中断类型函数

在.cla文件中 复制地址给对应CLA的寄存器

最后 我们看看最重要的CLA调试

它非常方便 简单

不需要额外的JTAG路

CPU功能一个JTAG的口

可以单步 全速运行调试

但是 CLA的单步是一个CLA的指令周期进行

不是常规和CPU一样 单个指令 单个语句的调试

有很大区别

主要分为6步

第一步 需要CLA任务在停下来的地方 加入medbugstop指令

可以用C语言或者汇编指令

第二步 在CCS调制中 连接你的CLA设备

第三步 运行CPU程序

这样 CLA会在CPU运行时

被触发

第四步 在CCS中 选择CLA 然后load code symbol

这样进入第五步

load symbol后 程序会停在刚刚设定的mdebugstop指令处

然后这个时候 我们就可以单步调试CLA程序了

但是如果有其他任务在等待

CLA会从其他任务的结尾处执行

最后 如果你不想调试CLA

那可以在连接的时候就disconnect CLA

这样CLA会在后台 自动全速运行它的程序

视频报错
手机看
扫码用手机观看
收藏本课程

视频简介

C2837x入门指南(十四) — CLA模块

所属课程:C2837x入门指南 发布时间:2016.06.06 视频集数:28 本节视频时长:00:12:47
C2837x概述;芯片架构; 开发环境;外设寄存器操作;复位和中断;系统初始化;模拟子系统 ADC DAC CMP SDFM;控制类外设PWM CAP QEP。
TI培训小程序