新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2016-12-1
- 在线时间
- 7 小时
|

楼主 |
发表于 2016-12-21 10:41:38
|
显示全部楼层
PWM初始化程序
void TIMx_PWM_init(TIM_TypeDef*TIMx,u8 ch,u8 f)
{
TIM_PWM_GPIO_config();//引脚配置
TIM_parameter_config(TIMx,10000,72000000/(f*10000));/定时器配置
TIM_PWM_MODEconfig(ch,TIMx);//pwm模式配置
//TIM_Cmd(TIMx, ENABLE);
}
void TIM_PWM_GPIO_config()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void TIM_PWM_MODEconfig(u8 ch,TIM_TypeDef*TIMx)
{
TIM_OCInitTypeDef TIM_OCInitStruct;
if(TIMx==TIM3)
{
if(ch==1)
{
/*PWM1 Mode configuration: Channel1 */
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平*/
TIM_OC1Init(TIM3, &TIM_OCInitStruct); //使能通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//CH1预装载使能
}
if(ch==2)
{
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=CCR2_Val;//设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//CH1预装载使能
}
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
}
void TIM_parameter_config(TIM_TypeDef*TIMx,u16 arr,u16 prc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义和定时器寄存器有关的参数结构体指针
TIM_TimeBaseInitStruct.TIM_Period=arr-1;////设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseInitStruct.TIM_Prescaler=prc-1;//设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
if(TIMx==TIM3)TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化定时器参数,设置自动重装值,分频系数,计数方式等
else if(TIMx==TIM2)TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
}
定时器使能用那个START_TIME代替的
#define START_TIME RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_Cmd(TIM3, ENABLE);
关键是程序下面没有while循环单片机就有PWM输出,加上while循环就没有输出了,我想不明白
|
|