TMS320F28379D 单片机的库函数外部中断延时函数实现按键消抖
时间: 2024-03-20 10:42:45 浏览: 193
好的,以下是基于 TMS320F28379D 单片机的库函数外部中断延时函数实现按键消抖的程序:
```c
#include "F2837xD_Device.h"
#include "F2837xD_Examples.h"
#define DEBOUNCE_TIME 1000 // 消抖时间,单位:us
void DelayUs(Uint32 us)
{
CpuTimer0Regs.PRD.all = us * 200;
CpuTimer0Regs.TCR.bit.TRB = 1;
CpuTimer0Regs.TCR.bit.TSS = 0;
while(CpuTimer0Regs.TCR.bit.TIF == 0);
CpuTimer0Regs.TCR.bit.TIF = 1;
}
void main(void)
{
InitSysCtrl(); // 初始化系统时钟
InitGpio(); // 初始化 GPIO
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; // 使能 GPIO32 引脚上的上拉电阻
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0; // 将 GPIO32 引脚设置为输入模式
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 32; // 将 GPIO32 引脚与 XINT1 中断线连接
XBARARegs.XINT1MUX1TO16CFG.bit.MUX13 = 0; // 将 XINT1 中断线设置为 GPIO32 引脚
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 使能 PIE 模块
PieVectTable.XINT1_INT = &Xint1_ISR; // 将 XINT1_ISR 函数作为 XINT1 中断的服务函数
IER |= M_INT1; // 使能 INT1 中断
EINT; // 使能全局中断
EDIS;
InitCpuTimers(); // 初始化 CPU 定时器
ConfigCpuTimer(&CpuTimer0, 200, 1000000); // 配置 CPU 定时器为 1us 计时
CpuTimer0Regs.TCR.bit.TIE = 0; // 禁用 CPU 定时器中断
CpuTimer0Regs.TCR.bit.TSS = 1; // 停止 CPU 定时器
while(1) {}
}
__interrupt void Xint1_ISR(void)
{
DelayUs(DEBOUNCE_TIME);
if(GpioDataRegs.GPBDAT.bit.GPIO32 == 0) {
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // 反转 GPIO34 引脚输出状态
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 确认 INT1 中断
}
```
程序的实现思路和上一个示例程序类似,只是在按键消抖处理上使用了延时函数。具体来说,程序中定义了一个 `DelayUs()` 函数,用来实现 us 级别的延时;然后,在 XINT1 中断服务函数中添加按键消抖处理,即先使用 `DelayUs()` 函数进行延时,再检查按键是否按下,并反转 GPIO34 引脚输出状态。
需要注意的是,由于该程序使用了 CPU 定时器来实现延时,因此需要提前进行 CPU 定时器的初始化。另外,该程序使用了 PIE 模块来实现中断控制,需要在程序中使能 PIE 模块,并且在中断服务函数的最后,使用 `PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;` 命令来确认 INT1 中断。
希望这个程序能够帮助到你!
阅读全文