DSP

【DSP入门】一文带你跨过TI TMS320F2803x 首个学习门槛

2019-07-13 11:18发布

摘要 对于德州仪器(TI)这家公司,相信大家再熟悉不过了,它是全球知名的半导体公司,为现实世界的信号处理提供数字信号处理(DSP)及模拟器件技术。除半导体业务外,还提供包括传感与控制、教育产品和数字光源处理解决方案。尤其是在数字开关电源和电机控制方面,C2000™系列的MCU应用尤其广泛。本文结合过往的经验,旨在帮助大家快速入门其中的TMS320F2803x 微控制器。   01 前期准备 前期准备分为以下几个方面。 1. 编译软件的获取和安装: IDE使用CCS(Code Composer Studio) ,目前TI官网已经更新到了V7.4.x版本了,该IDE是免费的,可以从以下链接获取。 http://www.ti.com/tool/ccstudio   2. 调试下载工具准备 如果不需要Trace功能的话,仿真调试盒推荐使用xds100V2或者xds100V3,可以去某宝中淘一个,很便宜。如果没有实际的2803x硬件板子,可以顺带一起买个开发板。 下载工具除了CCS外,还可以下载Unitflash软件。这个软件还可以用于后续产品量产后,产线的烧录软件: http://processors.wiki.ti.com/index.php/Category:CCS_UniFlash    3. 芯片参考手册收集 入门最初免不了进行底层驱动开发,官网的参考手册必不可少。不像其他家将所有外设介绍汇总在一份参考手册,TI将各个外设单独成册,好在这些文档的最前面章节都有汇总了所有参考手册的下载链接: http://www.ti.com.cn/product/cn/TMS320F28035/technicaldocuments 另外有点需要注意的是,flash,GPIO,PLL的介绍汇总在了TMS320F2803x Piccolo System Control and Interrupts.pdf中。害我当初好一阵找。   4. 外设例程 这个就不用再去各种论坛求爷爷告奶奶问别人要。这边提供两种方式获取。一种是你安装好CCS以后,主页有Browse Examples选项,点击进去以后选择相应的芯片信号即可查看各种外设例程。 另外一种就是去TI官网下载Control Suit软件,里面有各种资源,包括源码和一些培训资料。     02 开始学习 有了前面的准备后,入门就很轻松了。如果还没熟悉CCS的使用和工程的搭建,不妨导入上面第四点中已经下载的工程,查看下工程配置,然后实际下载到目标板子上看看。无论是何种IDE,原理都一样,如果你之前使用过其他IDE,这个就不在话下了。 外设学习的话,前期你可以先从例程入手,看看例程中是如何进行工程配置的:cmd文件的选择,编译选项的设置等。然后对照着外设的总体框图和寄存器的实际含义,阅读具体的代码,理清各个外设原理和配置流程即可。 学习过程中,如果碰到问题,不妨多看几次参考手册,确保理解没有偏差。实在解决不了的问题,可以去TI的官方论坛咨询。TI的官方论坛分为中文和英文的,建议优先去英文的论坛咨询,那边给予的回复专业一些。https://e2e.ti.com/    03 分享几个注意事项 分享几个自己在使用这款芯片过程中碰到的问题。
  1.  DSP C2000系列的DSP的最小存储单位是16bit,即便你定义一个Uint8的变量,实质上它也是占用了16bit。所以在使用联合体,计算空间大小等一些涉及到存储的地方,需要格外注意。
  2. 为了加快代码在Flash中的运行速度,记得enable flash的Pipeline模式,使不使能这个模式运行速度相差了好几倍。详情可以参考例程代码文件:DSP2803x_SysCtrl.c,里面提供了如何配置的代码。
  3. 部分外设的初始化有用到了__DSP28x_usDelay函数进行延时等待,但是这个函数是放在RAMfunction区域,所以生效的前提是RAMfunction的备份代码已经copy到了RAM区。相应的copy函数为:memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize)。 详情可以参考flash_f28035Example_2803xFlash.c
  4. ADC中断对应通道是SOC序号,不是ADC通道的序号:例如ADCA0的通道序号是0,如果将其配置到SOC2,那么ADC中断进行绑定通道时,要用序号2.
  5. 进行CANID配置前,一定要记得先禁用此MB,否则更改不会生效。
  6. 如果按位进行配置寄存器,建议先定义影子寄存器,将想要配置的位配完以后,再一次性赋值给寄存器,例子如下。在使用过程中,发现CAN相关的寄存器如果不这样操作,有的时候会更新错误。
    struct ECAN_REGS ECanaShadow;     EALLOW;     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;     ECanaShadow.CANMC.bit.STM = 1;         ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;     EDIS;       除了上述的事项以外,其实还碰到其他坑,限于篇幅,就先列这些。改天弄个汇总贴,单独来一篇。 转载是一种动力 分享是一种美德,欢迎关注本公众号,可以扫码或者微信搜索公众号:芯连心嵌入式设计交流