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输出(流水灯实验)的主要内容,如果未能解决你的问题,请参考以下文章

DSP28335基础教程——GPIO输入(矩阵按键扫描)

DSPTMS320F28335的GPIO

dsp28335的epwm如何输出互补的脉冲

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)