#include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" #define GEN_BUZZ_CLK GpioDataRegs.GPBTOGGLE.bit.GPIO35 = 1 //蜂鸣器控制IO,IO电平翻转,产生控制脉冲 #define BUZZ_OFF GpioDataRegs.GPBCLEAR.bit.GPIO35 = 1 //关闭蜂鸣器 #define MAXWARNTIMES 3 float t1=1; float t2=3; Uint16 N1=0; Uint16 N2=0; Uint16 WarnTimes=0; float freq0=1000; // 定时器0的中断频率(Hz) float prd0=0; // 定时器0的中断周期(sec)=1/freq0/2,对于方波,一个周期要中断2次 void InitBuzzGpio(void); interrupt void cpu_timer0_isr(void); void main(void) { N1=(Uint16)(t1/prd0); N2=(Uint16)(t1+t2/prd0); // Step 1. 系统控制初始化 InitSysCtrl(); // 蜂鸣器(Buzz)引脚初始化 InitBuzzGpio(); // Step 3. 清除所有中断、初始化PIE向量表,关闭cpu中断 DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); // 初始化TIMER0功能 EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; InitCpuTimers(); prd0=1/(freq0*2); // 一个时钟周期,前半为H电平,后半为L电平。 ConfigCpuTimer(&CpuTimer0, 150, prd0*1e6);//定时周期单位:us IER |= M_INT1; // 使能TINT0(TINT0在INT1的第7个) PieCtrlRegs.PIEIER1.bit.INTx7 = 1; EINT; // 使能全局中断(EINT) ERTM; // 使能实时中断(ERTM) StartCpuTimer0(); // 启动定时器0 for(;;); // 或while(1); 死循环,不能让CPU停下来 } /*****************************************初始化IO端口************************************************/ void InitBuzzGpio(void) { EALLOW; GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 0; // GPIO35 = GPIO GpioCtrlRegs.GPBDIR.bit.GPIO35 = 1; // GPIO35 = output GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pullup on GPIO35 GpioDataRegs.GPBSET.bit.GPIO35 = 1; // Load output latch EDIS; } interrupt void cpu_timer0_isr(void) { CpuTimer0.InterruptCount++; if(CpuTimer0.InterruptCount<=N1) { GEN_BUZZ_CLK; } else if(CpuTimer0.InterruptCount<=N2) { BUZZ_OFF; } else { CpuTimer0.InterruptCount=0; } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }
时间: 2023-06-27 12:02:27 浏览: 260
这段代码是用来控制蜂鸣器的,主要包括初始化IO口、配置定时器、编写定时器中断服务程序等。具体来说,它通过定时器0的中断来产生控制脉冲,从而驱动蜂鸣器发声。其中使用了一些宏定义来方便代码的编写,例如GEN_BUZZ_CLK用于产生控制脉冲,BUZZ_OFF用于关闭蜂鸣器。同时,它也设置了一些变量来控制蜂鸣器的鸣叫次数和频率等参数。最后,在main函数中启动了定时器0并进入死循环,以确保程序一直运行。
阅读全文