凌乱的DSP笔记(2)-LED流水灯

1. F28335的时钟系统

1.1 时钟来源

凌乱的DSP笔记(2)-LED流水灯_第1张图片

F28335的时钟源有两种:

  1. 采用外部振荡器作为时钟源(简称外部时钟),在XCLKIN引脚提供一个一定频率的时钟信号,或通过复用的X1引脚接入,即由其他数字系统或外部振荡器引入;
  2. 采用F28335内部振荡器作为时钟源(简称内部时钟),在X1与X2之间接入一个晶体,就可以产生时钟源。

外部时钟源信号有两种:

  1. 3.3V外部时钟源信号直接接入XCLKIN引脚,X1引脚接地,X2引脚悬空;
  2. 1.9V外部时钟源信号直接接入X1引脚,XCLKIN引脚接地,x2引脚悬空。

内部信号时钟源接法:

凌乱的DSP笔记(2)-LED流水灯_第2张图片

典型做法是在X1和X2之间接入30MHz晶振,内部锁相环10倍频,然后二分频。

锁相环模块除了为C28X内核提供时钟外,还通过系统时钟输出提供快速和慢速2中外设时钟,从而提高处理器的灵活性和可靠性。在具体应用中,将不使用的外设时钟禁止,还可以降低系统功耗。

1.2 时钟单元相关寄存器

凌乱的DSP笔记(2)-LED流水灯_第3张图片

1. 锁相环状态寄存器PLLSTS

  • 15~9位:保留;
  • 8~7位:DIVSEL,时钟分频选择;
    • 00 01——4分频
    • 10——2分频
    • 11——1分频
  • 6位:MCLKOFF,丢失时钟检测关闭位;
    • 0——默认设置,主振荡器时钟丢失检测使能
    • 1——主振荡器时钟丢失检测禁止
  • 5位:OSCOFF,控制振荡器时钟信号,该位为1,振荡器信号允许通过,兵分两路,一路直接过去,一路进入锁相环模块;
  • 4位:MCLKCLR,丢失时钟清除位,若该位写0,无效,写1强制丢失时钟信号检测电路清除和复位;
  • 3位:MCLKSTS, 丢失时钟信号状态位,0为正常模式,表示时钟信号没有丢失,1表示时钟信号丢失,CPU工作在无序频率模式;
  • 2位:PLLOFF,锁相器关闭位;
  • 1位:保留;
  • 0位:PLLOCKS:锁相器锁状态位。

2. 高/低速外设时钟预分频寄存器HISPCP/LOSPCP

高速外设时钟预分频寄存器位分配:

凌乱的DSP笔记(2)-LED流水灯_第4张图片

低速外设时钟预分频寄存器位分配:

凌乱的DSP笔记(2)-LED流水灯_第5张图片

3. 锁相环控制寄存器PLLCR

凌乱的DSP笔记(2)-LED流水灯_第6张图片

时钟初始化函数:

void InitSysCtrl(void)
{

   // Disable the watchdog
   DisableDog();

   // Initialize the PLL control: PLLCR and DIVSEL
   // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
   InitPll(DSP28_PLLCR,DSP28_DIVSEL);

   // Initialize the peripheral clocks
   InitPeripheralClocks();
}

凌乱的DSP笔记(2)-LED流水灯_第7张图片

凌乱的DSP笔记(2)-LED流水灯_第8张图片

2. GPIO介绍

2.1 GPIO分组

GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。

TMS320F28335共有176引脚,其中88个是GPIO管脚。

A组:GPIO 0~31,B组:GPIO 32~63,C组:GPIO 64~87。

凌乱的DSP笔记(2)-LED流水灯_第9张图片

2.2 采样

采样滤波电路——滤除干扰信号:

凌乱的DSP笔记(2)-LED流水灯_第10张图片

凌乱的DSP笔记(2)-LED流水灯_第11张图片

2.3 GPIO相关寄存器

A组为例:

凌乱的DSP笔记(2)-LED流水灯_第12张图片

外部中断:

凌乱的DSP笔记(2)-LED流水灯_第13张图片

3. 硬件介绍

凌乱的DSP笔记(2)-LED流水灯_第14张图片

凌乱的DSP笔记(2)-LED流水灯_第15张图片

image

4. 软件设计

(1)初始化LED控制IO口(使能对应IO外设时钟、配置IO为普通IO功能和输出模式、上拉设置等)

(2)LED控制程序

4.1 leds.c

/*
 * leds.c
 *
 *  Created on: 2020年4月6日
 *      Author: lenovo
 */

#include "leds.h"

/*******************************************************************************
* 函 数 名         : LED_Init
* 函数功能           : LED初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void LED_Init(void)
{
    EALLOW;//关闭写保护
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟

    //LED1端口配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
    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;

    //初始输出高电平(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;//开启写保护
}

GPCMUX1控制GPIO64~79

凌乱的DSP笔记(2)-LED流水灯_第16张图片

4.2 leds.h

/*
 * leds.h
 *
 *  Created on: 2020年4月6日
 *      Author: lenovo
 */

#ifndef LEDS_H_
#define LEDS_H_

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

#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);

#endif /* LEDS_H_ */

利用宏定义便于电平切换。

4.3 main.c

/*
 * main.c
 *
 *  Created on: 2020年4月6日
 *      Author: lenovo
 */


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

/*******************************************************************************
* 函 数 名         : delay
* 函数功能           : 延时函数,通过循环占用CPU,达到延时功能
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void delay(void)
{
    Uint16         i;
    Uint32      j;
    for(i=0;i<32;i++)
        for (j = 0; j < 50000; j++);
}

/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
    InitSysCtrl();

    LED_Init();

    while(1)
    {
        LED5_OFF;LED1_ON;delay();
        LED1_OFF;LED2_ON;delay();
        LED2_OFF;LED3_ON;delay();
        LED3_OFF;LED4_ON;delay();
        LED4_OFF;LED5_ON;delay();
    }

}

4.4 效果

 

你可能感兴趣的:(凌乱的DSP笔记(2)-LED流水灯)