DSP_基于TMS320F28377D双核芯片和CCS7.40的编程入门
开始之前明确一个东西裸机程序和RTOS程序的差别:参考下面三个连接瞅瞅
理解实时操作系统与裸机的区别-----Free RTOS 简介_书中倦客的博客-CSDN博客_裸机操作系统
裸机与RTOS的理解和并发带来的问题-电子发烧友网 (elecfans.com)
类似于STM32之类的单片机,RTOS比裸机真有那么大优势? (baidu.com)
总得来说呢,就是RTOS会损失部分DSP的运算效率,建议还是开发裸机程序吧。
DSP_基于TMS320F28335和CCS7.2的编程入门_heqiunong的博客-CSDN博客
在上一篇关于DSP的文章中,我们讲到了TMS320F28335芯片的编程入门,这款芯片是单核的,而本文涉及的TMS320F28377D是多核的。那么单核和多核编程直接是啥区别呢?对于TMS320F28377D,我感觉网上的资料不多,而且之前从来没有多核编程的经验,回想当初,我还是有些许的害怕的,其实掌握了还是很简单的,下面记录一下单核到多核的摸索之路。不要慌,循序渐进即可。
1. 仅用28377D的CPU1实现“单核”+ 在线模式(RAM)
在线模式程序烧写到RAM里运行,CPU1和CPU2的启停都受到仿真器的控制,断电重启后上次运行的程序会丢失,需要重新烧写。需要注意的重点是cmd文件要选对,因为是烧写到RAM,因此选择2837xD_RAM_lnk_cpu1.cmd。另外由于我们用的是裸机程序而非RTOS,因此还需要选择F2837xD_Headers_nonBIOS_cpu1.cmd。
DSP_基于TMS320F28335和CCS7.2的编程入门_heqiunong的博客-CSDN博客,前面我们讲过建议去TI官网去下载controlSUITE软件,所提及的cmd文件和各种源文件 库文件这个软件都能够提供。
下面详细介绍从打开CCS到把CPU1运行起来。 (warning:大量无情截图,毫无感情可言)
|
|
|
|
/** main.c** Created on: 2021年11月16日* Author: Heqiunong*/#include "F28x_Project.h"void main(void)
{InitSysCtrl();DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();EALLOW;GpioCtrlRegs.GPDPUD.bit.GPIO111 = 0;GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0; // GPIO111 = GPIO111GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1; // GPIO111 = outputEDIS;while(1){GpioDataRegs.GPDSET.bit.GPIO111 = 1;DELAY_US(1000000);GpioDataRegs.GPDCLEAR.bit.GPIO111 = 1;DELAY_US(1000000);}}
2. 仅用28377D的CPU1实现“单核”+ 离线模式(FLASH)
离线模式指用把程序烧写到Flash里运行,断电重启后,程序仍可正常运行。在线模式下,CPU1和CPU2的启动和停止都受仿真器控制。离线模式下,CPU2的启动受CPU1控制。
首先,代码需要做一个拷贝 memcpy。【注意:以下操作有效的前提是代码框架是按第一步那样搭建的】
其次,cmd文件需要换一个
编译上传后,断电,把仿真器拔掉,再上电。 程序依然正常运行,可以改变呼吸灯的频率简单验证程序是否离线运行正常。
3. CPU1 + CPU2 实现“双核”+ 在线模式(RAM)
为了验证双核的程序,基于双核实现不同频率的呼吸灯。TMS320F28377D的双核CPU1和CPU2,是近乎可视为各自独立的,从某种程度上,你可以把它视为两块单核的dsp来用。如果想要跑双核的程序,需要给CPU1和CPU2分别建一个工程。
3.1 CPU1和CPU2分别各建一个工程
首先需要说明的是CPU1和CPU2都需要设置一个 Predefined Symbols, CPU1就设置个CPU1,CPU2就设置个CPU2。 前文我们是在源文件里面#define CPU1。现在是我们换了一种更official的方法。
3.2 CPU1CPU2虽近乎独立,但它们应是主从关系
3.2.1 比如CPU2是无法配置GPIO的,它只能CPU1来配置
下面是CPU2的代码,里面尝试配置GPIO的上拉,复用和输出方向
因此GPIO的配置,则必须放在CPU1的工程里面。 我们的程序配置只需要配置两个连LED灯的GPIO MUX功能为GPIO,方向配置成输出。
3.2.2 另外还有一个证据说明CPU1 CPU2是主从关系
CPU1能够使用官方提供的所有source文件,而CPU2却有部分source文件是不支持的。如下图所示。
把图中出现问题,带有小红×的.c源文件删除,CPU2的工程即可正常编译。
3.3CMD文件的选择
CPU1工程 |
CPU2工程 |
3.4 仿真时,工程启动顺序(很关键)
首先用CPU1的工程来连接,并且把CPU1和CPU2两个都勾选上。 这特别关键,必须选对,它只给你选一次的机会,后面就不让你选了。我真的找了好久的接口,会的朋友可以教教我
然后,就会出现下图的情况
我们发现, 此时CPU2上目前加载的是CPU1工程的代码,因此我们需要替换成CPU2本身的代码,所以需要重新load。
好,现在CPU1是跑的是CPU1工程的程序,CPU2跑的CPU2程序。 现在还需要注意的是 先跑CPU1的程序,再跑CPU2的程序。
这样,就是双核在线模式的主要流程了
另外还有一个段代码需要注意
GPIO_SetupPinMux(111, GPIO_MUX_CPU2, 0);
这句话的意思应该是说,CPIO111复用给CPU2,里面各种指针满天飞,主要是设置偏移地址。
没这句话, CPU2里面对GPIO置位和清零操作是不起作用的。
4. CPU1 + CPU2 实现“双核”+ 离线模式(FLASH)
代码还是用双核在线模式的代码为基础,主要看一下怎么烧写到FLASH里面。
4.1 CMD文件的选择
CPU1工程的CMD |
CPU2工程的CMD |
4.2 代码需要注意的地方
CPU1工程添加两个预定义宏, CPU2工程需要添加一个预定义宏
强烈建议用上述方式去配置。
为什么呢? 因为你直接在main.c里面配置的话,包含InitSysCtrl的这个文件找不到_FLASH这个宏。
这个灰色的块,意思就是_FLASH没有被定义。
我尝试写一个main.h文件,把宏定义放在那里面。同时,Include Options把main.h的路径添加进去,但是还是找不到。
但在F2837xD_SysCtrl.c文件里面#include "main.h"就可以,后面再酌情优化一下吧。
以下是关键代码:
CPU1里的
#include "F2837xD_Ipc_drivers.h"
#ifdef _STANDALONE
#ifdef _FLASH//// Send boot command to allow the CPU02 application to begin execution//IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH); 这行会被执行
#else//// Send boot command to allow the CPU02 application to begin execution//IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif
#endif
CPU2工程里的
#ifdef _FLASHmemcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);InitFlash();
#endif
烧写和在线模式一样, CPU1工程启动绿色小爬虫, 然后再把CPU2的程序换成已编译好的CPU2工程的.out文件。
值得注意的是,这种模式无法在线调试,加断点什么的。 拔掉仿真器,然后断电重启,就可以正常跑起来了。
那如果要在线调试呢? 可以把_STANDALONE的预定义去掉,就可以了。
DSP_基于TMS320F28377D双核芯片和CCS7.40的编程入门相关推荐
- DSP_基于TMS320F28335和CCS7.2的编程入门
1.准备工作 1.1. 软件 CCS DSP芯片的编程环境 controlSUITE 初学者建议都装上 TI官方提供的通用:头文件.源文件.cmd文件.gel文件.lib文件及实例程序 如:C:\ti ...
- 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
1.项目背景: 目前随着电子领域的快速发展,芯片也已经成为日常生活中不可或缺的一部分.随着市场对芯片的需求不断增大,裸芯片表面缺陷检测任务的压力也越来越大.裸芯片表面的缺陷检测不仅能保证芯片成品的质量 ...
- 基于ESP32 D0WDQ6芯片+MicroPython的溢水报警系统
目录 背景 基本构思 设计原则 硬件介绍 ESP32D0WDQ6 土壤湿度传感器 JQ8400-10P MP3 module 其他 硬件连接 MicroPython代码 成品以及效果 背景 办公室里的 ...
- 基于STM32系列芯片的 IAP实现的探索
基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...
- 都2021年了,你还在考虑电赛飞行器赛题,备赛是否有必要用基于TI处理芯片的飞控问题?
无名创新售后群问题节选 @无名小哥 能问下今年国赛会不会指定某一款飞控呀? 答:都2021年了,你还在考虑电赛飞行器赛题备赛是否有必要用基于TI处理芯片的飞控问题? 暂不论官方是否会限定TI芯片的飞控 ...
- 基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析
基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析 随着现代生活节奏的加快,简单快捷的产品越来越受到人们的青睐,产品也越来越注重人机交互和简单明了的用户体验,一款具备LCD屏幕的产品往往更具有竞 ...
- 基于Intel 82571芯片的网卡介绍
英特尔®82571EB千兆位以太网控制器是一个单一的,紧凑的,带有两个完全组件集成千兆以太网媒体访问控制(MAC)和物理层(PHY)接口.该装置采用PCI Express架构(启1.0A ) ,并且还 ...
- 关于STM32H745xI双核芯片的SMPS和LDO配置,导致芯片无法复位,无法下载程序
关于STM32H745xI双核芯片的SMPS和LDO配置 最近在项目中遇到程序上电能跑,然后软件复位,或者按键复位的时候会跑不起来,无法复位,而且不能下载程序. 一开始怀疑是Boot0(双核的只有BO ...
- 在基于乐鑫芯片的用户定制开发板上开发 UI
在上一篇文章中,我们介绍了 SquareLine Studio 可视化 UI 开发工具,以及如何使用它来开发 UI.目前,它只适用于乐鑫官方推出自研的开发板.如果您想使用 SquareLine Stu ...
最新文章
- 黑马程序员-张老师基础加强3-内省
- ubuntu 安装qt5
- 云平台管理与部署---虚拟化平台-----KVM
- python学习笔记(七)——类基础
- Java远程方法调用
- jpa 实体图查询_JPA实体图
- Windows与Linux下tftp服务的使用
- 那些年,我们见过的 Java 服务端“问题”
- labview 远程连接linux,SSH交互式通信总结:expect、plink、putty、sshpass、ALAB SSH
- 下一步linux命令bzip,linux基础命令---bzip2
- 用python画渐变的圆_Python成像库(PIL)绘图 – 带渐变的圆角矩形
- Linux获得命令帮助(学习笔记五)
- Leaflet使用vector tiles 标注label设置
- python爬取qq音乐评论_教你用Python爬去QQ音乐评论
- 视频质量评价PSNR
- 栅格数据矢量化(附有完整代码)
- matlab读取sgy格式文件的m文件,matlab读取segy格式的文件
- TF-IDF mapreduce实现
- 洛谷——P1713 麦当劳叔叔的难题
- Win7下配置php运行环境
热门文章
- IM开发干货分享:我是如何解决大量离线消息导致客户端卡顿的
- Please sign in with an app-specific password. You can create one at appleid.apple.com
- 微服务架构之限流熔断
- 宏基因组(鸟枪法测序)—微生物同源基因引物设计
- 使用Wake On Lan远程唤醒
- 如何解除word文档保护的方法
- 2021牛客寒假算法基础集训营4 F. 魏迟燕的自走棋
- 每日刷题记录 (二十七)
- 系统移植(系统移植环境搭建及简单概念)
- 嵌入式uboot移植之三星官方uboot开始移植