这是PWM.h头文件
#ifndef ___PWM__h_____
#define ____PWM_h_____
void PWM_init_TIM3_3();
void setcompare_TIM3_3(uint16_t compare);
void PWM_init_TIM3_4();
void setcompare_TIM3_4(uint16_t compare);
void PWM_init_TIM4_1();
void setcompare_TIM4_1(uint16_t compare);
#endif
下面这是PWM.c文件代码
代码中只用到了TIM3的3通道和4通道,以及TIM4的1通道,想用其他通用定时器的其他通道可以在本代码的基础上小改一下
#include "stm32f10x.h"
void PWM_init_TIM3_3() //TIM3的通道3输出PWM,分辨率1/100
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TM3外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //用AFIO映射TIM3
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //要用复用推挽模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //配置GPIOB
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //将TIM3映射到GPIO口,是部分映射
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100-1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=80; //频率=72MHz/(PSC+1)/(ARR+1)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //配置TIM3时基单元
TIM_InternalClockConfig(TIM3); //用内部时钟模式
TIM_OCInitTypeDef TIM_OCInitStructure; //配置TIM3的输出
TIM_OCStructInit(&TIM_OCInitStructure); //用这个结构体配置不需要用到的部分
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=50; //CCR
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //占空比=CCR/(ARR+1)
//分辨率=1/(ARR+1)
//PWM频率和时钟频率一致
TIM_Cmd(TIM3, ENABLE);
}
void PWM_init_TIM3_4() //用TIM3的通道4输出PWM,分辨率1/100
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TM3外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //用AFIO映射TIM3
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //要用复用推挽模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //配置GPIOB
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //将TIM3映射到GPIO口,是部分映射
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100-1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=50; //频率=72MHz/(PSC+1)/(ARR+1)
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //配置TIM3时基单元
TIM_InternalClockConfig(TIM3); //用内部时钟模式
TIM_OCInitTypeDef TIM_OCInitStructure; //配置TIM3的输出
TIM_OCStructInit(&TIM_OCInitStructure); //用这个结构体配置不需要用到的部分
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //一定要设置成这个模式
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=50; //CCR
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //占空比=CCR/(ARR+1)
//分辨率=1/(ARR+1)
//PWM频率和时钟频率一致
TIM_Cmd(TIM3, ENABLE);
}
void PWM_init_TIM4_1() //用TIM4的1通道输出PWM,分辨率1/1000
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100-1;
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);
TIM_InternalClockConfig(TIM4);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=50;
TIM_OC1Init(TIM4,&TIM_OCInitStructure);
TIM_Cmd(TIM4, ENABLE);
}
void setcompare_TIM3_3(uint16_t compare)
{
TIM_SetCompare3(TIM3,compare); //更改TIM3_Pulse的值来改变占空比
}
void setcompare_TIM3_4(uint16_t compare)
{
TIM_SetCompare4(TIM3,compare); //更改TIM3_Pulse的值来改变占空比
}
void setcompare_TIM4_1(uint16_t compare)
{
TIM_SetCompare1(TIM4,compare);
}
下面这是主函数main.c的例程
#include "stm32f10x.h"
#include "PWM.h"
#include "Delay.h"
#include "OLED.h"
uint8_t i=0;
int main()
{
PWM_init_TIM3_3();
PWM_init_TIM3_4();
PWM_init_TIM4_1();
while(1)
{
//以下这些代码的效果是:在对应的引脚插上LED正极后会呈现呼吸灯的效果。
//此处例程用的引脚是GPIOB0、GPIOB1
for(i=0;i<=100;i++)
{
setcompare_TIM3_3(uint16_t compare);
setcompare_TIM3_4(uint16_t compare);
Delay_ms(50);
}
for(i=100;i>0;i--)
{
setcompare_TIM3_3(uint16_t compare);
setcompare_TIM3_3(uint16_t compare);
Delay_ms(50);
}
}
}