/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/
/* P2.0 for PWM0 */
SYS->P2_MFP = SYS_MFP_P20_PWM0 ;
/* Lock protected registers */
SYS_LockReg();
}
void PWMA_Init(void)
{
//配置预分频器 (PPR)
PWMA->PPR = PWM_PPR_CP01(30) ;
//配置时钟选择器(CSR)
PWMA->CSR = PWM_CSR_CSR0(PWM_CSR_DIV16);
/* Enable PWM0 counter. We must set PWM mode before setting CNR, CMR. */
//如果设置PWM_PCR_CH0MOD_AUTO_RELOAD ,当PWM计数器达到0,自动重载CNR0的值到PWM计数器
PWMA->PCR = PWM_PCR_CH0EN_Msk | PWM_PCR_CH0MOD_AUTO_RELOAD;
//频率计算公式
/* PWM0 = 12000000 / 30 / 16 / 200 = 125Hz */
PWMA->CNR0= 200; //配置PWM计数器寄存器 (CNR) 设定PWM周期
PWMA->CMR0= 100; //配置比较器寄存器(CMR) 设定PWM占空比
/* Enable PWM channle 0 Output */
//配置相应的GPIO管脚为PWM功能(使能 POE 和禁用CAPENR).
PWMA->POE = PWM_POE_PWM0_Msk;
}
int main(void)
{
uint16_t i,j;
SYS_Init();
PWMA_Init();
while(1)
{
//下面有小到大 然后由大到小 循环改变占空比大小,LED灯就会慢慢变亮,然后又慢慢变暗。
//注意CMR的值不能大于CNR
for (g_u16PWMValue = 1;g_u16PWMValue<200;g_u16PWMValue++)
{
PWMA->CMR0 = g_u16PWMValue;
for(i=0;i<500;i++) //延时
for(j=0;j<100;j++);
}
for (g_u16PWMValue = 199;g_u16PWMValue>0;g_u16PWMValue--)
{
PWMA->CMR0 = g_u16PWMValue;
for(i=0;i<500;i++) //延时
for(j=0;j<100;j++);
}
}
}
|