CLA的相关介绍请看上篇 here

CLA使用C语言编程的配置

cmd文件部分

/**********需要定义的变量*************/
CLA_SCRATCHPAD_SIZE = 0x100;
_Cla1Prog_Start = _Cla1funcsRunStart;  //cla 程序的起始地址定义
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
/*********************************/MEMORY
{PAGE 0 :   /* Program Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */RAML0       : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 *///RAML1       : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */RAML3       : origin = 0x009000, length = 0x001000      /* on-chip RAM block L3 */OTP         : origin = 0x3D7800, length = 0x000400     /* on-chip OTP */FLASHH      : origin = 0x3D8000, length = 0x004000     /* on-chip FLASH */FLASHG      : origin = 0x3DC000, length = 0x004000     /* on-chip FLASH */FLASHF      : origin = 0x3E0000, length = 0x004000     /* on-chip FLASH */FLASHE      : origin = 0x3E4000, length = 0x004000     /* on-chip FLASH */   FLASHD      : origin = 0x3E8000, length = 0x004000     /* on-chip FLASH */
//   FLASHC      : origin = 0x3EC000, length = 0x004000     /* on-chip FLASH */FLASHA_B    : origin = 0x3F0000, length = 0x007F80     /* on-chip FLASH */CSM_RSVD    : origin = 0x3F7F80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */CSM_PWL_P0  : origin = 0x3F7FF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */FPUTABLES   : origin = 0x3FD590, length = 0x0006A0  /* FPU Tables in Boot ROM */IQTABLES    : origin = 0x3FDC30, length = 0x000B50    /* IQ Math Tables in Boot ROM */IQTABLES2   : origin = 0x3FE780, length = 0x00008C    /* IQ Math Tables in Boot ROM */IQTABLES3   : origin = 0x3FE80C, length = 0x0000AA    /* IQ Math Tables in Boot ROM */ROM         : origin = 0x3FF3B0, length = 0x000C10     /* Boot ROM */RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */PAGE 1 :   /* Data Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation *//* Registers remain on PAGE1                                                  */BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */RAML1       : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */RAML2       : origin = 0x008C00, length = 0x000400     /* on-chip RAM block L2 */RAML4       : origin = 0x00A000, length = 0x002000     /* on-chip RAM block L4 */RAML5       : origin = 0x00C000, length = 0x002000     /* on-chip RAM block L5 */RAML6       : origin = 0x00E000, length = 0x002000     /* on-chip RAM block L6 */RAML7       : origin = 0x010000, length = 0x002000     /* on-chip RAM block L7 */RAML8       : origin = 0x012000, length = 0x001800     /* on-chip RAM block L8 */USB_RAM     : origin = 0x040000, length = 0x000800     /* USB RAM         */FLASHC      : origin = 0x3EC000, length = 0x004000     /* on-chip FLASH */CLATOCPU_MSGRAM :origin = 0x001480, length = 0x000080CPUTOCLA_MSGRAM  :origin = 0x001500, length = 0x000080
}/* Allocate sections to memory blocks.Note:codestart user defined section in DSP28_CodeStartBranch.asm used to redirect codeexecution when booting to flashramfuncs  user defined section to store functions that will be copied from Flash into RAM
*/SECTIONS
{/* Allocate program areas: */.cinit              : > FLASHA_B,   PAGE = 0.pinit              : > FLASHA_B,   PAGE = 0.text               : > FLASHA_B,   PAGE = 0codestart           : > BEGIN,      PAGE = 0ramfuncs            : LOAD = FLASHD,RUN = RAML0,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),LOAD_SIZE(_RamfuncsLoadSize),PAGE = 0csmpasswds          : > CSM_PWL_P0, PAGE = 0csm_rsvd            : > CSM_RSVD,   PAGE = 0/* Allocate uninitalized data sections: */.stack              : > RAMM0,      PAGE = 1.ebss               : > RAML2,    PAGE = 1.esysmem            : > RAML2,    PAGE = 1/* Initalized sections to go in Flash *//* For SDFlash to program these, they must be allocated to page 0 */.econst             : > FLASHA_B,   PAGE = 0.switch             : > FLASHA_B,   PAGE = 0/* Allocate IQ math areas: */IQmath              : > FLASHA_B,   PAGE = 0            /* Math Code */IQmathTables        : > IQTABLES,   PAGE = 0, TYPE = NOLOAD/* Allocate FPU math areas: */FPUmathTables       : > FPUTABLES,  PAGE = 0, TYPE = NOLOADDMARAML5              : > RAML5,      PAGE = 1DMARAML6            : > RAML6,      PAGE = 1DMARAML7            : > RAML7,      PAGE = 1DMARAML8            : > RAML8,      PAGE = 1   Cla1Prog             : LOAD = FLASHE,RUN  = RAML3,LOAD_START(_Cla1funcsLoadStart),LOAD_END(_Cla1funcsLoadEnd),RUN_START(_Cla1funcsRunStart),LOAD_SIZE(_Cla1funcsLoadSize),PAGE = 0Cla1ToCpuMsgRAM      : > CLATOCPU_MSGRAM, PAGE = 1CpuToCla1MsgRAM        : > CPUTOCLA_MSGRAM, PAGE = 1/*CLAscratch作用:当使用v6.1及以上的编译器时,CLA的代码可以使用C语言,由于不是汇编,它需要有类似于多余的区间用于存放局部变量等,你可以理解它为暂存器或者C里的堆栈。如果使用汇编写CLA的代码,则可以忽略。选择使用在RAML1区中作为CLA的使用内存,需要在C文件配置RAML1映射给CLA。*/CLAscratch       :{ *.obj(CLAscratch). += CLA_SCRATCHPAD_SIZE;*.obj(CLAscratch_end) } > RAML1,  PAGE = 1/* Uncomment the section below if calling the IQNexp() or IQexp()functions from the IQMath.lib library in order to utilize therelevant IQ Math table in Boot ROM (This saves space and Boot ROMis 1 wait-state). If this section is not uncommented, IQmathTables2will be loaded into other memory (SARAM, Flash, etc.) and will takeup space, but 0 wait-state is possible.*//*IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD{IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)}*//* Uncomment the section below if calling the IQNasin() or IQasin()functions from the IQMath.lib library in order to utilize therelevant IQ Math table in Boot ROM (This saves space and Boot ROMis 1 wait-state). If this section is not uncommented, IQmathTables2will be loaded into other memory (SARAM, Flash, etc.) and will takeup space, but 0 wait-state is possible.*//*IQmathTables3    : > IQTABLES3, PAGE = 0, TYPE = NOLOAD{IQmath.lib<IQNasinTable.obj> (IQmathTablesRam)}*//* .reset is a standard section used by the compiler.  It contains the *//* the address of the start of _c_int00 for C Code.   /*/* When using the boot ROM this section and the CPU vector *//* table is not needed.  Thus the default type is set here to  *//* DSECT  */.reset              : > RESET,      PAGE = 0, TYPE = DSECTvectors             : > VECTORS,    PAGE = 0, TYPE = DSECT}/*
//===========================================================================
// End of file.
//===========================================================================
*/

cmd的重点修改地方如下:

CLAShared.h

#ifndef CLA_SHARED_H
#define CLA_SHARED_H#ifdef __cplusplus
extern "C" {#endif//
// Included Files
//
//  #include "IQmathLib.h"#include "DSP28x_Project.h"//
// Defines
//#define DS_CLA_DEBUG    1 //需要要调试时置1
extern Uint16  VoltFilt;    //在main.c中有定义
extern Uint16  GOTO_CLA[3]; //在main.c中有定义extern float32 ClaVal; //在main.c中有定义//
// The following are symbols defined in the CLA assembly code
// Including them in the shared header file makes them
// .global and the main CPU can make use of them.
//extern Uint16 Cla1Prog_Start; //cla 程序的起始地址__interrupt void Cla1Task1();__interrupt void Cla1Task2();__interrupt void Cla1Task3();__interrupt void Cla1Task4();__interrupt void Cla1Task5();__interrupt void Cla1Task6();__interrupt void Cla1Task7();__interrupt void Cla1Task8();#ifdef __cplusplus
}
#endif /* extern "C" */#endif  // end of CLA_SHARED definition//
// End of File
//

main.c,里面的ADC模块,ePWM模块请看上一篇介绍。

#include "DSP28x_Project.h"
#include "Usart.h"
#include <stdio.h>
#include "ADC.h"
#include "ePWM.h"#include "CLAShared.h"
#include <string.h>/*** main.c**/#pragma DATA_SECTION(VoltFilt,   "Cla1ToCpuMsgRAM");
#pragma DATA_SECTION(ClaVal,    "Cla1ToCpuMsgRAM");Uint16  VoltFilt;#pragma DATA_SECTION(GOTO_CLA,    "Cla1ToCpuMsgRAM");
Uint16  GOTO_CLA[3];float32 ClaVal;extern Uint16 Cla1funcsLoadStart;
extern Uint16 Cla1funcsLoadEnd;
extern Uint16 Cla1funcsRunStart;
extern Uint16 Cla1funcsLoadSize;
void init_cla(void);//cla初始化函数interrupt void cla1_isr1(void);//cla 任务1完成后在C28x CPU中触发的中断服务函数int main(void)
{InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();init_cla();Usart_Init(9600);    //此函数需要各位自己写//adcADC_Init();InitAdcConfigAndIO();
#if Interrupt_Allow == 1OpenAdcInterrupt_PIE();
#endifePWM_init();msg="Hello,CLA TEST!\r\n\0";UARTa_SendString(msg);GetChResult(1,9,5);//5-epwm1a SOCa 触发while(1);
}void init_cla(void)
{EALLOW;//在PCLKCR3寄存器中使能CLA时钟,一般这句话不用写,因为在InitSysCtrl();函数中就已经配置了所有外设的时钟;SysCtrlRegs.PCLKCR3.bit.CLA1ENCLK=1;//将CLA的TASK函数绑定到中断向量表上Cla1Regs.MVECT1 = (Uint16)((Uint32)&Cla1Task1 -(Uint32)&Cla1Prog_Start);Cla1Regs.MVECT8 = (Uint16)((Uint32)&Cla1Task8 -(Uint32)&Cla1Prog_Start);//设置每个TASK的触发源,有三种选项,PWM触发、ADC触发以及软件触发Cla1Regs.MPISRCSEL1.bit.PERINT1SEL=CLA_INT1_ADCINT1;//ADCINT1触发任务1Cla1Regs.MPISRCSEL1.bit.PERINT2SEL=CLA_INT2_NONE;Cla1Regs.MPISRCSEL1.bit.PERINT3SEL=CLA_INT3_NONE;Cla1Regs.MPISRCSEL1.bit.PERINT4SEL=CLA_INT4_NONE;Cla1Regs.MPISRCSEL1.bit.PERINT5SEL=CLA_INT5_NONE;Cla1Regs.MPISRCSEL1.bit.PERINT6SEL=CLA_INT6_NONE;Cla1Regs.MPISRCSEL1.bit.PERINT7SEL=CLA_INT7_NONE;Cla1Regs.MPISRCSEL1.bit.PERINT8SEL=CLA_INT8_NONE;//将CLA代码拷贝入CLA的代码段,因为CLA的代码需要单独放在一个固定的位置,所以需要执行这一段代码memcpy(&Cla1funcsRunStart, &Cla1funcsLoadStart, (Uint32)&Cla1funcsLoadSize);//如果需要使用到软件触发,那么需要执行Cla1Regs.MCTL.bit.IACKE = 1;Cla1Regs.MCTL.bit.IACKE = 1;//使能软件中断Cla1Regs.MIER.all = (M_INT1  | M_INT8);//使能2个任务中断//将CLA的数据段和程序段都映射到CLA空间Cla1Regs.MMEMCFG.bit.PROGE = 1;//把RAML3映射为CLA的程序空间Cla1Regs.MMEMCFG.bit.RAM1CPUE=0;//RAML1区,CPU不允许读写Cla1Regs.MMEMCFG.bit.RAM1E=1;//RAML1区,CLA允许读写// Enable INT 11.1 in the PIE (CLA Task1)// Enable INT 11 at the CPU level// Enable Global interrupts with INTM// Enable Global realtime interrupts with DBGM//EALLOW;PieVectTable.CLA1_INT1 = &cla1_isr1;   //自定义中断函数EDIS;PieCtrlRegs.PIEIER11.bit.INTx1 = 1;IER |= M_INT11;EINT;ERTM;//触发TASK8Cla1ForceTask8();}interrupt void cla1_isr1(void)
{char NUMCHAR_[64];AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//Must clear ADCINT1 flag since INT1CONT = 0PieCtrlRegs.PIEACK.all = 0xFFFF;/*串口打印数据*/sprintf(NUMCHAR_,"CLA TEST: sample time: %d;cla_val:%f V.\r\n",(Uint16)VoltFilt,ClaVal);UARTa_SendString(NUMCHAR_);sprintf(NUMCHAR_,"CLA ePWM2 TBPHS: %d.\r\n",EPwm2Regs.TBPHS.half.TBPHS);UARTa_SendString(NUMCHAR_);sprintf(NUMCHAR_,"CLA info: %c %c %c.\r\n",GOTO_CLA[0],GOTO_CLA[1],GOTO_CLA[2]);UARTa_SendString(NUMCHAR_);}

CLA_Task.cla,在此文件编写CLA的程序,注意保存文件后缀为cla

/** CLA_Task.cla**  Created on: 2023年3月6日*      Author: chends*/
#include "DSP28x_Project.h"
#include "CLAShared.h"    //直接引用
//#include XSTRINGIZE(XCONCAT(TEXT,CLAShared.h))    //如果使用此方法,注释上一行。此方法是链接到头文件CLAShared.h,TEXT需要在工程属性里面定义。__interrupt void
Cla1Task1(void) //任务1
{float phaseVal;#if DS_CLA_DEBUG ==1__mdebugstop();   //调试的断点
#endifVoltFilt +=1;   //计数进入Task1的次数//计算ADC采样结果ClaVal=AdcResult.ADCRESULT0;ClaVal +=AdcResult.ADCRESULT1;ClaVal +=AdcResult.ADCRESULT2;ClaVal +=AdcResult.ADCRESULT3;ClaVal +=AdcResult.ADCRESULT4;ClaVal +=AdcResult.ADCRESULT5;ClaVal +=AdcResult.ADCRESULT6;ClaVal +=AdcResult.ADCRESULT7;ClaVal +=AdcResult.ADCRESULT8;ClaVal +=AdcResult.ADCRESULT9;ClaVal +=AdcResult.ADCRESULT10;ClaVal +=AdcResult.ADCRESULT11;ClaVal +=AdcResult.ADCRESULT12;ClaVal +=AdcResult.ADCRESULT13;ClaVal +=AdcResult.ADCRESULT14;ClaVal +=AdcResult.ADCRESULT15;ClaVal /=16;ClaVal /=4096;ClaVal *=3.3;//计算PWM偏移的相位phaseVal=ClaVal/3.3;phaseVal = phaseVal*2500;phaseVal = 2500-phaseVal;EPwm2Regs.TBPHS.half.TBPHS = (Uint16)phaseVal;//设置GOTO_CLA的值if(VoltFilt>20){GOTO_CLA[0]='C';GOTO_CLA[1]='L';GOTO_CLA[2]='A';}if(VoltFilt>50){GOTO_CLA[0]='C'+VoltFilt-50;GOTO_CLA[1]='L'+VoltFilt-50;GOTO_CLA[2]='A'+VoltFilt-50;}}__interrupt void
Cla1Task2 (void)
{}
__interrupt void
Cla1Task3 (void)
{}
__interrupt void
Cla1Task4 (void)
{}
__interrupt void
Cla1Task5 (void)
{}
__interrupt void
Cla1Task6 (void)
{}
__interrupt void
Cla1Task7 (void)
{}
__interrupt void
Cla1Task8 (void)
{//任务8用于初始化参数值VoltFilt=0;GOTO_CLA[0]='i';GOTO_CLA[1]='n';GOTO_CLA[2]='t';
}//
// End of File
//
  • #include XSTRINGIZE(XCONCAT(TEXT,CLAShared.h)) 说明:
    TEXT的定义如下,由于我的共享头文件名称就叫CLAShared.h,所以我直接把TEXT定义为空即可。如果你的文件名为demo_CLAShared.h的话,则需要设置 TEXT=demo,文件中写入#include XSTRINGIZE(XCONCAT(TEXT,_CLAShared.h))。这种方法好处是,可以在不修改源代码下,引入不同的头文件,只需要修改工程属性里的TEXT即可。

实验现象

  • 串口打印的数据如下:
  • PWM波形图如下:
    • cla_val=3.3V
    • cla_val=0V ~ 3.3V之间
    • cla_val=0V

DSP TMS320F2803x、TMS320F2806x CLA开发笔记(代码基于TMS320F28069 详解)- 使用C语言编程CLA相关推荐

  1. DSP TMS320F2803x、TMS320F2806x CLA开发笔记(代码基于TMS320F28069 详解)

    详解DSP F28069的CLA模块,及代码讲解(适用于2803x.2805x.2806x 型号) CLA特性: • 时钟速率与主 CPU 一致 (SYSCLKOUT). • 一个独立的架构使得 CL ...

  2. DSP TMS320F2803x、TMS320F2806x CPU Timer定时器开发笔记(代码基于TMS320F28069 详解)

    详解DSP F28069的 CPU Timer定时器模块,及代码讲解 32-Bit CPU Timers 0/1/2 代码讲解 timer.h /** Timer.h** Created on: 20 ...

  3. DSP TMS320F2803x、TMS320F2806x COMP比较器模块开发笔记(代码基于TMS320F28069 详解)

    详解DSP F28069的COMP比较器模块,及代码讲解(适用于2802x.2803x.2806x.M35x.M36x 型号) 比较器 (COMP) 模块 比较器模块是一个真正的模拟电压比较器在VDD ...

  4. Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)

    本篇文章是对Android中的Log进行了详细的分析介绍,需要的朋友参考下 在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一 ...

  5. DSP TMS320F2803x、TMS320F2806x ADC开发笔记(代码基于TMS320F28069)

    TMS320F2803x.TMS320F2806x ADC开发笔记 ADC模块框图 SOC结构 中断结构 ADC转换时序 直接上代码 ADC.C文件如下: /** 粗略的延时函数,大于或等于1ms*/ ...

  6. 爬虫笔记:Requests库详解

    什么是Requests 之前讲解了爬虫笔记:Urllib库详解发现确实有不方便的地方,比如加一个代理,cookie,发送post请求比较繁琐. Request库能用几句话实现这些. Requests ...

  7. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  8. 【区块链开发入门】(四) Truffle详解篇2

    由于本篇篇幅较长,因此转为两篇文章.Truffle详解篇篇1请见:link 目录导航页 [区块链开发入门](一) 以太坊的搭建与运行 [区块链开发入门](二) 以太坊的编程接口 [区块链开发入门](三 ...

  9. iVX低代码平台系列详解 -- 概述篇(二)

    写在前面 ivx动手尝试电梯:ivx在线编辑器 iVX系列教程持续更新中 上篇文章可看:iVX低代码平台系列详解 – 概述篇(一) ivx目录 写在前面 一.iVX优势 1.快速学习 2.快速开发 3 ...

最新文章

  1. 银行核心海量数据无损迁移:TDSQL数据库多源异构迁移方案
  2. Visual Studio Code Go插件配置选项
  3. 线性代数及其应用_线性代数入门——行列式的简单应用选讲
  4. wincc历史数据库_WinCC系统的基本功能介绍——自动化工程师必备
  5. A20 文件系统预装APK
  6. 存储对手机性能的影响
  7. python中 * 的用法
  8. 软件测试三五七原则,运动前必看!“三五七”原则和注意事项
  9. 了解一下运行软件的自我保护(RASP)
  10. trump可音译为“专普”
  11. 计算机老师教育叙事,信息技术教育叙事范文10篇 初中
  12. 电脑主机插入耳机无声音
  13. 官版树莓派Pi Pico和YD-RP2040版本对比
  14. 一汽丰田RAV4电路图2012至2013
  15. 订单类 京东快递电子面单接口的使用开发
  16. HTML小游戏——打砖块
  17. uni-app 前后端实战课 - 《悦读》学习笔记:【创建项目、后端环境介绍】小程序开发实例教程1/
  18. bootstrap4导航栏居右
  19. Android 将PDF文件转Bitmap,并将Bitmap以图片的方式保存到相册
  20. 纵观30年5000多部国产电视剧,豆瓣评分最低的演员原来是……

热门文章

  1. 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
  2. php使用腾讯云存储
  3. 审视 Ajax,第 1 部分:透过华而不实的广告看本质zz
  4. Improved Prototypical Networks for Few-Shot Learning
  5. [Transformer]MViTv2:Improved Multiscale Vision Transformers for Classification and Detection
  6. 渗透测试常用浏览器插件汇总
  7. java中uploadify_java 上传3(uploadify中文api)
  8. 【博士论文】深度卷积神经网络架构设计及优化问题研究
  9. Express框架详解
  10. 一个女孩子的创业体验 (转载)