通用定时器输出PWM:
void TIM3_PWM(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<4;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL|=0XBB000000;
GPIOC->CRH|=0X000000BB;
RCC->APB2ENR|=1<<0; //AFIO ʱÖÓʹÄÜ
AFIO->MAPR=3<<10; //ÍêÈ«ÖØÓ³Éä
/*
¿ªÆôTIM3CH1,CH2£¬CH3£¬CH4ËÄͨµÀPWMÊä³ö
*/
TIM3->CCMR1|=7<<4;
TIM3->CCMR1|=1<<3;
TIM3->CCER|=1<<0;
TIM3->CCMR1|=7<<12;
TIM3->CCMR1|=1<<11;
TIM3->CCER|=1<<4;
TIM3->CCMR2|=7<<4;
TIM3->CCMR1|=1<<3;
TIM3->CCER|=1<<8;
TIM3->CCMR2|=7<<12;
TIM3->CCMR2|=1<<11;
TIM3->CCER|=1<<12;
TIM3->ARR=arr; //×°Èë³õÖµÊý
TIM3->PSC=psc; //ÉèÖÃÔ¤·ÖƵÊý
/*
TIMx_CR1µÚËÄλ¿ØÖƼ¼¼ÆÊý·½Ïò£º0ÏòÉϼÆÊý 1ÏòϼÆÊý
*/
TIM3->CR1=0X0080;
TIM3->CR1|=0X01;
}
定时器可通过TIMx_CR1的DIR位控制加计数或减计数(0加1减)
两种方式介绍如下(P326)
向上计数:
如预分频寄存器(TIMx_PSC)为2,自动重装载寄存器(TIMx_CR1)为36,则向上计数时序图如下所示:
向下计数:
如预分频寄存器(TIMx_PSC)为2,自动重装载寄存器(TIMx_CR1)为36,则向下计数时序图如下所示:
以上函数通过设置AFIO_REMAP寄存器将TIM3的四通道CH1,CH2,CH3,CH4重映射到PC6,PC7,PC8,PC9,并将这四个IO口设置为复用开漏输出,当然,还要使能TIM3,AFIO,GPIOC的时钟,之后,在主函数里调用这个函数并给TIM3->CCRx赋值即可得到四路PWM
TIM3_PWM(899,0);
TIM3->CCR1 = pwmval1;
TIM3->CCR2 = pwmval2;
TIM3->CCR3 = pwmval3;
TIM3->CCR4 = 90;
如以上语句就得到了频率80K,四路独立占空比的PWM,其中CH4(PC9)duty为90%