参考资料
- 使用的DSP型号为28377s,不过最近似乎更新了 TMS320F28378S
- 使用的硬件开发板,居然已经停产了。C2000 Delfino MCUs F28377S LaunchPad Development Kit
- 芯片数据手册 TMS320F2837xS Delfino™ 微控制器 数据表 (Rev. G)
- 芯片技术手册 TMS320F2837xS Delfino Microcontrollers Technical Reference Manual
- 参考书: 符晓,朱洪顺 著TMS320F28335 DSP原理、开发及应用
- 其他软硬件资源可以参考我的上一篇博文, TMS320F280049C 学习笔记1 概述,所有的官方例程可以在C2000Ware中找到。
- GPIO输入输出各种模式(推挽、开漏、准双向端口)详解
- Control Law Accelerator (CLA) Hands-On Workshop
- 【第九讲】TMS320F28335开发板之GPIO模块
- TI官方课程 C2837x入门指南
Flash和RAM中的代码效率
本节内容转自 28377D中代码在RAM和FLASH中执行时,效率差多远
一般我们建议将实时性要求比较高的代码,和FLASH初始化相关的代码,比如中断程序,放在RAM上运行。
在F2837xD/37xS/07x系列芯片里,它们使用的Flash是最新的65nm工艺(相比之前的是180nm),其Flash运算速度和执行效率已经大幅提高,等待周期也可以减少,因此会非常接近RAM上的速度,根据不同的代码,你可以参考下面的相关数据(请注意,Flash wait states是根据工艺强制要求的,比如F28335运行150MHz主频时,必须至少要5个,而F2837x则只需要2个 ):
GPIO的配置
- 使用时建议先将寄存器的值写入,再改变GPIO的方向。
- GPyDAT反应引脚状态,可以读状态,不建议直接使用它写状态,由于时序的原因,可能干扰其他引脚
- GPySET=1置高,GPyCLEAR=1置低,GPyTOGGLE=1翻转,写入0无效果。
- GPIO的功能复用表可参考技术手册7.7节
- 7.8节指出,芯片复位时GPIO处于输入模式,并禁止内部上拉。 这意味着上电瞬间DSP的引脚输出状态是高阻,也就是不确定的,在硬件设计时必须针对制定方案,添加上下拉电阻。避免不确定的状态导致IGBT等功率元件误动作。
- 本节针内部对上拉电阻的配置提出了要求。指出在小封装的型号上必须用GPIO_EnabledUnbondedIOPullups()函数可以使能未使用GPIO的上拉电阻。
示例 gpio_setup
GPIO及其复用的配置可以参考例程 “gpio_setup”。
- EALLOW,EDIS是成对使用的,有些寄存器是受到保护的,不能任意写
EALLOW相当于去掉保护,对写保护的寄存器进行操作后, EDIS 是重新把这个寄存器保护起来。 - 在 F2837xS_SysCtrl.c 文件中有注释提到
// IF RUNNING FROM FLASH, PLEASE COPY OVER THE SECTION ".TI.ramfunc" FROM FLASH TO RAM PRIOR TO CALLING InitSysCtrl(). THIS PREVENTS THE MCU FROM THROWING AN EXCEPTION WHEN A CALL TO DELAY_US() IS MADE.
即如果从Flash运行程序,需要在执行InitSysCtrl()前将.TI.ramfunc从FLASH复制到RAM中。
一些值得注意的问题
摘自【DSP入门】一文带你跨过TI TMS320F2803x 首个学习门槛
- 为了加快代码在Flash中的运行速度,记得enable flash的Pipeline模式,使不使能这个模式运行速度相差了好几倍。详情可以参考例程代码文件:DSP2803x_SysCtrl.c,里面提供了如何配置的代码。
- 部分外设的初始化有用到了__DSP28x_usDelay函数进行延时等待,但是这个函数是放在RAMfunction区域,所以生效的前提是RAMfunction的备份代码已经copy到了RAM区。相应的copy函数为:memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize)。 详情可以参考flash_f28035\Example_2803xFlash.c