STM32F10xxx参考手册–119页
#include "pwm.h"
/*******************************************************************************
* 函 数 名 : TIM3_CH2_PWM_Init
* 函数功能 : TIM3通道2 PWM初始化函数
* 输 入 : per:重装载值
psc:分频系数
* 输 出 : 无
*******************************************************************************/
void TIM3_CH2_PWM_Init(u16 per,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//改变指定管脚的映射,TIM3_CH2--->> PB5
TIM_TimeBaseInitStructure.TIM_Period = per;//自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC2Init(TIM3,&TIM_OCInitStructure);//输出比较通道2初始化
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR2 上的预装载寄存器
TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器
TIM_Cmd(TIM3,ENABLE);//使能定时器
}
void TIM4_CH3_PWM_Init(u16 per,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);//改变指定管脚的映射,TIM3_CH2->>本来就是TIM4_REMAP = 0,所以重映射默认就是PB8,如果设置以后就变成PD14
TIM_TimeBaseInitStructure.TIM_Period = per;//自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC3Init(TIM4,&TIM_OCInitStructure);//输出比较通道2初始化
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable); //使能TIMx在 CCR2 上的预装载寄存器
TIM_ARRPreloadConfig(TIM4,ENABLE);//使能预装载寄存器
TIM_Cmd(TIM4,ENABLE);//使能定时器
}
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
#include "time.h"
#include "pwm.h"
int main()
{
u16 i=0;
u8 fx=0;
SysTick_Init(72);//Tclk=72
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组 分 2 组
LED_Init();
BEEP_Init();
// TIM3_CH2_PWM_Init(500,72-1);//定时500us,Tout= ((per)*(psc+1))/Tclk=(500*72)/72000000=5/100000s=500us
TIM4_CH3_PWM_Init(1000,72-1);
while(1)
{
if(fx==0)
{
i++;
if(i==500)
{
fx=1;
}
}
else
{
i--;
if(i==0)
{
fx=0;
}
}
//TIM_SetCompare2(TIM3,i);//i值最大可以取499,因为ARR最大值是499.
TIM_SetCompare3(TIM4,i);
delay_ms(10);
}
}
//GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
//改变指定管脚的映射,TIM3_CH2->>本来就是TIM4_REMAP = 0,所以重映射默认就是PB8,如果设置以后就变成PD14