各位大神,下面是小弟利用定时器的第二通道做的PWM代码,主要是观察LED的亮暗程度:
void Pwm_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); //使能复用时钟和PB5口
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //开启部分重映射功能 现在TIM3_CH2已经重映射到PB5上面
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
TIM_TimeBaseStructure.TIM_Prescaler=0x00; //预分频值 0+1=1
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period=50000; //重装值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; //时钟分割
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化
TIM_PrescalerConfig(TIM3, 0, TIM_PSCReloadMode_Immediate); //立即装入预分频值
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure. TIM_Pulse=40000;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); //使能预装载功能
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能TIM3的中断
TIM_Cmd(TIM3, ENABLE); //使能TIM3定时器
}
u16 temp=0;
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
temp=TIM_GetCapture2(TIM3);
printf("%d, ",temp);
printf("Hello ");
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
我有一下的疑问:
1.
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); //使能预装载功能
TIM_ARRPreloadConfig(TIM3, ENABLE);
这两句是必须的吗?它们好像也只是重新装载一下之前的值而已,在值不需要改变的时候,好像并无预装载的必要。
2.
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
这里的更新事件指的是什么?是定时器溢出中断还是达到通道2的值时的中断呢?还是预装载寄存器的时候发生的中断呢?
|