/******************** (C) COPYRIGHT 2012 **************************
* 文件名 :main.c
* 描述 :定时器TIM3产生PWM波输出。
* - PA.06: (TIM3_CH1)
*
* 作者 :Orange
**********************************************************************************/
#include "stm32f10x.h"
#include "pwm_output.h"
/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
*/
int main(void)
{
/* TIM3 PWM波输出初始化,并使能TIM3 PWM输出 */
TIM3_PWM_Init();
/* TIM3 PWM输出占空比变化波中断配置*/
NVIC_Config();
while (1)
{}
}
/******************* (C) COPYRIGHT 2012 *****END OF FILE************/
/******************** (C) COPYRIGHT 2012 **************************
* 文件名 :pwm_output.c
* 描述 :
* 硬件连接:---------------------
* | PA.06: (TIM3_CH1) |
* ---------------------
* 库版本 :ST3.5.0
* 作者 :Orange
**********************************************************************************/
#include "pwm_output.h"
/*
* 函数名:TIM3_GPIO_Config
* 描述 :配置TIM3复用输出PWM时用到的I/O
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void TIM3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* TIM3 clock enable */
//PCLK1经过2倍频后作为TIM3的时钟源等于72MHz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* GPIOA and GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*GPIOA Configuration: TIM3 channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
* 函数名:TIM3_Mode_Config
* 描述 :配置TIM3输出的PWM信号的模式,如周期、极性、初始占空比
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void TIM3_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* PWM信号电平跳变值 */
u16 CCR1_Val = 1;
/* -----------------------------------------------------------------------
TIM3CLK = 72 MHz, Prescaler = 0x0, TIM3 counter clock = 72 MHz
TIM3 ARR Register = 199 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
TIM3 Frequency = 72 KHz.
TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)改变频率
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)改变占空比
----------------------------------------------------------------------- */
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 199; //当定时器从0计数到199,即为200次,为一个定时周期20ms 50Hz
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //设置预分频:72MHz/7200
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频。
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
//清除定时器中断标志
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//使能中断
TIM_Cmd(TIM3,ENABLE);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3重载寄存器ARR
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
/*
* 函数名:TIM3_PWM_Init
* 描述 :TIM3 占空比连续变化输出PWM波
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//选择TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_Init(&NVIC_InitStructure);
}
/*
* 函数名:TIM3_PWM_Init
* 描述 :TIM3 输出PWM信号初始化
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void TIM3_PWM_Init(void)
{
TIM3_GPIO_Config();
TIM3_Mode_Config();
}
/******************* (C) COPYRIGHT 2012 *****END OF FILE************/
/**********pwm_output.h头文件****************/
#ifndef __PWM_OUTPUT_H
#define __PWM_OUTPUT_H
#include "stm32f10x.h"
void TIM3_PWM_Init(void);
void NVIC_Config(void);
#endif /* __PWM_OUTPUT_H */
/**************中断函数***************/
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
/*m--;
if(m==0)//持续pwm波形输出1s
{
TIM_SetCompare1(TIM3,i++);
m=50;
}
if(i==20) 1000us-2000us
i=10; */
TIM_SetCompare1(TIM3,i++);
if(i==200)
i=0;
TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);//必须清除中断标志位否则一直中断
}
}
|