采用DSP-TI TMS320F2812,采用DSP的GPIO端口连接LED灯和开关,通过CPU定时器实现LED灯以2Hz频率闪烁,同时通过开关控制LED灯闪烁的启动和停止,绘出基本电路原理图,并给出基本C语言程序。
时间: 2024-06-10 07:04:30 浏览: 282
TMS320F2812原理及其C语言程序开发
好的,我会尽力理解并回答你的问题。以下是回答:
基本电路原理图如下所示:
![image](https://img-blog.csdn.net/20180530214427012?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
其中,P4.4通过接线连接到LED灯,P4.6通过接线连接到开关(SPDT)。
基本C语言程序如下:
```c
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//定义LED灯及开关的引脚
#define LED_PIN GPIO_Number_28
#define SW_PIN GPIO_Number_30
//定义闪烁频率(单位:ms)
#define BLINK_PERIOD 500
//定义CPU时钟频率(单位:MHz)
#define CPU_FREQ_MHZ 150
//定义CPU定时器的时钟分频因子
#define TIMER_CLK_PRESCALER1 1
//定义CPU定时器的计数值
#define TIMER_PERIOD ((BLINK_PERIOD * CPU_FREQ_MHZ) / (2 * TIMER_CLK_PRESCALER1))
//定义时钟周期计数寄存器
volatile Uint32 g_ulTimerTick = 0;
//定义开关状态变量
volatile Uint16 g_bSwitchStatus = false;
//定义定时器中断处理函数
interrupt void timer_isr(void)
{
//清除中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
//累加时钟周期计数寄存器
g_ulTimerTick++;
//如果开关被按下,改变LED灯状态
if(g_bSwitchStatus == true)
{
if(g_ulTimerTick >= TIMER_PERIOD)
{
g_ulTimerTick = 0;
if(GpioDataRegs.GPBDAT.all & (1 << LED_PIN))
{
GpioDataRegs.GPBDAT.all &= ~(1 << LED_PIN);
}
else
{
GpioDataRegs.GPBDAT.all |= (1 << LED_PIN);
}
}
}
else
{
GpioDataRegs.GPBDAT.all |= (1 << LED_PIN);
}
}
void main(void)
{
//初始化系统时钟
InitSysCtrl();
//初始化GPIO端口
InitGpio();
//使能GPIO端口
EALLOW;
GpioCtrlRegs.GPBMUX1.all &= ~((1 << (LED_PIN - 16) * 2) | (1 << (LED_PIN - 16) * 2 + 1));
GpioCtrlRegs.GPBQSEL2.all &= ~(1 << LED_PIN - 16);
GpioCtrlRegs.GPBDIR.all |= (1 << LED_PIN);
GpioDataRegs.GPBDAT.all &= ~(1 << LED_PIN); //初始化LED灯为低电平
GpioCtrlRegs.GPBMUX1.all &= ~((1 << (SW_PIN - 16) * 2) | (1 << (SW_PIN - 16) * 2 + 1));
GpioCtrlRegs.GPBQSEL2.all |= (1 << SW_PIN - 16);
GpioCtrlRegs.GPBDIR.all &= ~(1 << SW_PIN);
EDIS;
//配置CPU定时器1
CpuTimer1Regs.TCR.bit.TSS = 1; //暂停定时器
CpuTimer1Regs.TCR.bit.TRB = 1; //清空定时器
CpuTimer1Regs.TCR.bit.TIE = 1; //允许定时器中断
CpuTimer1Regs.TCR.bit.TIF = 1; //清除定时器中断标志位
CpuTimer1Regs.PRD.all = TIMER_PERIOD; //设置定时器初值
CpuTimer1Regs.TCR.bit.TSS = 0; //启动定时器
//配置PIE中断向量表
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
PieVectTable.TINT1 = &timer_isr; //设置CPU定时器1的中断处理函数
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //允许CPU定时器1中断
IER |= M_INT1; //使能CPU定时器1所在的中断向量表
//主循环
while(1)
{
//处理开关状态
if((GpioDataRegs.GPBDAT.all & (1 << SW_PIN)) == 0)
{
DELAY_US(10000); //消除按键抖动
if((GpioDataRegs.GPBDAT.all & (1 << SW_PIN)) == 0)
{
g_bSwitchStatus = !g_bSwitchStatus;
while((GpioDataRegs.GPBDAT.all & (1 << SW_PIN)) == 0);
}
}
}
}
```
注意,本程序使用的是DSP-TI TMS320F2812芯片,如果您采用的是其他型号的DSP,则需要进行相应的适配。
阅读全文