DSP实验之LED流水灯工程的建立与实现

新手小白~随笔记,如有错误欢迎指正,请海涵勿喷,谢谢!

  •  参考视频链接:

        1.8.1--TMS320F28335管脚分类_哔哩哔哩_bilibili

        2.8.2--GPIO结构框图介绍_哔哩哔哩_bilibili

        3.8.3--点亮第一个LED实验--硬件介绍_哔哩哔哩_bilibili

        4.8.4--点亮第一个LED实验--软件设计_哔哩哔哩_bilibili  

  • 参考笔记链接:

        1.详细介绍GPIO、I2C、SPI通讯原理以及物理层原理_i2c gpio-CSDN博客

        2.DSP学习笔记(三)——TMS320F28335硬件结构-CSDN博客


一、GPIO的简单介绍

1、定义

GPIO(general purpose intput output)是通用输入输出端口的简称,由引脚,功能寄存器组成。不同的架构中的GPIO封装不同,所使用的引脚数与寄存器数不同,实际以参考芯片手册为准。

2、作用

GPIO的作用是连接开发板与外设进行交互控制,功能扩展

当开发板需要与外设接进行功能扩展时,就可以通过GPIO与外设进行交互控制,驱动层会通过读写GPIO口中的功能寄存器来改变连接在此GPIO上的外设状态(即GPIO是通过软件来控制其输入和输出)。一般地,通过观察原理图就可找到开发板上的GPIO口具体从哪个口或者排针引出来的。

3、TMS320F28335芯片的GPIO

GPIO多路开关寄存器用于通用的GPIO复用引脚的选择,通过寄存器可以把这些引脚设置成数字I/O外设I/O工作模式。F28335芯片上共有88个GPIO引脚,且分为3组32位I/O端口,分别是端口A:对应GPIO0~GPIO31,端口B:对应GPIO32~GPIO63,端口C:对应GPIO64~GPIO87

其基本工作模式如下图:

数据采样过程补充:

GPIO的3组寄存器A\B\C的功能实现和操作步骤大致相同,只是每组寄存器的功耗不同。

部分GPIO相关寄存器如下:

二、TMS320F28335的简单介绍

1、结构组成

TMS320F28335由32位的CPU内核、集成内存、总线、DMA、DMA总线、中断管理、控制率加速器、外设总线等结构组成。F28335属于C28x+FPU(Floating Point Unit,浮点运算单元)的C28x 系列增强型DSP 控制器(Digital Signal Controllers,DSC),具有一个单精度32位IEEE 754浮点运算单元。

2、总线结构

TMS320F28335的存储器总线包括程序读总线数据读总线数据写总线,其中程序读总线:22根地址线与32根数据线,数据读/写总线:32根地址线与32根数据线。

  • (地址线用来寻址,即在计算机中找一个数据时,先访问其地址。数据线用来传输数据)

总线采用的是哈佛结构,cpu可在一个时钟周期完成对数据存储器与程序存储器的访问。DMA总线,可以使特定模块直接与内存交换数据,不需要通过cpu。一般地,内存总线访问的优先级可概括如下:

最高级:  数据写入 (内存总线上不能同时进行数据和程序写入。)

                程序写入 (内存总线上不能同时进行数据和程序写入。)

                数据读取

                程序读取 (内存总线上不能同时进行程序读取和取指令。)

最低级:  取指令 (内存总线上不能同时进行程序读取和取指令。)

3、引脚图

TMS320F28335共有176个引脚,引脚主要分为电源引脚 、晶振引脚(常采用内部30M晶振) 、复位引脚(低电平复位) 、下载引脚 、BOOT引脚 、GPIO 引脚六大类。

4、硬件特性

TMS320F28335的硬件特性如下:

三、LED点亮实验——硬件设计的简要介绍

笔者使用的是普中科技的PZ-DSP28335-L开发板,LED模块的部分原理图如下所示,该模块使用的是共阳极接法,RP1和RP2为限流电阻。  利用发光二极管的单向导电性,通过给芯片XD11\XD12\XD13\XD14\XD15写入高低电平,来控制LED的亮灭(0亮1灭)。

功能实现:

间隔一定时间依次点亮和熄灭点D1—D7 发光二极管,即让 F28335 的GPIO10、GPIO11、GPIO64~GPIO68 管脚输出低电平。

对应与芯片相连管脚如下:

四、LED点亮实验——硬件设计的简要介绍

LEDs.h条件调用语句,

程序框架如下:

1)初始化LED控制IO口(使能对应IO外设时钟、配置IO为普通IO功能和输出模式、上拉设置等),对系统的一些控制寄存器操作时,常要用“EALLOW” 和“EDIS”分别进行关闭/开启写保护。2)LED控制程序

笔者通过控制GPIO68号管脚(属于端口C的范围内)为例,

1、在LED驱动程序(笔者放在APP文件夹中),编写LED初始化子程序

开启GPIO时钟,GPIOINENCLK = 1                                                                                                配置GPIO为通用输入输出口,即GPXMUX1=1,如果是GPIO79以后的管脚由GPCMUX2控制;
配置GPIO为输出模式,即GPXDIR=1;
设置上拉,即:GPXPUD=0,保证GPIO管脚不输出时,LED引脚端上拉为高电平使LED保持“灯灭”状态,
控制GPIO管脚输出低电平,即GPXCLEAR=1,默认初始状态要确定,且LED为熄灭状态。

#include "LEDs.h"

void LED_Init(void)
{
	EALLOW;//关闭写保护
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟

	//LED1端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能,如果是GPIO79以后的管脚由GPCMUX2控制
	GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
	GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
	
	//LED2端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO67=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO67=0;

	//LED3端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO66=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO66=0;

	//LED4端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO65=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO65=0;

	//LED5端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO64=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO64=0;

	//LED6端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;
	GpioCtrlRegs.GPADIR.bit.GPIO10=1;
	GpioCtrlRegs.GPAPUD.bit.GPIO10=0;

	//LED7端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;
	GpioCtrlRegs.GPADIR.bit.GPIO11=1;
	GpioCtrlRegs.GPAPUD.bit.GPIO11=0;


//初始时希望GPIO口输出高电平,使LED灯熄灭
	GpioDataRegs.GPCSET.bit.GPIO68=1;
	GpioDataRegs.GPCSET.bit.GPIO67=1;
	GpioDataRegs.GPCSET.bit.GPIO66=1;
	GpioDataRegs.GPCSET.bit.GPIO65=1;
	GpioDataRegs.GPCSET.bit.GPIO64=1;
	GpioDataRegs.GPASET.bit.GPIO10=1;
	GpioDataRegs.GPASET.bit.GPIO11=1;

	EDIS;//开启写保护
}


2、编写头文件

一般地,需要在头文件中对初始化函数进行申明。

#ifndef LEDS_H_
#define LEDS_H_

#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件



/*定义IO口的宏*/
#define LED1_OFF		(GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)

#define LED2_OFF		(GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)

#define LED3_OFF		(GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)

#define LED4_OFF		(GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)

#define LED5_OFF		(GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5_ON			(GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5_TOGGLE		(GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)

#define LED6_OFF		(GpioDataRegs.GPASET.bit.GPIO10=1)
#define LED6_ON			(GpioDataRegs.GPACLEAR.bit.GPIO10=1)
#define LED6_TOGGLE		(GpioDataRegs.GPATOGGLE.bit.GPIO10=1)

#define LED7_OFF		(GpioDataRegs.GPASET.bit.GPIO11=1)
#define LED7_ON			(GpioDataRegs.GPACLEAR.bit.GPIO11=1)
#define LED7_TOGGLE		(GpioDataRegs.GPATOGGLE.bit.GPIO11=1)


void LED_Init(void);   //LED初始化函数申明,利于后续在其他地方使用,如主函数中调用


#endif /* LED_H_ */


3、编写主函数


#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "LEDs.h"

/*延时函数*/
void delay(void)
{
    Uint16 		i;
	Uint32      j;
	for(i=0;i<32;i++)
		for (j = 0; j < 100000; j++);
}

/*主函数*/
void main()
{
	InitSysCtrl();		//初始化系统控制

	LED_Init();        //LED初始化函数的调用


/*进入主循环*/
	while(1)
		{
			LED1_TOGGLE;
			delay();
			LED2_TOGGLE;
			delay();
			LED3_TOGGLE;
			delay();
			LED4_TOGGLE;
			delay();
			LED5_TOGGLE;
			delay();
			LED6_TOGGLE;
			delay();
			LED7_TOGGLE;
			delay();
		}
}

五、实验效果

实验效果:

LED流水灯效果-CSDN直播

六、错误集

错误提示一:没有打开某文件的源文件

解决办法:将对应文件的路径添加至工程后,重新编译即可。步骤如下:

1)选择相应工程“右击”——>选项框“点击属性”;

2)属性对话框中添加路径;

3)可在工程中的“Includes”中看到所条件加的路径是否成功。

错误提示二:项目描述无效——Invalid project description

解决办法:在这个文件夹里面把原来的同名工程删掉,替换进新的工程,再重新导入工程,而这一步的关键点就在于更改workspace。

重新设置workspace步骤如下:

file→Switch Workplace→Other

启动时,自动弹出更换workspace Launcher后,更改工作空间路径即可。

启动时,没有自动弹出更换workspace,即设置了启动不弹出。 开启方法如下:

1、Window----Preferences

2、General---Startup and Shutdown----Workspace 在右边【Prompt for workspace on startup】打勾即可解决

错误提示三:无法连接目标板

在Verify时报错如下:

[Start]

Execute the command:

%ccs_base%/common/uscif/dbgjtag -f %boarddatafile% -rv -o -F inform,logfile=yes -S pathlength -S integrity

[Result]
-----[Print the board config pathname(s)]------------------------------------

C:\Users\ADMINI~1\AppData\Local\TEXASI~1\
    CCS\ti\0\0\BrdDat\testBoard.dat

-----[Print the reset-command software log-file]-----------------------------

This utility has selected a 100- or 510-class product.
This utility will load the adapter 'jioserdesusbv3.dll'.
The library build date was 'Nov  6 2017'.
The library build time was '10:36:36'.
The library package version is '7.0.100.0'.
The library component version is '35.35.0.0'.
The controller does not use a programmable FPGA.
The controller has a version number of '4' (0x00000004).
The controller has an insertion length of '0' (0x00000000).
This utility will attempt to reset the controller.
This utility has successfully reset the controller.

-----[Print the reset-command hardware log-file]-----------------------------

The scan-path will be reset by toggling the JTAG TRST signal.
The controller is the FTDI FT2232 with USB interface.
The link from controller to target is direct (without cable).
The software is configured for FTDI FT2232 features.
The controller cannot monitor the value on the EMU[0] pin.
The controller cannot monitor the value on the EMU[1] pin.
The controller cannot control the timing on output pins.
The controller cannot control the timing on input pins.
The scan-path link-delay has been set to exactly '0' (0x0000).

An error occurred while hard opening the controller.

-----[An error has occurred and this utility has aborted]--------------------

This error is generated by TI's USCIF driver or utilities.

The value is '-275' (0xfffffeed).
The title is 'SC_ERR_SCAN_POLL_BUSY'.

The explanation is:
The attempt to poll a target device exceeded its timeout limit.
The utility or debugger has requested that a target device be
repeatedly accessed for a specific data or status value.
This has failed because the built-in limit for the maximum number
of attempts when polling the JTAG scan-path has been exceeded.

[End]
 

解决方法:重新供电连接后恢复正常电压,能够正常调试。——由于电池供电的CC1310电压低(小于1.5V)造成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值