DSP 开发例程: led_flash

news2024/11/14 14:16:46

此例程实现在 EVM6678L 开发板控制 LED 闪烁. 使用了 SYS/BIOSMCSDK PDK TMS320CC6678 两个组件. 例程源码可从我的 gitee.com 仓库上克隆或下载.

目录

    • 创建工程
    • 源码编辑
      • main.c
      • platform_osal.c
      • app.cfg
    • 编译
    • 调试
      • 使用 板载仿真器
      • 使用 外部仿真器

创建工程

  • 点击菜单: File | New | CCS Project, 打开 New CCS Project 向导.

  • 输入工程名, 选择器件型号为: TMS320C6678, 模板选择: SYS/BIOS | Typical, 点击 Next.
    在这里插入图片描述

  • RTSC 配置设置 页, 勾选 MCSDK PDK TMS320C6678SYS/BIOS(默认已勾选), 点击 Finish.
    在这里插入图片描述

源码编辑

main.c

修改 main.c, 在其中加入函数 EVM_init() 用于平台初始化.

void EVM_init()
{
	platform_init_flags init_flags;
	platform_init_config init_config;

	// plaform initialize
	memset(&init_flags, 1, sizeof(platform_init_flags));
	init_flags.phy = 0;
	memset(&init_config, 0, sizeof(platform_init_config));
	if (platform_init(&init_flags, &init_config) != Platform_EOK)
	{
		printf("Platform failed to initialize, errno = 0x%x \n", platform_errno);
		while(1);
	}
}
  • 添加函数 task_ledFlash(), 实现 LED0 的闪烁.
Void task_ledFlash(UArg a0, UArg a1)
{
    System_printf("enter task_ledFlash()\n");

    while(1)
    {
    	platform_led(0, PLATFORM_LED_ON, PLATFORM_USER_LED_CLASS);
    	Task_sleep(500);
    	platform_led(0, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
    	Task_sleep(500);
    }
}

修改后的 main.c 内容如下:

/*
 *  ======== main.c ========
 */
#include <stdio.h>
#include <string.h>

#include <xdc/std.h>

#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>

#include <ti/sysbios/BIOS.h>

#include <ti/sysbios/knl/Task.h>

#include <ti/platform/platform.h>

/*
 *  ======== task_ledFlash ========
 */
Void task_ledFlash(UArg a0, UArg a1)
{
    System_printf("enter task_ledFlash()\n");

    while(1)
    {
    	platform_led(0, PLATFORM_LED_ON, PLATFORM_USER_LED_CLASS);
    	Task_sleep(500);
    	platform_led(0, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
    	Task_sleep(500);
    }
}

/**
 * 平台初始化
 */
void EVM_init()
{
	platform_init_flags init_flags;
	platform_init_config init_config;

	// plaform initialize
	memset(&init_flags, 1, sizeof(platform_init_flags));
	init_flags.phy = 0;
	memset(&init_config, 0, sizeof(platform_init_config));
	if (platform_init(&init_flags, &init_config) != Platform_EOK)
	{
		printf("Platform failed to initialize, errno = 0x%x \n", platform_errno);
		while(1);
	}
}

/*
 *  ======== main ========
 */
Int main()
{ 
    Task_Handle task;
    Error_Block eb;

    System_printf("enter main()\n");

    Error_init(&eb);
    task = Task_create(task_ledFlash, NULL, &eb);
    if (task == NULL) {
        System_printf("Task_create() failed!\n");
        BIOS_exit(0);
    }

    BIOS_start();    /* does not return */
    return(0);
}

platform_osal.c

新建 platform_osal.c, 在此文件中实现 Osal_platformMalloc(), Osal_platformFree(), Osal_platformSpiCsEnter()Osal_platformSpiCsExit() 这几个系统抽象层函数.

/*
 * platform_osal.c
 */

/* Platform utilities include */
#include "ti/platform/platform.h"

/* Resource manager for QMSS, PA, CPPI */
#include "ti/platform/resource_mgr.h"

/* OSAL functions for Platform Library */
uint8_t *Osal_platformMalloc (uint32_t num_bytes, uint32_t alignment)
{
	return (uint8_t *)malloc(num_bytes);
}

void Osal_platformFree (uint8_t *dataPtr, uint32_t num_bytes)
{
    /* Free up the memory */
    if (dataPtr)
    {
        free(dataPtr);
    }
}

void Osal_platformSpiCsEnter(void)
{
    /* Get the hardware semaphore.
     *
     * Acquire Multi core CPPI synchronization lock
     */
    while ((CSL_semAcquireDirect (PLATFORM_SPI_HW_SEM)) == 0);

    return;
}

void Osal_platformSpiCsExit (void)
{
    /* Release the hardware semaphore
     *
     * Release multi-core lock.
     */
    CSL_semReleaseSemaphore (PLATFORM_SPI_HW_SEM);

    return;
}

app.cfg

  • ti.platform.evmc6678l 添加到配置中.
    在这里插入图片描述
    或者直接在用 XDCscript Editor 打开 app.cfg 添加:
var Settings = xdc.useModule('ti.platform.evmc6678l.Settings');

在这里插入图片描述

  • 添加platform_lib

在这里插入图片描述
或者直接在用 XDCscript Editor 打开 app.cfg 添加:

Program.sectMap["platform_lib"] = new Program.SectionSpec();
Program.sectMap["platform_lib"].loadSegment = "L2SRAM";
  • 启用 Startup 模块, 将 EVM_init() 函数添加到 Startup.lastFxns 中.
var Startup = xdc.useModule('xdc.runtime.Startup');

Startup.lastFxns.$add('&EVM_init');

也可直接在 main() 函数中 调用 EVM_init(), 实现平台初始化.

编译

选中工程, 右键选择 Build Project, 等待编译完成.

在这里插入图片描述

调试

使用 板载仿真器

在工程上右键选择 Properties.

  • 选择 General 页, 连接 选择 XDS100v1 USB Emulator. 点击 OK.

在这里插入图片描述

  • 选中 工程, 右键选择 Debug As | Code Composer Debug Session.

在这里插入图片描述

  • 只勾选 C66xx_0, 点击 OK.
    在这里插入图片描述
  • 点击 resume 按钮, 运行程序. 此时应该能看到 板卡上的 LED(D0) 开始闪烁.

在这里插入图片描述

使用 外部仿真器

使用外部仿真器同使用板载仿真器的操作流程类似, 这里不再赘述.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1135515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机实验:数码管动态显示00-99

1、实验要求 利用STC89C52RC单片机开发板实现&#xff1a;使用2位数码管循环显示00-99&#xff0c;每次间隔1s&#xff0c;并且当计数到20时&#xff0c;则蜂鸣器鸣响1次。 2、实验分析 程序实现分析&#xff1a; 1、定义数码管位选引脚&#xff08;P2.4、P2.5、P2.6、…

C++ BinarySercahTree for version

搜索二叉树定义 搜索二叉树模拟实现 首先写一个模版&#xff0c;然后写一个搜索二叉树的类 BSTree&#xff0c;类里面给 BSTe进行重命名为&#xff1a;Node。 template<class K> class BSTree {tyepdef BSTree<K> Node; private:Node* root nullptr; };再写一个…

Qt中的枚举变量,Q_ENUM,Q_FLAG以及Qt中自定义结构体、枚举型做信号参数传递

Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他 理论基础&#xff1a;一、Q_ENUM二、QMetaEnum三、Q_FLAG四、示例 Chapter1 Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他前言Q_ENUM的使用Q_FLAG的引入解决什么问题&#xf…

怎么在Python爬虫中使用IP代理以避免反爬虫机制?

在进行网络爬虫的过程中&#xff0c;尤其是在大规模批量抓取数据时&#xff0c;需要应对各种反爬虫技术&#xff0c;其中最常用的就是IP封锁。为了避免IP被封锁&#xff0c;我们可以使用IP代理来隐藏自己的真实IP地址&#xff0c;从而让爬虫活动看起来更像正常的浏览器行为。 I…

Table-GPT:让大语言模型理解表格数据

llm对文本指令非常有用&#xff0c;但是如果我们尝试向模型提供某种文本格式的表格数据和该表格上的问题&#xff0c;LLM更有可能产生不准确的响应。 在这篇文章中&#xff0c;我们将介绍微软发表的一篇研究论文&#xff0c;“Table-GPT: Table- tuning GPT for Diverse Table…

虹科 | 解决方案 | 汽车示波器 远程诊断方案

车厂总部专家实时指导你修车 当一线汽修技师遇到疑难问题无从下手时&#xff0c;可以准备好pico汽车示波器套装&#xff0c;并戴上我们的M400智能AR眼镜&#xff0c;通过语音操作&#xff0c;呼叫主机厂的技术支持老师&#xff1b;老师通过AR眼镜上的摄像头老师可以实时看到现…

Python数据挖掘:入门、进阶与实用案例分析——基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 摘要01 案例背景02 分析目标03 分析过程04 数据准备05 属性构造06 模型训练07 性能度量08 推荐阅读赠书活动 摘要 本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电…

财务RPA机器人真的能提高效率吗?

财务部门作为一个公司的管理职能部门承担着一个公司在商业活动中各个方面的重要职责。理论上来说&#xff0c;一个公司的财务部门的实际工作包含但不限于对企业的盈亏情况进行评估、对风险进行预测、通过数据分析把握好公司的财务状况、税务管理等。 然而&#xff0c;实际上在…

分析主题帆软决策报表控件实现点击查询按钮后才能查询

点击「我的分析」即进入分析主题的管理界面&#xff0c;如下图所示&#xff1a; 2.1.1 分析列表区域 「分析列表」存放着当前用户创建的和其他用户协作给该用户的所有分析主题。 可以对分析列表和分析主题进行管理&#xff0c;详情参见&#xff1a;管理我的分析、管理分析主…

oa系统是什么?有哪些功能和作用?

本文将为大家讲解&#xff1a;1、oa系统是什么&#xff1f;有哪些功能和作用&#xff1f; 一、什么是OA系统 OA系统全称为Office Automation&#xff0c;即办公自动化系统。它是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、流程管…

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 实现思路是发起网络请求拿到pdf下载地址&#xff0c;然后wx.download…

Linux (KDE) 中使用Network Settings设置静态ip

在 Linux (KDE) 中使用 Network Settings 设置s5静态IP详细教程 。 首先&#xff0c;打开 KDE 的设置面板。可以通过点击桌面上的设置图标&#xff0c;或者在开始菜单中搜索 “Settings” 并打开。 在设置面板中&#xff0c;点击 “Network” 选项。 接下来&#xff0c;你会看…

AD20生产Gerber文件

1、打开所要导出文件的PCB文件。并选择制造输出Gerber文件。 2、选择单位和格式 3、设置需要输出的图层 点击确定后&#xff0c;就可以生成Gerber文件。如下图所示。 4、生成钻孔文件 5&#xff0c;选择PCB窗口&#xff0c;跟第一步一样&#xff1b; 6&#xff0c;点击菜单 文…

讲座记录|1024学科周讲座分享

前言&#xff1a;2023年10月24日&#xff0c;我参加了学院举办的学科周活动&#xff0c;本篇文章记录一下参加本次活动的收获。 本次活动中&#xff0c;我主要参加了黄萱菁教授和高跃教授的讲座以及几位老师的Panel环节&#xff0c;然后聆听了网络空间安全分论坛的报告。在本次…

MySQL进阶(再论事务)——什么是事务 事务的隔离级别 结合MySQL案例详细分析

前言 MySQL最为最流行的开源数据库&#xff0c;其重要性不言而喻&#xff0c;也是大多数程序员接触的第一款数据库&#xff0c;深入认识和理解MySQL也比较重要。 本篇博客阐述MySQL的事务的定义和特性&#xff0c;原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久…

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示&#xff1a;在设置代理之前&#xff0c;请确保您已经安装了 浏览器。 &#x1f527; 设置代理的详细步骤如下&#xff1a; 打开 浏览器&#xff0c;输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

突然发现柚子租车v1.42的小程序后端代码竟然内核文件全加密了!记录我的解密过程

因客户需求&#xff0c;需要定制租车小程序源码&#xff0c;找了很多要么很贵要么功能不满足需求&#xff0c;为啥这么折腾&#xff1f;还不是因为客户给的资金有限&#xff01; 翻来覆去找到了柚子租车这个小程序功能各方面都能满足需求&#xff0c;然后我就尝试找最新版&…

Find My眼镜|苹果Find My技术与眼镜结合,智能防丢,全球定位

近年来&#xff0c;得益于国家政策的大力支持和技术的不断进步&#xff0c;眼镜产品的发展取得了长足的进步&#xff0c;正朝着高质量、多元化方向迈进。在这个趋势下&#xff0c;眼镜的功能性、时尚性、舒适性等方面都有了明显的提升&#xff0c;同时为了满足不同年龄段消费者…

[黑马程序员SpringBoot2]——基础篇2

目录&#xff1a; 模块创建实体类快速开发(lombok)数据层标准开发&#xff08;基础CRUD)开启MP运行日志分页数据层标准开发(条件查询)业务层标准开发&#xff08;基础CRUD)业务层标准开发&#xff08;基于MyBatisPlus构建)表现层标准开发表现层数据一致性处理&#xff08;R对象…

阿里云企业邮箱基于Spring Boot快速实现发送邮件功能

邮件在项目中经常会被用到&#xff0c;比如用邮件发送通知。比如&#xff0c;通过邮件注册、认证、找回密码、系统报警通知、报表信息等。本篇文章带大家通过SpringBoot快速实现一个发送邮件的功能。 邮件协议 下面先简单了解一下常见的邮件协议。常用的电子邮件协议有SMTP、…