DSP28335基础教程——GPIO输出(流水灯实验)
Posted Sk Electronics
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP28335基础教程——GPIO输出(流水灯实验)相关的知识,希望对你有一定的参考价值。
0 前言
前些时间实在忙于实验室写论文和做实验,许久没有更新。近期经常有一些同学问到,有没有永磁同步电机系列的实验教程???
考虑到做电机控制基本都需要用到DSP编程,对DSP不了解的同学直接上手电机控制会很困难。于是,决定在此之前应该做个DSP28335系列基础教程。
新系列DSP28335基础教程分为以下几期来讲:
(一)GPIO输出(流水灯实验)
(二)GPIO输入(矩阵按键扫描)
(三)系统定时器CPUTimer(定时中断)
(四)SCI串口通信实验(上位机收发显示)
(五)外部中断控制(按键触发)
(六)SPI通信实验(TFT显示控制)
(七)I2C通信实验(OLED显示控制)
(八)DMA与ADC转换(外部电压采集)
(九)EPWM实验(呼吸灯控制)
(十)ECAP实验(超声波测距)
(十一)EQEP实验(直流电机转速检测)
(十二)ECAN实验(上位机收发显示控制)
内容还是相当多,搞懂这些基本外设,之后在做电机控制与之前理论仿真算法结合一起,基本是无压力了。
为了做这些教程,自己已经设计了一款dsp28335核心板,在之后都会基于此核心板和相关外设,并结合底层硬件原理讲解DSP代码。(核心板先目睹为快,需要的可自行上“某宝”搜索)
目录
1. 硬件及控制原理
2. DSP代码介绍
3. 实验结果
4. 结论
1 硬件及控制原理
如图所示,在核心板中,LED是共阳极的,阴极分别接到GPIO0~GPIO4。当对应的IO口输出低电平时,LED亮灯,高电平时,LED灭灯。要使LED以流水灯的形式工作,则应依次控制IO口电平反转两次(两次反转之间加延迟)。
2 DSP代码介绍
看代码前,先看看工作流程图。由于28335寄存器太多了,大家可以参考数据手册的寄存器说明,代码部分也有注释(注意:查看代码时双击点进去看,否则会内容不全)。
/**
* ********************************************************************************************
* @file main.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED流水灯测试
* *******************************************************************************************
* @attention
* 实验平台:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘宝:https://shop409670932.taobao.com
*/
#include "DSP28x_Project.h"
#include "bsp_led.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
void delay_1ms(Uint16 t);
/**
* @brief 主函数
* @parameter 无
* @return_value 无
*/
void main(void)
/*第一步:初始化系统控制:*/
InitSysCtrl();
/*第二步:初始化GPIO口*/
InitGpio();
/* 第三步:清除所有中断 和初始化 PIE 向量表:*/
DINT;// 禁用CPU中断
InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除
IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:
IFR = 0x0000;
InitPieVectTable();// 初始化 PIE 中断向量表
// 中断重映射,注册中断程序入口(用户按需求添加)
//
/*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUN
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
#endif
/* 第四步: 初始化片上外设*/
// InitPeripherals(); //初始化所有外设(本例程不需要)
/* 第五步:添加用户功能具体代码*/
LED_GPIO_Config();//LED端口初始化
/*第六步:进入主循环*/
for(;;)
LED0(1);
delay_1ms(1000);
LED0(0);
LED1(1);
delay_1ms(1000);
LED1(0);
LED2(1);
delay_1ms(1000);
LED2(0);
LED3(1);
delay_1ms(1000);
LED3(0);
LED4(1);
delay_1ms(1000);
LED4(0);
/**
* @brief 1ms延迟函数
* @parameter t
* @return_value 无
*/
void delay_1ms(Uint16 t)
while(t--)
DELAY_US(1000);
/**
* ********************************************************************************************
* @file bsp.led.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED应用函数接口
* *******************************************************************************************
* @attention
* 实验平台:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘宝:https://shop409670932.taobao.com
*/
#include "bsp_led.h"
void LED_GPIO_Config(void)
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成输出
GpioDataRegs. GPASET.bit.GPIO0=1;
GpioDataRegs. GPASET.bit.GPIO1=1;
GpioDataRegs. GPASET.bit.GPIO2=1;
GpioDataRegs. GPASET.bit.GPIO3=1;
GpioDataRegs. GPASET.bit.GPIO4=1;
EDIS;
/**
* ********************************************************************************************
* @file bsp_led.h
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED应用函数接口头文件
* *******************************************************************************************
* @attention
* 实验平台:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘宝:https://shop409670932.taobao.com
*/
#ifndef _BSP_LED_H_
#define _BSP_LED_H_
#include "DSP28x_Project.h"
/* 宏带参,可以像内联函数一样使用,低电平亮灯*/
#define LED0(a) if (a) \\
GpioDataRegs. GPACLEAR.bit.GPIO0=1;\\
else \\
GpioDataRegs. GPASET.bit.GPIO0=1
#define LED1(a) if (a) \\
GpioDataRegs. GPACLEAR.bit.GPIO1=1;\\
else \\
GpioDataRegs. GPASET.bit.GPIO1=1
#define LED2(a) if (a) \\
GpioDataRegs. GPACLEAR.bit.GPIO2=1;\\
else \\
GpioDataRegs. GPASET.bit.GPIO2=1
#define LED3(a) if (a) \\
GpioDataRegs. GPACLEAR.bit.GPIO3=1;\\
else \\
GpioDataRegs. GPASET.bit.GPIO3=1
#define LED4(a) if (a) \\
GpioDataRegs. GPACLEAR.bit.GPIO4=1;\\
else \\
GpioDataRegs. GPASET.bit.GPIO4=1
/*定义IO口的宏*/
#define LED0_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO0=1
#define LED0_OFF GpioDataRegs. GPASET.bit.GPIO0=1
#define LED0_ON GpioDataRegs. GPACLEAR.bit.GPIO0=1
#define LED1_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO1=1
#define LED1_OFF GpioDataRegs. GPASET.bit.GPIO1=1
#define LED1_ON GpioDataRegs. GPACLEAR.bit.GPIO1=1
#define LED2_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO2=1
#define LED2_OFF GpioDataRegs. GPASET.bit.GPIO2=1
#define LED2_ON GpioDataRegs. GPACLEAR.bit.GPIO2=1
#define LED3_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO3=1
#define LED3_OFF GpioDataRegs. GPASET.bit.GPIO3=1
#define LED3_ON GpioDataRegs. GPACLEAR.bit.GPIO3=1
#define LED4_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO4=1
#define LED4_OFF GpioDataRegs. GPASET.bit.GPIO4=1
#define LED4_ON GpioDataRegs. GPACLEAR.bit.GPIO4=1
void LED_GPIO_Config(void);
#endif /*_BSP_LED_H_ */
3 实验结果
实验设备:核心板
使用XDS100V3仿真器接到JTAG接口,并在工程中配置选择好对应的仿真器。
点击烧录按键后,可以看到LED0~4流水灯现象。
4 结论
本期重点就是掌握GPIO口输出寄存器的配置,这是非常重要又基础的功能,在今后的基础教程中都会用到。
大家可以参考代码尝试一下,看能否编出花样流水灯哈~ 有疑问的欢迎留言!!
以上是关于DSP28335基础教程——GPIO输出(流水灯实验)的主要内容,如果未能解决你的问题,请参考以下文章