编写程序led.c,利用DSPF28335电路板上LED灯(扩展地址0x6400H)和CPUTimer1定时器实现8个发光二极管循环点亮。由CPUTimer1定时器实现50ms延时时间,外部晶振频率为30MHZ。
时间: 2024-03-09 09:45:48 浏览: 121
dq_2.rar_DSP程序_ds18b20_dsp中dq
好的,根据你的要求,以下是led.c的代码:
```c
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#define LED_ADDR 0x6400
#define LED_NUM 8
Uint16 led_mask = 1; // 二进制掩码,用于点亮LED灯
interrupt void cpu_timer1_isr(void);
void main(void)
{
InitSysCtrl(); // 初始化系统控制
InitGpio(); // 初始化GPIO
InitCpuTimers(); // 初始化CPU定时器
InitPieCtrl(); // 初始化PIE控制
IER = M_INT1; // 使能CPU Timer1中断
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT; // 使能中断
CpuTimer1Regs.PRD.all = 1500000; // 定时器周期为50ms
CpuTimer1Regs.TCR.bit.TSS = 1; // 停止定时器
CpuTimer1Regs.TCR.bit.TRB = 1; // 复位定时器
CpuTimer1Regs.TCR.bit.TIE = 1; // 使能定时器中断
CpuTimer1Regs.TCR.bit.TSS = 0; // 启动定时器
while(1);
}
interrupt void cpu_timer1_isr(void)
{
// 每次中断使用掩码led_mask点亮一个LED灯
EALLOW;
*(Uint16*)(LED_ADDR) = led_mask;
EDIS;
// 更新掩码,点亮下一个LED灯
led_mask <<= 1;
if (led_mask > (1 << LED_NUM) - 1) led_mask = 1;
// 清除中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
```
解释如下:
1. 定义了LED的地址和数量,以及一个二进制掩码led_mask,用于点亮LED灯。
2. 定义了cpu_timer1_isr()函数,该函数会在定时器中断时被调用,用于点亮LED灯和更新掩码。
3. 在main()函数中,初始化系统控制、GPIO、CPU定时器和PIE控制,使能CPU Timer1中断,并启动定时器。
4. 在cpu_timer1_isr()函数中,每次中断使用掩码led_mask点亮一个LED灯,然后更新掩码,点亮下一个LED灯。
5. 最后在cpu_timer1_isr()函数中清除中断标志位。
注意:以上代码只是参考,需要根据具体硬件和软件环境进行适当修改和调试。
阅读全文