使用TMS320F28377D开发板,写一个使用按键触发中断产生epwm的程序
时间: 2024-03-24 15:39:20 浏览: 64
好的,这里是一个使用TMS320F28377D开发板的按键中断产生EPWM的代码示例。假设你要使用GPIO0作为按键输入,EPWM1作为输出:
```C
// 引入 TMS320F28377D 头文件
#include "DSP2833x_Device.h"
// 定义中断服务函数
interrupt void epwm_isr(void);
// 定义 GPIO 按键输入引脚
#define GPIO_KEY GPIO_Number_0
void main(void)
{
// 初始化系统时钟和 GPIO
InitSysCtrl();
InitGpio();
// 配置 GPIO0 为输入
GPIO_SetupPinMux(GPIO_KEY, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(GPIO_KEY, GPIO_INPUT, GPIO_PUSHPULL);
// 配置 EPWM1
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位调制
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频为 1
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟分频为 1
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器等于 CMPA 时,设置 A 信号为高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 当计数器等于 CMPA 时,设置 A 信号为低电平
EPwm1Regs.CMPA.bit.CMPA = 0x7FFF; // 设置 CMPA 为最大值的一半
// 配置中断
EALLOW;
PieVectTable.EPWM1_INT = &epwm_isr; // 将中断服务函数指针赋给 EPWM1 中断向量
PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // 使能 EPWM1 中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // 确认中断
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 当计数器为 0 时产生中断
EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断
EDIS;
// 启动 EPWM1
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.SWFSYNC = 1; // 同步时间基准
// 无限循环等待中断
while(1);
}
interrupt void epwm_isr(void)
{
// 判断是否是按键触发中断
if(GPIO_ReadPin(GPIO_KEY) == 0)
{
// 产生一个 EPWM 脉冲
EPwm1Regs.TBCTR = 0; // 重置计数器
EPwm1Regs.TBCTL.bit.SWFSYNC = 1; // 同步时间基准
}
// 确认中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
```
这段代码的实现方式是:在初始化后,配置中断服务函数,使能 EPWM1 中断。在 EPWM1 中断服务函数中,判断是否是按键触发中断,如果是,则产生一个 EPWM 脉冲。最后,在主函数中启动 EPWM1 并进入一个无限循环等待中断。
阅读全文