STM32 配置定时器让引脚输出PWM波形
2015-07-03 00:00
666 查看
摘要: STM32 配置定时器让引脚输出PWM波形
最近一个项目需要控制比较多的步进电机,而且还要求步进电机能几个同时转,用软件计时然后定时翻转IO脚太麻烦了,也不好用,好在STM32可以通过配置定时器让特定引脚输出PWM波形,配置好后打开输出,使能定时器,然后只需要在中断中判断是否应该停止即可。附定时器配置代码:
最近一个项目需要控制比较多的步进电机,而且还要求步进电机能几个同时转,用软件计时然后定时翻转IO脚太麻烦了,也不好用,好在STM32可以通过配置定时器让特定引脚输出PWM波形,配置好后打开输出,使能定时器,然后只需要在中断中判断是否应该停止即可。附定时器配置代码:
/* * 函数名:void TIMx_PWMOutConf(TIM_TypeDef * TIMx,uint32_t RCC_APB1Periph) * 描述 :初始化通用定时器TIMx作为PWM输出 * 输入 :TIMx: where x can be 1 to 17 to select the TIM peripheral,定时器时钟地址,通道编号 * 输出 :无 */ void TIMx_PWMOutConf(TIM_TypeDef * TIMx,uint8_t TIMx_Channelx,uint32_t RCC_APB1Periph_TIMx) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIMx); /*开启TIM时钟*/ if(RCC_APB2Periph_TIM8 == RCC_APB1Periph_TIMx || RCC_APB2Periph_TIM1 == RCC_APB1Periph_TIMx) { RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE); } else { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE); } /*设置周期*/ TIM_TimeBaseInitStructure.TIM_Period = PWM_INIT_PERIOD; /*设置定时器时钟频率*/ TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_INIT_PRESCALER; /*向上计数模式*/ TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; /*设置TIMx预分频寄存器和自动重装寄存器*/ TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure); /*要设置TIMx_CR1 寄存器的ARPE 位,使TIMx_ARR 寄存器具有缓冲*/ TIM_ARRPreloadConfig(TIMx,ENABLE); /* PWM1模式 在向上计数时,一旦TIMx_CNT<TIMx_CCR1 时通道1为有效电平,否则为 无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1 时通道1 为无效电平 (OC1REF=0) ,否则为有效电平(OC1REF=1) */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /*有效电平为高电平*/ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; /*设置占空比*/ TIM_OCInitStructure.TIM_Pulse = PWM_INIT_DUTY_CYCLE; /*允许PWM输出*/ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; switch(TIMx_Channelx) { case 1: { /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/ TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable ); &nb 3ff0 sp; TIM_OC1Init(TIMx,& TIM_OCInitStructure); /*允许比较中断*/ TIM_ITConfig(TIMx,TIM_IT_CC1,ENABLE); }break; case 2: { /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/ TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable ); TIM_OC2Init(TIMx,& TIM_OCInitStructure); /*允许比较中断*/ TIM_ITConfig(TIMx,TIM_IT_CC2,ENABLE); }break; case 3: { /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/ TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable ); TIM_OC3Init(TIMx,& TIM_OCInitStructure); /*允许比较中断*/ TIM_ITConfig(TIMx,TIM_IT_CC3,ENABLE); }break; case 4: { /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/ TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable ); TIM_OC4Init(TIMx,& TIM_OCInitStructure); /*允许比较中断*/ TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE); }break; default: break; } if(RCC_APB2Periph_TIM8 == RCC_APB1Periph_TIMx || RCC_APB2Periph_TIM1 == RCC_APB1Periph_TIMx) { TIM_CtrlPWMOutputs(TIMx, ENABLE); } }
相关文章推荐
- Mootools 1.2教程 定时器和哈希简介
- C#定时器和随机数
- C#中timer定时器用法实例
- JS中自定义定时器让它在某一时刻执行
- JavaScript定时器详解及实例
- Qt定时器和随机数详解
- asp.net中Timer无刷新定时器的实现方法
- libevent库的使用--定时器的使用实例
- MySQL定时器EVENT学习笔记
- js函数定时器实现定时读取系统实时连接数
- linux使用select实现精确定时器详解
- Cocos2d-x Schedule定时器的使用实例
- VC定时器的用法实例详解
- c#定时器和global实现自动job示例
- JavaScript学习笔记之定时器
- js定时器的使用(实例讲解)
- c#定时器使用示例详解
- 深入探寻javascript定时器
- 浅谈javascript语法和定时函数
- JS定时器实例详细分析