DSP论坛
直播中

f28335

4年用户 4经验值
擅长:可编程逻辑
私信 关注

f28335定时器问题求帮忙

本帖最后由 f28335 于 2019-12-24 19:47 编辑

求问怎么在源程序上加上按键控制LED闪烁时间
下面是源程序
#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件
//28335有88个GPIO,分为A、B、C三组,一组是32个GPIO,A组0~31,B组32~63,C组是64~87。对每一位进行操作。
#define   LED1 GpioDataRegs.GPADAT.bit.GPIO0  //宏定义GPA组的GPIO0为LED1
#define   LED2 GpioDataRegs.GPADAT.bit.GPIO1  //宏定义GPA组的GPIO1为LED2
#define   LED3 GpioDataRegs.GPADAT.bit.GPIO2  //宏定义GPA组的GPIO2为LED3
#define   LED4 GpioDataRegs.GPADAT.bit.GPIO3  //宏定义GPA组的GPIO3为LED4
#define   LED5 GpioDataRegs.GPADAT.bit.GPIO4  //宏定义GPA组的GPIO4为LED5
interrupt void ISRtimer0(void);  //声明定时器TIME0中断
void configtestled(void);        //声明GPIO配置
void main(void)
{
// 步骤 1. 初始化系统控制:
// 设置PLL, WatchDog, 使能外设时钟
// 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到..
   InitSysCtrl();
   DINT;
// 初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
// 这个函数放在了DSP2833x_PieVect.c源文件里面.
   InitPieCtrl();
// 禁止CPU中断和清除所有CPU中断标志
   IER = 0x0000;
   IFR = 0x0000;
// PIE 向量表指针指向中断服务程(ISR)完成其初始化.
// 即使在程序里不需要使用中断功能,也要对 PIE 向量表进行初始化.
// 这样做是为了避免PIE引起的错误.
   InitPieVectTable();
//EALLOW,EDIS是成对使用的,有些寄存器是受到保护的,不能任意写,
//EALLOW相当于去掉保护,对写保护的寄存器进行操作后 EDIS 是重新把这个寄存器保护起来的意思。
   EALLOW;
   PieVectTable.TINT0 = &ISRTimer0;  //将定时器中断添加都中断向量表里
   EDIS;
   InitCpuTimers();   // 定时器初始化
//通过以下面程序就可以让定时器 0 每隔一段时间产生一次中断,这段时间的
//计算公式为: △T= Freq * Period /150000000(s);(其中 150000000 是
//CPU 的时钟频率,即 150MHz 的 时钟频率)针对此实验,Frep 为 150,Period 为 1000000,那么△T=1s。
   ConfigCpuTimer(&CpuTimer0, 150, 500000);
   StartCpuTimer0();  //开启定时器
    IER |= M_INT1;    //使能第一组中断
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能总中断
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组中断里的第七个中断--定时器中断

    EINT;   // 总中断 INTM 使能
    ERTM;   // 使能总实时中断
// 本例使用下面的GPIO配置
    configtestled();
LED1=1;        //初始化LED电平
DELAY_US(10);  //延时
LED2=1;        //初始化LED电平
DELAY_US(10);  //延时
LED3=1;        //初始化LED电平
DELAY_US(10);  //延时
LED4=1;        //初始化LED电平
DELAY_US(10);  //延时
LED5=1;        //初始化LED电平
DELAY_US(10);  //延时
    for(; ;);      //For循环
}

interrupt void ISRTimer0(void)
{
   // Acknowledge this interrupt to receive more interrupts from group 1
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
    CpuTimer0Regs.TCR.bit.TIF=1;  // 定时到了指定时间,标志位置位,清除标志
    CpuTimer0Regs.TCR.bit.TRB=1;  // 重载Timer0的定时数据
        LED1=~LED1; //取反
     LED2=~LED2; //取反
     LED3=~LED3; //取反
     LED4=~LED4; //取反
     LED5=~LED5; //取反
}
void configtestled(void)
{
   EALLOW;
   GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO复用为GPIO功能
   GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;  // GPIO设置为输出
   GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO复用为GPIO功能
   GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;  // GPIO设置为输出
   GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO复用为GPIO功能
   GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;  // GPIO设置为输出
   GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO复用为GPIO功能
   GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;  // GPIO设置为输出
   GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO复用为GPIO功能
   GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;  // GPIO设置为输出
   EDIS;
}
//===========================================================================
// No more.
//===========================================================================

已退回21积分

回帖(1)

李名扬

2019-12-24 18:22:23
帮顶一下,坐等大神解答
举报

更多回帖

发帖
×
20
完善资料,
赚取积分