SYS_UnlockReg(); //解锁受保护的寄存器
Sys_Init(); //初始化系统,外设时钟和多功能I / O
Uart0_Init(UART0_BOUND);//为printf初始化UART0
Led_Init(); //LED工作指示灯初始化
Pwm_Init(); //PWM0、PWM2初始化
Timer_Init(); //定时器0初始化 1ms
SYS_LockReg(); //锁定受保护的寄存器[code]//--------------------------------------------------
//初始化系统时钟
//--------------------------------------------------
void Sys_Init(void)
{
//--------------------------------------------------
//启用内部RC 22.1184MHz时钟
CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
//等待内部RC时钟就绪
CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
//--------------------------------------------------
//将HCLK时钟源切换为内部RC和HCLK源分频1
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
//--------------------------------------------------
//将PLL的核心时钟设置为PLL_CLOCK
CLK_SetCoreClock(PLL_CLOCK);
//更新系统核心时钟
//用户可以使用SystemCoreClockUpdate()
//自动计算PllClock,SystemCoreClock和CycylesPerUs。
SystemCoreClockUpdate();
}
[code]//--------------------------------------------------
//PWM0初始化
//--------------------------------------------------
void Pwm_Init(void)
{
//PWM0初始化 将PWM0初始化成输出口,时钟频率为10kHZ
//初始化I / O多功能
//设置PWMA通道0、2的多功能引脚 P40 P42
SYS->P4_MFP &= ~ (SYS_MFP_P40_Msk | SYS_MFP_P42_Msk);
SYS->P4_MFP |= SYS_MFP_P40_PWM0 | SYS_MFP_P42_PWM2;
//启动PWM0时钟
CLK_EnableModuleClock(PWM01_MODULE);
//IP时钟源
CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, 0);
//PWM2初始化,初始化成PWM输入捕获
//启动PWM0时钟
CLK_EnableModuleClock(PWM23_MODULE);
//IP时钟源
CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HCLK, 0);
//重置PWMA通道0~通道3
SYS_ResetModule(PWM03_RST);
/* 设置PWMB通道2捕获配置 */
PWM_ConfigCaptureChannel(PWMA, PWM_CH2, 5000, 0);
/* 使能PWMB通道2的捕获下降沿中断*/
PWM_EnableCaptureInt(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH);
/* 使能PWMA NVIC中断*/
NVIC_EnableIRQ((IRQn_Type)(PWMA_IRQn));
/* 使能PWMB通道2的定时器 */
PWM_Start(PWMA, 0x4);
/* 使能PWMB通道2的捕获功能 */
PWM_EnableCapture(PWMA, 0x4);
/* 等到PWMB通道2计时器开始计数 */
while(PWMA->PDR2 == 0);
PWM_ClearCaptureIntFlag(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH);
}[code]
void PWMA_IRQHandler(void)
{
// uint32_t u32PwmIntFlag;
uint32_t u32CapIntFlag1;
/* 处理PWMB捕获功能 */
u32CapIntFlag1 = PWMA->CCR2;
/* PWMB通道2捕获中断*/
if(u32CapIntFlag1 & PWM_CCR2_CAPIF2_Msk)
{
v_Cont ++;
g_Capif2Flag = SET;
PWM_ClearCaptureIntFlag(PWMA, PWM_CH2, PWM_CAPTURE_INT_FALLING_LATCH );
// PWMA->CCR2 &= (PWM_CCR_MASK | PWM_CCR2_CAPIF2_Msk);
}
}
[code] /* 捕获输入波形数据 */
if(g_Capif2Flag == SET)
{
u32i = 0;
g_Capif2Flag = CLEAR;
u32Count[u32i++] = PWM_GET_CAPTURE_FALLING_DATA(PWMA, PWM_CH2);
u32Count[u32i++] = PWM_GET_CAPTURE_RISING_DATA(PWMA, PWM_CH2);
// printf("\n捕获结果:\n 高电平时间=%d,低电平时间=%d\n 高周期=%d,低周期=%d,总周期=%d.\n",
// u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid);
//
//
printf("\n捕获结果:\n u32Count[0] =%d, u32Count[1] =%d,\n u32Count[2] =%d, u32Count[3] =%d.\n",
u32Count[0],u32Count[1],u32Count[2],u32Count[3]);
printf("\n Count = %d.\n",v_Cont);
v_Cont = 0;
}
[/code][/code][/code][/code] |