PWM of STM32
下面是STM32用来产生PWM得文件,分别是PWM.c和PWM.h
/**************************************************************************
* 文件名:PWM.h *
* 编写人:离逝的风 *
* 更新时间:2018.12.9 *
* 说明:此文件属于开源,所有权对任何人开放 *
* 如有问题请联系邮箱:1477153217@qq.com *
* *
* PWM是用定时器产生占空比可调的波形,基本配置步骤如下: *
* 1.开启通道,即设置PWMx_CHy_EN为1即可 *
* 2.设置通道引脚映射,下面表中有详细说明,TIM1_PWM_CH *
* 3.设置PWM分频系数,TIM1_PWM_PSC *
* 4.设置重装值 TIM1_PWM_ARR *
* 5.设置比较值 TIM1_CH1_CCR1 *
* 6.在主函数中调用PWMx_CHy_Init来初始化通道 *
* 说明:占空比R=(ARR-CCRx)/ARR *
***************************************************************************/
#ifndef __PWM_H
#define __PWM_H #include "stm32f10x.h" /*#############################下面为PWM通道引脚定义###############################################################
说明:通道选择
-------------------------------------------------------------------------------------------------------------------
TIM1_PWM_CH:
[0] ETR->PA12 CH1->PA8 CH2->PA9 CH3->PA10 CH4->PA11 BKIN->PB12 CH1N->PB13 CH2N->PB14 CH3N->PB15
[1] ETR->PA12 CH1->PA8 CH2->PA9 CH3->PA10 CH4->PA11 BKIN->PA6 CH1N->PA7 CH2N->PB0 CH3N->PB1
[2] 未分组
[3] ETR->PE7 CH1->PE9 CH2->PE11 CH3->PE13 CH4->PE14 BKIN->PE15 CH1N->PE8 CH2N->PE10 CH3N->PE12
-------------------------------------------------------------------------------------------------------------------
TIM2_PWM_CH:
[0] ETR->PA0 CH1->PA0 CH2->PA1 CH3->PA2 CH4->PA3
[1] ETR->PA15 CH1->PA15 CH2->PB3 CH3->PA2 CH4->PA3
[2] ETR->PA0 CH1->PA0 CH2->PA1 CH3->PB10 CH4->PB11
[3] ETR->PA15 CH1->PA15 CH2->PB3 CH3->PB10 CH4->PB11
-------------------------------------------------------------------------------------------------------------------
TIM3_PWM_CH:
[0] CH1->PA6 CH2->PA7 CH3->PB0 CH4->PB1
[1] 未分组
[2] CH1->PB4 CH2->PB5 CH3->PB0 CH4->PB1
[3] CH1->PC6 CH2->PC7 CH3->PC8 CH4->PC9
-------------------------------------------------------------------------------------------------------------------
TIM4_PWM_CH:
[0] CH1->PB6 CH2->PB7 CH3->PB8 CH4->PB9
[1] CH1->PD12 CH2->PD13 CH3->PD14 CH4->PD15
-------------------------------------------------------------------------------------------------------------------
TIM5_PWM_CH:
[0] CH4->PA3
[1] CH4->LSI
注:LSI为内部时钟震荡器
-------------------------------------------------------------------------------------------------------------------*/
/**############################下面为文件配置,根据用更改##########################################################**/
//开启功能设置1,否则设置0
#define PWM1_CH1_EN 0
#define PWM1_CH2_EN 0
#define PWM1_CH3_EN 0
#define PWM1_CH4_EN 0 #define PWM2_CH1_EN 0
#define PWM2_CH2_EN 0
#define PWM2_CH3_EN 0
#define PWM2_CH4_EN 0 #define PWM3_CH1_EN 0
#define PWM3_CH2_EN 0
#define PWM3_CH3_EN 0
#define PWM3_CH4_EN 0 #define PWM4_CH1_EN 0
#define PWM4_CH2_EN 0
#define PWM4_CH3_EN 0
#define PWM4_CH4_EN 0 #define PWM5_CH4_EN 0 /*############################下面是引脚修改部分,默认0###########################################################*/
#define TIM1_PWM_CH 0
#define TIM2_PWM_CH 0
#define TIM3_PWM_CH 2
#define TIM4_PWM_CH 0
#define TIM5_PWM_CH 0
/***************************下面为预分频器值,PSC********************************************************************/
//注:PSC的值决定PWM的时钟频率
#define TIM1_PWM_PSC 7199 #define TIM2_PWM_PSC 7199 #define TIM3_PWM_PSC 7199 #define TIM4_PWM_PSC 7199 #define TIM5_PWM_PSC 7199 /***************************下面为自动重装值,ARR***************************************************************/
//注:ARR的值和CCRx值共同决定PWM的占空比,占空比R=(ARR-CCRx)/ARR
#define TIM1_PWM_ARR 100 #define TIM2_PWM_ARR 100 #define TIM3_PWM_ARR 100 #define TIM4_PWM_ARR 100 #define TIM5_PWM_ARR 100
/**************************下面为捕获比较寄存器值,CCRx*********************************************************/
//注:ARR的值和CCRx值共同决定PWM的占空比,占空比R=(ARR-CCRx)/ARR
#define TIM1_CH1_CCR1 10
#define TIM1_CH2_CCR2 10
#define TIM1_CH3_CCR3 10
#define TIM1_CH4_CCR4 10 #define TIM2_CH1_CCR1 10
#define TIM2_CH2_CCR2 10
#define TIM2_CH3_CCR3 10
#define TIM2_CH4_CCR4 10 #define TIM3_CH1_CCR1 10
#define TIM3_CH2_CCR2 10
#define TIM3_CH3_CCR3 10
#define TIM3_CH4_CCR4 10 #define TIM4_CH1_CCR1 10
#define TIM4_CH2_CCR2 10
#define TIM4_CH3_CCR3 10
#define TIM4_CH4_CCR4 10 #define TIM5_CH4_CCR1 10 /*#############################下面为函数接,供用户使用#########################################################*/
//备注:用户可以直接PSC寄存器值来改变频率
/*----------------------PWM1----------------------------------*/
#if(PWM1_CH1_EN==1)
void PWM1_CH1_Init(void);
#endif
#if(PWM1_CH2_EN==1)
void PWM1_CH2_Init(void);
#endif
#if(PWM1_CH3_EN==1)
void PWM1_CH3_Init(void);
#endif
#if(PWM1_CH4_EN==1)
void PWM1_CH4_Init(void);
#endif
/*----------------------PWM2----------------------------------*/
#if(PWM2_CH1_EN==1)
void PWM2_CH1_Init(void);
#endif
#if(PWM2_CH2_EN==1)
void PWM2_CH2_Init(void);
#endif
#if(PWM2_CH3_EN==1)
void PWM2_CH3_Init(void);
#endif
#if(PWM2_CH4_EN==1)
void PWM2_CH4_Init(void);
#endif
/*----------------------PWM3----------------------------------*/
#if(PWM3_CH1_EN==1)
void PWM3_CH1_Init(void);
#endif
#if(PWM3_CH2_EN==1)
void PWM3_CH2_Init(void);
#endif
#if(PWM3_CH3_EN==1)
void PWM3_CH3_Init(void);
#endif
#if(PWM3_CH4_EN==1)
void PWM3_CH4_Init(void);
#endif
/*----------------------PWM4----------------------------------*/
#if(PWM4_CH1_EN==1)
void PWM4_CH1_Init(void);
#endif
#if(PWM4_CH2_EN==1)
void PWM4_CH2_Init(void);
#endif
#if(PWM4_CH3_EN==1)
void PWM4_CH3_Init(void);
#endif
#if(PWM4_CH4_EN==1)
void PWM4_CH4_Init(void);
#endif
/*----------------------PWM5----------------------------------*/
#if(PWM5_CH4_EN==1)
void PWM5_CH4_Init(void);
#endif #endif //FILE END
/**************************************************************************
* 文件名:PWM.c *
* 编写人:离逝的风 *
* 更新时间:2018.12.9 *
* 说明:此文件属于开源,所有权对任何人开放 *
* 如有问题请联系邮箱:1477153217@qq.com *
* *
* PWM是用定时器产生占空比可调的波形,基本配置步骤如下: *
* 1.开启通道,即设置PWMx_CHy_EN为1即可 *
* 2.设置通道引脚映射,下面表中有详细说明,TIM1_PWM_CH *
* 3.设置PWM分频系数,TIM1_PWM_PSC *
* 4.设置重装值 TIM1_PWM_ARR *
* 5.设置比较值 TIM1_CH1_CCR1 *
* 6.在主函数中调用PWMx_CHy_Init来初始化通道 *
* 说明:占空比R=(ARR-CCRx)/ARR *
***************************************************************************/
#include "PWM.h" /*###############################下面为TIM1实现PWM##################################################*/
/*--------------------------------PWM_CH1-----------------------------------------------------------*/
#if(PWM1_CH1_EN==1)
void PWM1_CH1_Init(void)
{
RCC->APB2ENR|=(<<); //开启TIM1时钟 //下面为映射引脚配置
#if(TIM1_PWM_CH==0||TIM1_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRH&=0XFFFFFFF0; //清除PA8之前配置位
GPIOA->CRH|=0X0000000B; //配置PA8为复用推挽输出
#endif #if(TIM1_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOE和AFIO时钟
GPIOE->CRH&=0XFFFFFF0F; //清除PE9之前配置位
GPIOE->CRH|=0X000000B0; //配置PE9为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM1_PWM_CH<<); //定义引脚重映射,设置PWM1相应引脚 TIM1->CR1|=(<<); //使能自动重装寄存器 TIM1->PSC|=(TIM1_PWM_PSC); //设置预分频值
TIM1->ARR&=0X00; //清除ARR之前配置
TIM1->ARR|=TIM1_PWM_ARR; //设置ARR为TIM1_ARR TIM1->CCR1&=0x00;
TIM1->CCR1|=TIM1_CH1_CCR1; //设置翻转周期计时长度 TIM1->CCMR1|=(<<)|(<<); //使能CH1和设置CH1为模式1
TIM1->CCER|=(<<); //CH1使能输出
TIM1->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH2-------------------------------------------------------------------*/
#if(PWM1_CH2_EN==1)
void PWM1_CH2_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM1时钟 //下面为映射引脚配置
#if(TIM1_PWM_CH==0||TIM1_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRH&=0XFFFFFF0F; //清除PA9之前配置位
GPIOA->CRH|=0X000000B0; //配置PA9为复用推挽输出
#endif #if(TIM1_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOE和AFIO时钟
GPIOE->CRH&=0XFFFF0FFF; //清除PE11之前配置位
GPIOE->CRH|=0X0000B000; //配置PE11为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM1_PWM_CH<<); //定义引脚重映射,设置PWM1相应引脚 TIM1->CR1|=(<<); //使能自动重装寄存器 TIM1->PSC|=(TIM1_PWM_PSC); //设置预分频值
TIM1->ARR&=0X00; //清除ARR之前配置
TIM1->ARR|=TIM1_PWM_ARR; //设置ARR为TIM1_ARR TIM1->CCR2&=0x00;
TIM1->CCR2|=TIM1_CH2_CCR2; //设置翻转周期计时长度 TIM1->CCMR1|=(<<)|(<<); //使能CH2和设置CH2为模式1
TIM1->CCER|=(<<); //CH2使能输出
TIM1->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH3-------------------------------------------------------------------*/
#if(PWM1_CH3_EN==1)
void PWM1_CH3_Init(void)
{
RCC->APB2ENR|=(<<); //开启TIM1时钟 //下面为映射引脚配置
#if(TIM1_PWM_CH==0||TIM1_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRH&=0XFFFFF0FF; //清除PA10之前配置位
GPIOA->CRH|=0X00000B00; //配置PA10为复用推挽输出
#endif
#if(TIM1_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOE和AFIO时钟
GPIOE->CRH&=0XFF0FFFFF; //清除PE13之前配置位
GPIOE->CRH|=0X00B00000; //配置PE13为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM1_PWM_CH<<); //定义引脚重映射,设置PWM1相应引脚 TIM1->CR1|=(<<); //使能自动重装寄存器 TIM1->PSC|=(TIM1_PWM_PSC); //设置预分频值
TIM1->ARR&=0X00; //清除ARR之前配置
TIM1->ARR|=TIM1_PWM_ARR; //设置ARR为TIM1_ARR TIM1->CCR3&=0x00;
TIM1->CCR3|=TIM1_CH3_CCR3; //设置翻转周期计时长度 TIM1->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM1->CCER|=(<<); //CH3使能输出
TIM1->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH4-------------------------------------------------------------------*/
#if(PWM1_CH4_EN==1)
void PWM1_CH4_Init(void)
{
RCC->APB2ENR|=(<<); //开启TIM1时钟 //下面为映射引脚配置
#if(TIM1_PWM_CH==0||TIM1_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRH&=0XFFFF0FFF; //清除PA11之前配置位
GPIOA->CRH|=0X0000B000; //配置PA11为复用推挽输出
#endif #if(TIM1_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOE和AFIO时钟
GPIOE->CRH&=0XF0FFFFFF; //清除PE14之前配置位
GPIOE->CRH|=0X0B000000; //配置PE14为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM1_PWM_CH<<); //定义引脚重映射,设置PWM1相应引脚 TIM1->CR1|=(<<); //使能自动重装寄存器 TIM1->PSC|=(TIM1_PWM_PSC); //设置预分频值
TIM1->ARR&=0X00; //清除ARR之前配置
TIM1->ARR|=TIM1_PWM_ARR; //设置ARR为TIM1_ARR TIM1->CCR4&=0x00;
TIM1->CCR4|=TIM1_CH4_CCR4; //设置翻转周期计时长度 TIM1->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM1->CCER|=(<<); //CH3使能输出
TIM1->CR1|=(<<); //开始计数 }
#endif
/*###############################下面为TIM2实现PWM##################################################*/
/*--------------------------------PWM_CH1-----------------------------------------------------------*/
#if(PWM2_CH1_EN==1)
void PWM2_CH1_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM2时钟 //下面为映射引脚配置
#if(TIM2_PWM_CH==0||TIM2_PWM_CH==2)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRL&=0XFFFFFFF0; //清除PA0之前配置位
GPIOA->CRL|=0X0000000B; //配置PA0为复用推挽输出
#endif #if(TIM2_PWM_CH==1||TIM2_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRH&=0X0FFFFFFF; //清除PA15之前配置位
GPIOA->CRH|=0XB0000000; //配置P15为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM2_PWM_CH<<); //定义引脚重映射,设置PWM2相应引脚 TIM2->CR1|=(<<); //使能自动重装寄存器 TIM2->PSC|=(TIM2_PWM_PSC); //设置预分频值
TIM2->ARR&=0X00; //清除ARR之前配置
TIM2->ARR|=TIM2_PWM_ARR; //设置ARR为TIM1_ARR TIM2->CCR1&=0x00;
TIM2->CCR1|=TIM2_CH1_CCR1; //设置翻转周期计时长度 TIM2->CCMR1|=(<<)|(<<); //使能CH1和设置CH1为模式1
TIM2->CCER|=(<<); //CH1使能输出
TIM2->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH2-------------------------------------------------------------------*/
#if(PWM2_CH2_EN==1)
void PWM2_CH2_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM2时钟 //下面为映射引脚配置
#if(TIM2_PWM_CH==0||TIM2_PWM_CH==2)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRL&=0XFFFFFF0F; //清除PA1之前配置位
GPIOA->CRL|=0X000000B0; //配置PA1为复用推挽输出
#endif #if(TIM2_PWM_CH==1||TIM2_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0XFFFF0FFF; //清除PB3之前配置位
GPIOB->CRL|=0X0000B000; //配置PB3为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM2_PWM_CH<<); //定义引脚重映射,设置PWM2相应引脚 TIM2->CR1|=(<<); //使能自动重装寄存器 TIM2->PSC|=(TIM2_PWM_PSC); //设置预分频值
TIM2->ARR&=0X00; //清除ARR之前配置
TIM2->ARR|=TIM2_PWM_ARR; //设置ARR为TIM1_ARR TIM2->CCR2&=0x00;
TIM2->CCR2|=TIM2_CH2_CCR2; //设置翻转周期计时长度 TIM2->CCMR1|=(<<)|(<<); //使能CH2和设置CH2为模式1
TIM2->CCER|=(<<); //CH2使能输出
TIM2->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH3-------------------------------------------------------------------*/
#if(PWM2_CH3_EN==1)
void PWM2_CH3_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM2时钟 //下面为映射引脚配置
#if(TIM2_PWM_CH==0||TIM2_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRH&=0XFFFFF0FF; //清除PA2之前配置位
GPIOA->CRH|=0X00000B00; //配置PA2为复用推挽输出
#endif #if(TIM2_PWM_CH==2||TIM2_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRH&=0XFFFFF0FF; //清除PB10之前配置位
GPIOB->CRH|=0X00000B00; //配置PB10为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM2_PWM_CH<<); //定义引脚重映射,设置PWM2相应引脚 TIM2->CR1|=(<<); //使能自动重装寄存器 TIM2->PSC|=(TIM2_PWM_PSC); //设置预分频值
TIM2->ARR&=0X00; //清除ARR之前配置
TIM2->ARR|=TIM2_PWM_ARR; //设置ARR为TIM1_ARR TIM2->CCR3&=0x00;
TIM2->CCR3|=TIM2_CH3_CCR3; //设置翻转周期计时长度 TIM2->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM2->CCER|=(<<); //CH3使能输出
TIM2->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH4-------------------------------------------------------------------*/
#if(PWM2_CH4_EN==1)
void PWM2_CH4_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM2时钟 //下面为映射引脚配置
#if(TIM2_PWM_CH==0||TIM2_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRL&=0XFFFF0FFF; //清除PA3之前配置位
GPIOA->CRL|=0X0000B000; //配置PA3为复用推挽输出
#endif #if(TIM2_PWM_CH==2||TIM2_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRH&=0XFFFF0FFF; //清除PB11之前配置位
GPIOB->CRH|=0X0000B000; //配置PB11为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM2_PWM_CH<<); //定义引脚重映射,设置PWM2相应引脚 TIM2->CR1|=(<<); //使能自动重装寄存器 TIM2->PSC|=(TIM2_PWM_PSC); //设置预分频值
TIM2->ARR&=0X00; //清除ARR之前配置
TIM2->ARR|=TIM2_PWM_ARR; //设置ARR为TIM1_ARR TIM2->CCR4&=0x00;
TIM2->CCR4|=TIM2_CH4_CCR4; //设置翻转周期计时长度 TIM2->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM2->CCER|=(<<); //CH3使能输出
TIM2->CR1|=(<<); //开始计数
}
#endif
/*###############################下面为TIM3实现PWM##################################################*/
/*--------------------------------PWM_CH1-----------------------------------------------------------*/
#if(PWM3_CH1_EN==1)
void PWM3_CH1_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM3时钟 //下面为映射引脚配置
#if(TIM3_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRL&=0XF0FFFFFF; //清除PA6之前配置位
GPIOA->CRL|=0X0B000000; //配置PA6为复用推挽输出
#endif #if(TIM3_PWM_CH==2)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0XFFF0FFFF; //清除PB4之前配置位
GPIOB->CRL|=0X000B0000; //配置PB4为复用推挽输出
#endif #if(TIM3_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOC和AFIO时钟
GPIOC->CRL&=0XF0FFFFFF; //清除PC6之前配置位
GPIOC->CRL|=0X0B000000; //配置PC6为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM3_PWM_CH<<); //定义引脚重映射,设置PWM3相应引脚 TIM3->CR1|=(<<); //使能自动重装寄存器 TIM3->PSC|=(TIM3_PWM_PSC); //设置预分频值
TIM3->ARR&=0X00; //清除ARR之前配置
TIM3->ARR|=TIM3_PWM_ARR; //设置ARR为TIM1_ARR TIM3->CCR1&=0x00;
TIM3->CCR1|=TIM3_CH1_CCR1; //设置翻转周期计时长度 TIM3->CCMR1|=(<<)|(<<); //使能CH1和设置CH1为模式1
TIM3->CCER|=(<<); //CH1使能输出
TIM3->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH2-------------------------------------------------------------------*/
#if(PWM3_CH2_EN==1)
void PWM3_CH2_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM3时钟 //下面为映射引脚配置
#if(TIM3_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRL&=0X0FFFFFFF; //清除PA7之前配置位
GPIOA->CRL|=0XB0000000; //配置PA7为复用推挽输出
#endif #if(TIM3_PWM_CH==2)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0XFF0FFFFF; //清除PB5之前配置位
GPIOB->CRL|=0X00B00000; //配置PB5为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM3_PWM_CH<<); //定义引脚重映射,设置PWM3相应引脚 TIM3->CR1|=(<<); //使能自动重装寄存器 TIM3->PSC|=(TIM3_PWM_PSC); //设置预分频值
TIM3->ARR&=0X00; //清除ARR之前配置
TIM3->ARR|=TIM3_PWM_ARR; //设置ARR为TIM3_ARR TIM3->CCR2&=0x00;
TIM3->CCR2|=TIM3_CH2_CCR2; //设置翻转周期计时长度 TIM3->CCMR1|=(<<)|(<<); //使能CH2和设置CH2为模式1
TIM3->CCER|=(<<); //CH2使能输出
TIM3->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH3-------------------------------------------------------------------*/
#if(PWM3_CH3_EN==1)
void PWM3_CH3_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM3时钟 //下面为映射引脚配置
#if(TIM3_PWM_CH==0||TIM3_PWM_CH==2)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0XFFFFFFF0; //清除PB0之前配置位
GPIOB->CRL|=0X0000000B; //配置PB0为复用推挽输出
#endif #if(TIM2_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOC和AFIO时钟
GPIOC->CRH&=0XFFFFFFF0; //清除PC8之前配置位
GPIOC->CRH|=0X0000000B; //配置PC8为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM3_PWM_CH<<); //定义引脚重映射,设置PWM3相应引脚 TIM3->CR1|=(<<); //使能自动重装寄存器 TIM3->PSC|=(TIM3_PWM_PSC); //设置预分频值
TIM3->ARR&=0X00; //清除ARR之前配置
TIM3->ARR|=TIM3_PWM_ARR; //设置ARR为TIM3_ARR TIM3->CCR3&=0x00;
TIM3->CCR3|=TIM3_CH3_CCR3; //设置翻转周期计时长度 TIM3->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM3->CCER|=(<<); //CH3使能输出
TIM3->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH4-------------------------------------------------------------------*/
#if(PWM3_CH4_EN==1)
void PWM3_CH4_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM3时钟 //下面为映射引脚配置
#if(TIM3_PWM_CH==0||TIM3_PWM_CH==2)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0XFFFFFF0F; //清除PB1之前配置位
GPIOB->CRL|=0X000000B0; //配置PB1为复用推挽输出
#endif #if(TIM3_PWM_CH==3)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOC和AFIO时钟
GPIOC->CRH&=0XFFFFFF0F; //清除PC9之前配置位
GPIOC->CRH|=0X000000B0; //配置PC9为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM3_PWM_CH<<); //定义引脚重映射,设置PWM3相应引脚 TIM3->CR1|=(<<); //使能自动重装寄存器 TIM3->PSC|=(TIM3_PWM_PSC); //设置预分频值
TIM3->ARR&=0X00; //清除ARR之前配置
TIM3->ARR|=TIM3_PWM_ARR; //设置ARR为TIM3_ARR TIM3->CCR4&=0x00;
TIM3->CCR4|=TIM3_CH4_CCR4; //设置翻转周期计时长度 TIM3->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM3->CCER|=(<<); //CH3使能输出
TIM3->CR1|=(<<); //开始计数
}
#endif /*###############################下面为TIM4实现PWM##################################################*/
/*--------------------------------PWM_CH1-----------------------------------------------------------*/
#if(PWM4_CH1_EN==1)
void PWM4_CH1_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM4时钟 //下面为映射引脚配置
#if(TIM4_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0XF0FFFFFF; //清除PB6之前配置位
GPIOB->CRL|=0X0B000000; //配置PB6为复用推挽输出
#endif #if(TIM4_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOD和AFIO时钟
GPIOD->CRH&=0XFFF0FFFF; //清除PD12之前配置位
GPIOD->CRH|=0X000B0000; //配置PD12为复用推挽输出
#endif //下面为寄存器配置
AFIO->MAPR|=(TIM4_PWM_CH<<); //定义引脚重映射,设置PWM4相应引脚 TIM4->CR1|=(<<); //使能自动重装寄存器 TIM4->PSC|=(TIM4_PWM_PSC); //设置预分频值
TIM4->ARR&=0X00; //清除ARR之前配置
TIM4->ARR|=TIM4_PWM_ARR; //设置ARR为TIM4_ARR TIM4->CCR1&=0x00;
TIM4->CCR1|=TIM4_CH1_CCR1; //设置翻转周期计时长度 TIM4->CCMR1|=(<<)|(<<); //使能CH1和设置CH1为模式1
TIM4->CCER|=(<<); //CH1使能输出
TIM4->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH2-------------------------------------------------------------------*/
#if(PWM4_CH2_EN==1)
void PWM4_CH2_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM1时钟 //下面为映射引脚配置
#if(TIM4_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRL&=0X0FFFFFFF; //清除PB7之前配置位
GPIOB->CRL|=0XB0000000; //配置PB7为复用推挽输出
#endif #if(TIM4_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOD和AFIO时钟
GPIOD->CRH&=0XFF0FFFFF; //清除PD13之前配置位
GPIOD->CRH|=0X00B00000; //配置PD13为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM4_PWM_CH<<); //定义引脚重映射,设置PWM4相应引脚 TIM4->CR1|=(<<); //使能自动重装寄存器 TIM4->PSC|=(TIM4_PWM_PSC); //设置预分频值
TIM4->ARR&=0X00; //清除ARR之前配置
TIM4->ARR|=TIM4_PWM_ARR; //设置ARR为TIM4_ARR TIM4->CCR2&=0x00;
TIM4->CCR2|=TIM4_CH2_CCR2; //设置翻转周期计时长度 TIM4->CCMR1|=(<<)|(<<); //使能CH2和设置CH2为模式1
TIM4->CCER|=(<<); //CH2使能输出
TIM4->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH3-------------------------------------------------------------------*/
#if(PWM4_CH3_EN==1)
void PWM4_CH3_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM4时钟 //下面为映射引脚配置
#if(TIM4_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRH&=0XFFFFFFF0; //清除PB8之前配置位
GPIOB->CRH|=0X0000000B; //配置PB8为复用推挽输出
#endif #if(TIM4_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOC和AFIO时钟
GPIOD->CRH&=0XF0FFFFFF; //清除PD14之前配置位
GPIOD->CRH|=0X0B00000F; //配置PD14为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM4_PWM_CH<<); //定义引脚重映射,设置PWM4相应引脚 TIM4->CR1|=(<<); //使能自动重装寄存器 TIM4->PSC|=(TIM4_PWM_PSC); //设置预分频值
TIM4->ARR&=0X00; //清除ARR之前配置
TIM4->ARR|=TIM4_PWM_ARR; //设置ARR为TIM4_ARR TIM4->CCR3&=0x00;
TIM4->CCR3|=TIM4_CH3_CCR3; //设置翻转周期计时长度 TIM4->CCMR2|=(<<)|(<<); //使能CH3和设置CH3为模式1
TIM4->CCER|=(<<); //CH3使能输出
TIM4->CR1|=(<<); //开始计数 }
#endif
/*-----------------------------PWM_CH4-------------------------------------------------------------------*/
#if(PWM4_CH4_EN==1)
void PWM4_CH4_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM4时钟 //下面为映射引脚配置
#if(TIM3_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOB和AFIO时钟
GPIOB->CRH&=0XFFFFFF0F; //清除PB9之前配置位
GPIOB->CRH|=0X000000B0; //配置PB9为复用推挽输出
#endif #if(TIM4_PWM_CH==1)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOD和AFIO时钟
GPIOD->CRH&=0X0FFFFFFF; //清除PD15之前配置位
GPIOD->CRH|=0XB0000000; //配置PD15为复用推挽输出
#endif
//下面为寄存器配置
AFIO->MAPR|=(TIM4_PWM_CH<<); //定义引脚重映射,设置PWM4相应引脚 TIM4->CR1|=(<<); //使能自动重装寄存器 TIM4->PSC|=(TIM4_PWM_PSC); //设置预分频值
TIM4->ARR&=0X00; //清除ARR之前配置
TIM4->ARR|=TIM4_PWM_ARR; //设置ARR为TIM4_ARR TIM4->CCR4&=0x00;
TIM4->CCR4|=TIM4_CH4_CCR4; //设置翻转周期计时长度 TIM4->CCMR2|=(<<)|(<<); //使能CH4和设置CH4为模式1
TIM4->CCER|=(<<); //CH4使能输出
TIM4->CR1|=(<<); //开始计数
}
#endif
/*###############################下面为TIM5实现PWM##################################################*/
/*--------------------------------PWM_CH4-----------------------------------------------------------*/
#if(PWM5_CH4_EN==1)
void PWM5_CH4_Init(void)
{
RCC->APB1ENR|=(<<); //开启TIM5时钟 //下面为映射引脚配置
#if(TIM5_PWM_CH==0)
RCC->APB2ENR|=(<<)|(<<); //使能GPIOA和AFIO时钟
GPIOA->CRL&=0XFFFF0FFF; //清除PA3之前配置位
GPIOA->CRL|=0X0B00B000; //配置PA3为复用推挽输出
#endif //下面为寄存器配置
AFIO->MAPR|=(TIM5_PWM_CH<<); //定义引脚重映射,设置PWM5相应引脚 TIM5->CR1|=(<<); //使能自动重装寄存器 TIM5->PSC|=(TIM5_PWM_PSC); //设置预分频值
TIM5->ARR&=0X00; //清除ARR之前配置
TIM5->ARR|=TIM5_PWM_ARR; //设置ARR为TIM5_ARR TIM5->CCR1&=0x00;
TIM5->CCR1|=TIM5_CH4_CCR1; //设置翻转周期计时长度 TIM5->CCMR2|=(<<)|(<<); //使能CH4和设置CH4为模式1
TIM5->CCER|=(<<); //CH4使能输出
TIM5->CR1|=(<<); //开始计数
} #endif //FILE END
PWM of STM32的更多相关文章
- 【转载】 stm32之PWM
发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...
- STM32(7)——通用定时器PWM输出
1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种 ...
- STM32F103的11个定时器详解(转)
源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴 ...
- 016_STM32程序移植之_舵机
STM32程序移植之舵机PWM测试 接线图如下: STM32引脚 舵机引脚 功能 GND GND 正极电源 具体看舵机的额定电压 PA6 PWM引脚 STM32引脚 CH340引脚 GND GND 3 ...
- STM32之PWM君
PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总 ...
- STM32中的PWM的频率和占空比的设置
转于http://blog.csdn.net/liming0931/article/details/8491468 下面的这个是stm32的定时器逻辑图,上来有助于理解: TIM3的ARR寄存器和 ...
- STM32之PWM波形输出配置总结
一. TIMER分类: STM32中一共有11个定时器,其中TIM6.TIM7是基本定时器:TIM2.TIM3.TIM4.TIM5是通用定时器:TIM1和TIM8是高级定时器,以及2个看门狗定时器 ...
- 关于STM32 定时器 PWM 实时调节占空比时,预装载特性
最近在调试项目的时候遇到一个奇怪的现象:在调试状态下,给定时器捕获比较寄存器赋不同值,能产生不同占空比的波形(图1).反映到器件上也有不同的电压显示,但是在设备运行的时候,就不行了(图2). 图1 图 ...
- stm32之PWM
PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计 ...
随机推荐
- html初识form表单
定义和用法 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单用于向服务器传输数据.通过submit ...
- winform UI 设计方法
这里主要提供了一种设计思路,你可以将成套的UI图像添加或替换到本程序中.在设计过程中,还存在许多疏漏,懒得仔细修改了,在使用过程中自行修改添加.这里的函数基本上都可以单独使用,需要哪个将cs文件加入到 ...
- Python开发【第九篇】:进程、线程
什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于,程序是指令的集合,它是进程运行的静态描述文本 ...
- CentOS7+CDH5.14.0安装CDH错误排查:Hue错误: Load Balancer 该角色的进程启动失败
Hue错误: Load Balancer 该角色的进程启动失败 解决办法:主机能够联网情况下,直接运行如下命令即可在线安装openssl.httpd 需要提前安装环境 httpd, mod_ssl ...
- project3 blockchain
[概念] 做服务的时候main里面不能单独有东西,都得包起来. Identifier expected是因为没有main函数 雾草,task3还要加proxy, add再干别的.难受!妈的,什么代理模 ...
- inline, block, and inline-block
总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...
- 使用jconsole分析内存情况-JVM
JVM调优分析演练: Jconsole中对内存为如下结构: 原始代码: public static void main(String[] args) { BigInteger [] pArr=new ...
- Linux服务器上监控网络带宽的18个常用命令 zz
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
- 选择文件,显示其路径在ListBox控件里
private void btnSelect_Click(object sender, EventArgs e) { lbxFiles.Items.Clear(); ...
- HTML 中使用 JavaScript
在 HTML 中插入 JavaScript 的主要方法,就是使用 <script> 元素, 浏览器会解释并执行其中的 JavaScript 代码. <script> 元素的属 ...