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


    1. F28335的时钟系统

    1.1 时钟来源

    image

    F28335的时钟源有两种:

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

    外部时钟源信号有两种:

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

    内部信号时钟源接法:

    image

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

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

    1.2 时钟单元相关寄存器

    未标题-1

    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

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

    image

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

    image

    3. 锁相环控制寄存器PLLCR

    image

    时钟初始化函数:

    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();
    }

    image

    image

    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。

    image

    2.2 采样

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

    image

    image

    2.3 GPIO相关寄存器

    A组为例:

    image

    外部中断:

    image

    3. 硬件介绍

    image

    image

    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

    image

    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 效果

  • 相关阅读:
    软件需求分析
    行高line-height 和vertical-align
    python中的集合基础知识
    python中字典常用的函数和用法
    python中字符串常用的函数
    day-75CRM
    day-74CRM
    day73CRM
    day-72Django源码解析
    day-71Django补充
  • 原文地址:https://www.cnblogs.com/dingdangsunny/p/12640800.html
Copyright © 2020-2023  润新知