- /*---------------------------------------------------------------------------------------------------------*/
- /* 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++);
- }
- }
- }
|