中级会员
 
- 积分
- 390
- 金钱
- 390
- 注册时间
- 2018-3-20
- 在线时间
- 80 小时
|
发表于 2018-3-27 17:30:54
|
显示全部楼层
void tim_cfg(TIM_TypeDef* TIMx)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint32_t RCC_APB1Periph;
if(TIMx==TIM2) RCC_APB1Periph=RCC_APB1Periph_TIM2;
if(TIMx==TIM3) RCC_APB1Periph=RCC_APB1Periph_TIM3;
if(TIMx==TIM4) RCC_APB1Periph=RCC_APB1Periph_TIM4;
RCC_APB1PeriphClockCmd(RCC_APB1Periph,ENABLE);
TIM_DeInit(TIMx);
TIM_InternalClockConfig(TIMx);
//<h>对于6400细分,CPU压力不大又不会变速太尖锐的计时器频率约2MHz
//</h>
//预分频系数为36000-1,这样计数器时钟为72MHz/36 = 2000kHz
//<o>TIMx预分频系数x,计数器时钟为72MHz/x <18=> 18(4MHz) <36=> 36(2MHz)
// <72=> 72(1MHz) <144=> 144(0.5MHz)
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ; //设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_Period = 40 - 1; //设置计数溢出大小,每计20000个数就产生一个更新事件
TIM_TimeBaseInit(TIMx,&TIM_TimeBaseStructure); //将配置应用到TIM2中
TIM_ARRPreloadConfig(TIMx, ENABLE); //使能ARR预装载缓冲器
TIM_UpdateRequestConfig(TIMx,TIM_UpdateSource_Regular);
//下面是对TIM_OCInitStructure的配置
TIM_OCStructInit(& TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //管脚输出模式:有效
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //管脚输出模式:翻转
TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/2; //占空比1/2
//(设置向导用指令)c1> TIM2 输出通道 [使能|失能]
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //失能TIM2_后续选择通道
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能TIM2_后续选择通道
///*c>(设置向导用指令)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出为正逻辑
TIM_OC2Init(TIMx, &TIM_OCInitStructure); //写入配置
//开启TIM2的中断
TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable); //输出比较预装使能
TIM_ClearFlag(TIMx, TIM_IT_Update);
TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE);
TIM_ClearFlag(TIMx, TIM_IT_CC2);
TIM_ITConfig(TIMx,TIM_IT_CC2,DISABLE);
TIM_Cmd(TIMx, DISABLE);//使能TIMx外设
}
很久以前写的,看看有没有参考吧 |
|