1.代码展示
第一步开启时钟
这里开启了PA0口的时钟,是因为STM32的PWM波形需要从PA0口中输出,这里可以查看STM32的引角定义表。
//第一步开启时钟,RCC内部时钟,GPIOA
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
第二步选择内部时钟源
//第二部选择时基单元的时钟,内部时钟模式
TIM_InternalClockConfig(TIM2);
第三步配置时基单元
//配置时基单元
// TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
//公式:hz=72mhz/(psc+1)/(arr+1) 72mhz=72 000 000hz
TIM_TimeBaseInitStructure.TIM_Period=100-1;//ARR自动重装器的值
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//PSC预分频器的值
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器参数,高级计数器菜使用
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
第三步配置OC
//PWM计算公式
//PWM频率:Freq=72mhz/(psc+1)/(arr+1)
//PWM占空比:Duty=CRR/(arr+1)
//PWM分辨率:Reso=1/(arr+1)
//例子;输出1khz的PWM波形 分辨率为1% 占空比为50%
//1%=1/(arr+1) arr=99 50%=CRR/100 CRR=50 PSC=720-1
// TIM_OCInitTypeDef TIM_InitStructure;
TIM_OCStructInit(&TIM_InitStructure);//防止其他值没有赋值
TIM_InitStructure.TIM_OCMode=TIM_OCMode_PWM1; //输出模式
TIM_InitStructure.TIM_OCNPolarity=TIM_OCPolarity_High;//极性选择
TIM_InitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
TIM_InitStructure.TIM_Pulse=50;//CCR赋值
TIM_OC1Init(TIM2,&TIM_InitStructure);
第四步,启动定时器
//启动定时器
TIM_Cmd(TIM2,ENABLE);
第五步,封装改变CCR的值函数
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2,Compare);
}
最后完成主函数
int main(void)
{
PWM_Init();
OLED_Init();
while(1)
{
for(i=0;i<=100;i++)
{
PWM_SetCompare1(i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare1(100-i);
Delay_ms(10);
}
}
}
用FOR循环完成占空比从0到100,使LED从最暗慢慢达到最亮。
反之完成LED从最亮到最暗。