此程序由江科大51代码改编而来,他讲的很详细,有需要的建议去看。我就直接附代码了。不懂的评论区见。
main.c中部分代码,while里的配置
void main()
{
InitSysCtrl();
//初始化PIE控制寄存器和PIE中断向量表
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
Beep_Init();
while (1)
{
if (Music[pai] != 0xFF)
{
TIM1_Init(150, (zhouqi[Music[pai]])/2);
pai++;
DELAY_MS(Music[pai]*125);
pai++;
CpuTimer1Regs.TCR.bit.TSS=1;
DELAY_MS(5);
CpuTimer1Regs.TCR.bit.TSS=0;
}
else
{
}
}
}
time.c
#include "time.h"
#include "leds.h"
//定时器1初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM1_Init(float Freq, float Period)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 0
EDIS;
//设置定时器1的中断入口地址为中断向量表的INT13
EALLOW;
PieVectTable.XINT13 = &TIM1_IRQn;
EDIS;
//指向定时器1的寄存器地址
CpuTimer1.RegsAddr = &CpuTimer1Regs;
//设置定时器1的周期寄存器值
CpuTimer1Regs.PRD.all = 0xFFFFFFFF;
//设置定时器预定标计数器值为0
CpuTimer1Regs.TPR.all = 0;
CpuTimer1Regs.TPRH.all = 0;
//确保定时器1为停止状态
CpuTimer1Regs.TCR.bit.TSS = 1;
//重载使能
CpuTimer1Regs.TCR.bit.TRB = 1;
// Reset interrupt counters:
CpuTimer1.InterruptCount = 0;
ConfigCpuTimer(&CpuTimer1, Freq, Period);
//开始定时器功能
CpuTimer1Regs.TCR.bit.TSS=0;
//定时器1直接连到内核中断,无需配置PIE
IER |= M_INT13;
//使能总中断
EINT;
ERTM;
}
interrupt void TIM1_IRQn(void)
{
EALLOW;
GpioDataRegs.GPATOGGLE.bit.GPIO6=1;//设置GPIO输出翻转信号
LED2_TOGGLE;
PieCtrlRegs.PIEACK.bit.ACK1=1;//清除中断标志
EDIS;
}
上面用到的一些数组、宏定义,具体参考江科大视频或私发