(一)DSP28335基礎教程——GPIO輸出(流水燈實驗)

0 前言

前些時間實在忙於實驗室寫論文和做實驗,許久沒有更新。近期經常有一些同學問到,有沒有永磁同步電機系列的實驗教程???

考慮到做電機控制基本都需要用到DSP編程,對DSP不瞭解的同學直接上手電機控制會很困難。於是,決定在此之前應該做個DSP28335系列基礎教程。

新系列DSP28335基礎教程分爲以下幾期來講:

(一)GPIO輸出(流水燈實驗)
(二)GPIO輸入(矩陣按鍵掃描)
(三)系統定時器CPUTimer(定時中斷)
(四)SCI串口通信實驗(上位機收發顯示)
(五)外部中斷控制(按鍵觸發)
(六)SPI通信實驗(LCD12864顯示控制)
(七)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口輸出寄存器的配置,這是非常重要又基礎的功能,在今後的基礎教程中都會用到。

大家可以參考代碼嘗試一下,看能否編出花樣流水燈哈~ 有疑問的歡迎留言!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章