第一步:设定目标 "做一个5个红色发光二极管走马灯"
第二步:根据这个目标,选了一款DSP芯片 (这里 选了 德州仪器的 STM320F28335)
(1)不想画板子了, 发现淘宝上有一款STM320F28335开发板,看下图,够用,买回来直接用吧;
嘿嘿! 看红框里正好有5个红色发光二极管, 这五个管正好连接在DSP28335上通用输入输出口0-4五个管脚上,够了,够了。好了,按如下图把开发系统接上电源都连吧上。
查看仿真卡,我用的是一个便宜的仿真卡:XDS100-V3 长成下面这个样子
(2)STM320F28335 德州仪器的, 找一下软件,这个芯片的开发环境: 在这里下载
下载完毕后 安装,安装完后运行,运行后看到到下面界面:(图有点多,其实就是具体描述,该怎么 “干”)
给你一个 我 编写好的一个走马灯项目,这个项目包含走吗灯程序 ,一个压缩文件(点击这里下载), 解压到一个目录中;然后 用CCS开软件把这个程序导进来。
编译并下载这个程序
下载完成后,没有错误,运行它,
第三步: 行了,目标实现了,看结果(小视频):
走马灯视频
嘿嘿, 反正我做成功了,但, 估计你不一定成功, 后面我会把可能出现的问题给你介绍介绍。(填坑)
另外,后面慢慢介绍一些 DSP 软件开发的一些小知识。 爱看就看看,不爱看, 就自己去学。
哈哈哈哈哈 ::::))))
主程序代码如下:(Marquee.c)
//###########################################################################
//
// FILE: Marquee.c
//
// TITLE: 用DSP芯片上的4个GPIO口做个走马灯实验
//
//
// 根据在RAM中调试的需要,这个项目配置成"boot to SARAM".2833x引导模式
// 表如下显示. 常用的还有"boot to Flash"模式,当程序在RAM调试完善后就
// 可以将代码烧进Flash中并使用"boot to Flash"引导模式.
//
// $Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14 XA13 XA12
// PU PU PU PU
// ==========================================
// 1 1 1 1 Jump to Flash
// 1 1 1 0 SCI-A boot
// 1 1 0 1 SPI-A boot
// 1 1 0 0 I2C-A boot
// 1 0 1 1 eCAN-A boot
// 1 0 1 0 McBSP-A boot
// 1 0 0 1 Jump to XINTF x16
// 1 0 0 0 Jump to XINTF x32
// 0 1 1 1 Jump to OTP
// 0 1 1 0 Parallel GPIO I/O boot
// 0 1 0 1 Parallel XINTF boot
// 0 1 0 0 Jump to SARAM <- "boot to SARAM"
// 0 0 1 1 Branch to check boot mode
// 0 0 1 0 Boot to flash, bypass ADC cal
// 0 0 0 1 Boot to SARAM, bypass ADC cal
// 0 0 0 0 Boot to SCI-A, bypass ADC cal
// Boot_Table_End$
//
// 功能描述:
//
// 程序编译下载成功后,运行这个程序
// 板子上的4个LED红色发光二极管回按照你设计的逻辑进行“亮” “灭”
//
//###########################################################################
// 释放日期: 2024.2.16
//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
//28335有88个GPIO,分为A、B、C三组,一组是32个GPIO,A组0~31,B组32~63,C组是64~87。对每一位进行操作。
#define LED1 GpioDataRegs.GPADAT.bit.GPIO0 //宏定义GPA组的GPIO0为LED1
#define LED2 GpioDataRegs.GPADAT.bit.GPIO1 //宏定义GPA组的GPIO1为LED2
#define LED3 GpioDataRegs.GPADAT.bit.GPIO2 //宏定义GPA组的GPIO2为LED3
#define LED4 GpioDataRegs.GPADAT.bit.GPIO3 //宏定义GPA组的GPIO3为LED4
#define LED5 GpioDataRegs.GPADAT.bit.GPIO4 //宏定义GPA组的GPIO4为LED5
//###########################################################################
// 使用前,声明本文件中的相关函数;
void configtestled(void);
//###########################################################################
void configtestled(void) //GPIO初始化函数
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1复用为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // GPIO1设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2复用为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // GPIO2设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO3复用为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; // GPIO3设置为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO4复用为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1; // GPIO4设置为输出
EDIS;
}
//###########################################################################
void main(void) // 程序在这里开始与运行
{
// 步骤 1. 初始化系统控制:
// 设置PLL, WatchDog, 使能外设时钟
// 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到..
InitSysCtrl();
// 步骤 2. 初始化通用输入输出多路复用器GPIO:
// 这个函数在DSP2833x_Gpio.c源文件中被定义了
// 这个函数使GPIO控制类寄存器初始化到默认状态
// InitGpio(); // 本例不用此子函数
// 本例使用下面的GPIO配置
configtestled();
// 总线初始化函数
InitXintf16Gpio();
// 步骤 3. 清除所有中断初始化中断向量表:
// 禁止CPU全局中断
DINT;
// 初始化PIE控制寄存器到他们的默认状态.
// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
// 这个函数放在DSP2833x_PieCtrl.c源文件里
InitPieCtrl();
// 禁止CPU中断和清除所有CPU中断标志
IER = 0x0000;
IFR = 0x0000;
//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
// 这个函数放在了DSP2833x_PieVect.c源文件里面.
InitPieVectTable();
// 步骤 4. 初始化片内外设:
// 这个函数可以在DSP280x_CpuTimers.c源文件中找到
// InitCpuTimers(); // 这个例子仅初始化了Cpu定时器
// 步骤 5. 用户特定的代码
// LED灯初始化
LED1=0; //LED1初始化 灭
DELAY_US(10); //延时
LED2=0; //LED2初始化 灭
DELAY_US(10); //延时
LED3=0; //LED3初始化 灭
DELAY_US(10); //延时
LED4=0; //LED4初始化 灭
DELAY_US(10); //延时
LED5=0; //LED5初始化 灭
DELAY_US(10); //延时
//在while循环内,每个LED的状态不停的再取反循环,这样就好有一个流水灯的现象出现。
while(1)
{
LED1=~LED1; //LED灯状态取反 亮 灭 交替
DELAY_US(100000); //延时
LED2=~LED2; //LED灯状态取反 亮 灭 交替
DELAY_US(100000); //延时
LED3=~LED3; //LED灯状态取反 亮 灭 交替
DELAY_US(100000); //延时
LED4=~LED4; //LED灯状态取反 亮 灭 交替
DELAY_US(100000); //延时
LED5=~LED5; //LED灯状态取反 亮 灭 交替
DELAY_US(100000); //延时
}
}
//===========================================================================
// No more.
//===========================================================================