2367|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

创龙TMS320C6748开发板———定时器/计数器学习 [复制链接]

      本次实验主要是利用开发板进行有关定时/计数器的实验,通过定时器进行精确定时实现流水灯功能
TMS320C6748拥有四个64位的通用定时/计数器,其中每个定时器又可配置为两个32位的定时器:1)两个32位独立定时器,2)两个32位独立定时器但定时器34带有4位的预定标,3)两个32位关联定时器
TMS320C6748定时器的结构框图如下图所示:
 


时钟源:时钟信号可分为分为内部时钟和外部时钟输入,定时器0和定时器1的时钟为PLL0_AUXCK(旁路时钟,24Mhz),定时器2/3默认状态下使用的时钟为PLL0_SYSCLK2(为系统频率的二分之一,228Mhz),可通过定时器配置将其时钟设置为PLL1_SYSCLK2(可以避免因CPU主频变化对设备产生的不利影响)
定时器模式:1)64位通用定时器模式,2)双32位非链式通用定时器模式,3)双32位链式定时器模式,4)看门狗定时器模式。
只有定时器1(Timer64P1)可配置为看门狗定时器,当程序异常时产生中断使系统复位到初始确定状态
工作模式:单次运行、连续运行、连续运行加周期重载
在本次实验中,配置定时器2工作在通用定时器模式,使用内部时钟源即其时钟频率为228Mhz
硬件电路:运用四个板载LED灯(D7/D6/D9/10)实现延时1s的流水灯功能
软件设计:定时器中断初始化过程:注册中断服务函数--映射中断到DSP可屏蔽中断--使能DSP可屏蔽中断--使能定时器中断
根据T=N/f,其中N为设定的计数器重载值,f为定时器时钟源频率(228Mhz),T为定时器产生事件输出所需要的时间。设定N为228000000即可实现定时器定时1秒的功能。
中断服务程序的处理过程与GPIO中断处理过程类似,不同之处在于GPIO是以Bank为单位产生事件的,故需要在中断服务程序中判断是Bank中哪一个引脚变化引起的中断,而定时器中断不需要此步骤。
程序设计代码如下所示:(此次程序设计参考了创龙提供的官方源代码TIMER)
#include "TL6748.h"
#include "hw_types.h"
#include "hw_syscfg0_C6748.h"
#include "soc_C6748.h"
#include "psc.h"
#include "gpio.h"
#include "timer.h"
#include "interrupt.h"

#define SW_BREAKPOINT     asm(" SWBP 0 ");
#define TMR_PERIOD_LSB32  (0x0D970100)
#define TMR_PERIOD_MSB32  (0)
unsigned char Flag = 0;

void PSCInit(void);
void GPIOBankPinMuxSet();
void GPIOBankPinInit();
void TimerInit(void);
void TimerInterruptInit(void);
void InterruptInit(void);
void TimerIsr(void);

int main(void)
{
        PSCInit();
        GPIOBankPinMuxSet();
        GPIOBankPinInit();
        TimerInit();
        InterruptInit();
        TimerInterruptInit();
        for(;;)
        {
                //根据Flag的值控制 LED 的亮/灭
                switch (Flag)
                {
                case 1:         GPIOBankPinsWrite(SOC_GPIO_0_REGS,0,GPIO_BANK_PIN_0,GPIO_BANK_PIN_2);break;
                case 2:         GPIOBankPinsWrite(SOC_GPIO_0_REGS,0,GPIO_BANK_PIN_5,GPIO_BANK_PIN_0);break;
                case 3:         GPIOBankPinsWrite(SOC_GPIO_0_REGS,0,GPIO_BANK_PIN_1,GPIO_BANK_PIN_5);break;
                case 4:         GPIOBankPinsWrite(SOC_GPIO_0_REGS,0,GPIO_BANK_PIN_2,GPIO_BANK_PIN_1);Flag = 0;break;
                }
        }
}

void PSCInit(void)
{
        // 使能 GPIO 模块
        // 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}

void GPIOBankPinMuxSet(void)
{
        // 配置相应的 GPIO 口功能为普通输入输出口
        //底板LED
        GPIOBank0Pin5PinMuxSetup();        //D6
        GPIOBank0Pin0PinMuxSetup();        //D7
        GPIOBank0Pin1PinMuxSetup();        //D9
        GPIOBank0Pin2PinMuxSetup();        //D10
}

void GPIOBankPinInit(void)
{
        // 配置 LED 对应管脚为输出管脚

    //底板LED
    GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_OUTPUT);  // GPIO0[5]        D6
    GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT);  // GPIO0[0]        D7
    GPIODirModeSet(SOC_GPIO_0_REGS, 2, GPIO_DIR_OUTPUT);  // GPIO0[1]        D9
    GPIODirModeSet(SOC_GPIO_0_REGS, 3, GPIO_DIR_OUTPUT);  // GPIO0[2]        D10

    //初始化 LED处于熄灭状态
    GPIOPinWrite(SOC_GPIO_0_REGS,6,GPIO_PIN_LOW);                //D6
    GPIOPinWrite(SOC_GPIO_0_REGS,1,GPIO_PIN_LOW);                //D7
    GPIOPinWrite(SOC_GPIO_0_REGS,2,GPIO_PIN_LOW);                //D9
    GPIOPinWrite(SOC_GPIO_0_REGS,3,GPIO_PIN_LOW);                //D10

}

void TimerInit(void)
{
    // 配置 定时器 / 计数器 2 为 64 位模式(内部时钟源)
    TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);

    // 设置周期
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);

    // 使能 定时器 / 计数器 2
    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
}

void TimerInterruptInit(void)
{
        // 注册中断服务函数
        IntRegister(C674X_MASK_INT4, TimerIsr);

        // 映射中断到 DSP 可屏蔽中断
        IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);

        // 使能 DSP 可屏蔽中断
        IntEnable(C674X_MASK_INT4);

        // 使能 定时器 / 计数器 中断
        TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}

void InterruptInit(void)
{
        // 初始化 DSP 中断控制器
        IntDSPINTCInit();

        // 使能 DSP 全局中断
        IntGlobalEnable();
}

void TimerIsr(void)
{
    // 禁用定时器 / 计数器中断
    TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    // 清除中断标志
    IntEventClear(SYS_INT_T64P2_TINTALL);
    TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    Flag++;        //达到定时时间后使变量Flag的值增1

    // 使能 定时器 / 计数器 中断
    TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}
复制代码
烧录程序程序实现流水灯功能
小结:本次实验主要是对创龙公司提供的TMS320C6748开发板的定时/计数器进行了学习,并通过定时器定时实现流水灯的精确延时,官方提供的代码中也有一个流水灯实验,只是源程序运用的是让程序执行空语句来达到延时的目的,并未用定时器功能。此款DSP的定时器拥有八个比较寄存器,支持上升沿、下降沿、双边沿捕获脉冲的功能

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表