DSP28335三角波代码
时间: 2023-11-12 13:00:14 浏览: 273
以下是一个简单的DSP28335三角波生成代码,使用PWM模块和定时器模块:
```c
#include "DSP2833x_Device.h"
#define PWM_PERIOD 1500 // PWM周期
#define PWM_DUTY_CYCLE 750 // PWM占空比,即50%的占空比
Uint16 pwm_count = 0; // PWM计数器
void main(void)
{
InitSysCtrl(); // 初始化系统时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 关闭定时器时钟同步
EDIS;
InitPieCtrl(); // 初始化PIE中断控制器
IER = 0x0000; // 禁用所有中断
IFR = 0x0000; // 清除所有中断标志
InitPieVectTable(); // 初始化PIE中断向量表
EALLOW;
PieVectTable.TIMER0_INT = &timer0_isr; // 定时器0中断服务程序
EDIS;
InitCpuTimers(); // 初始化CPU定时器模块
ConfigCpuTimer(&CpuTimer0, 150, 1000000); // 配置定时器0为1ms
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 启动定时器时钟同步
EDIS;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // 配置GPIO0为PWM输出
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 配置GPIO0为输出
EDIS;
CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器0
CpuTimer0Regs.TCR.bit.TRB = 1; // 重置定时器0计数器
EALLOW;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 开启定时器0中断
EDIS;
EINT; // 全局中断使能
while(1)
{
// 等待中断
}
}
interrupt void timer0_isr(void)
{
pwm_count++; // PWM计数器自增
if(pwm_count >= PWM_PERIOD)
{
pwm_count = 0; // 重置PWM计数器
}
if(pwm_count < PWM_DUTY_CYCLE)
{
GpioDataRegs.GPASET.bit.GPIO0 = 1; // GPIO0输出高电平
}
else
{
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // GPIO0输出低电平
}
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; // 清除定时器0中断标志
}
```
该代码使用定时器0中断来更新PWM输出的占空比,从而实现三角波的生成。具体来说,每当定时器0中断发生时,PWM计数器自增,并根据计数器的值更新PWM输出的占空比和电平状态。当PWM计数器小于占空比时,GPIO0输出高电平;否则,GPIO0输出低电平。通过不断重复该过程,就可以生成一个三角波。
阅读全文