本帖最后由 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 ISR
timer0(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.
//===========================================================================