Timer.c
#include "Timer.h"
#include "Led.h"
void tst_TIMER_Pulse_Init(void)
{
//定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitData;
//NVIC中断控制器
NVIC_InitTypeDef NVIC_InitData;
//开启定时器时钟, 即内部时钟 CK_INT=72M
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//Configures the TIM2 internal Clock
TIM_InternalClockConfig(TIM2);
/*Config TIM2*/
//时钟分频因子 ,基本定时器没有
TIM_TimeBaseInitData.TIM_ClockDivision = TIM_CKD_DIV1;
//配置模式为向上计数模式
TIM_TimeBaseInitData.TIM_CounterMode = TIM_CounterMode_Up;
/*Prescaler, Period is uint16_t, Be careful!
* Tout = 36000 * 2000 / 72000000 = 1s
*
*/
TIM_TimeBaseInitData.TIM_Prescaler = 36000 - 1;
//自动重装载寄存器周的值 (计数值)
TIM_TimeBaseInitData.TIM_Period = 2000 - 1;
// 重复计数器的值,基本定时器没有
TIM_TimeBaseInitData.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitData);
// 清除计数器中断标志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
// 开启计数器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/*Config INTE*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitData.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitData.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitData.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitData.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitData);
/*START*/
TIM_Cmd(TIM2, ENABLE);
}
//定时器中断服务函数
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
//Clear flag
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//
tst_LED_Toggle();
}
}
Timer.h
#ifndef _TIMER_H
#define _TIMER_H
//
#include "main.h"
//
void tst_TIMER_Pulse_Init(void);
void tst_TIMER_PWM_Init(void);
//
#endif
PWM.c
#include "PWM.h"
//PWM GPIO PA6,PA7,PB0,PB1
void tst_TIMER_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitData;
//TIM基本定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseData;
//TIMinit_struct
TIM_OCInitTypeDef TIM_OCInitData;
uint16_t CCR1_Val = 500;
uint16_t CCR2_Val = 400;
uint16_t CCR3_Val = 300;
uint16_t CCR4_Val = 200;
uint16_t PrescalerValue = 0;
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* GPIOA and GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
/* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
GPIO_InitData.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitData.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitData.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitData);
GPIO_InitData.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitData);
/* Compute the prescaler value */
/* - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 */
//PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
/*
The TIM3 is running at 36 KHz:
TIM3 Frequency = TIM3 counter clock/(ARR + 1)
= 24 MHz / 666 = 36 KHz
*/
TIM_TimeBaseData.TIM_Period = 2000-1;
TIM_TimeBaseData.TIM_Prescaler = 72-1;
TIM_TimeBaseData.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseData.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseData);
/* PWM1 Mode configuration: Channel1 */
/*
The TIM3 CCR1 register value is equal to 333,
so the TIM3 Channel 1 generates a PWM signal with a frequency
equal to 36 KHz and a duty cycle equal to 50%:
TIM3_ARR = 665;
TIM3 Channel1 duty cycle = (TIM3_CCR1/ (TIM3_ARR + 1))* 100 = 50%
*/
TIM_OCStructInit(&TIM_OCInitData);
/* PWM1 Mode configuration: Channel1 */
//Specifies the TIM mode.
TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
//Specifies the TIM Output Compare state.
TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
//Specifies the output polarity.
TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
//Specifies the pulse value to be loaded into the Capture Compare Register.
TIM_OCInitData.TIM_Pulse = CCR1_Val;
//Initializes the TIMx Channel1 according to the specified
TIM_OC1Init(TIM3, &TIM_OCInitData);
//Enables or disables the TIMx peripheral Preload register on CCR1.
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitData.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM3, &TIM_OCInitData);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitData.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM3, &TIM_OCInitData);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitData.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitData.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitData.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitData.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitData);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
//TIM_ARRPreloadConfig(TIM3, ENABLE);
//TIM_CtrlPWMOutputs(TIM3,ENABLE);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
}
PWM.h
#ifndef _PWM_H_
#define _PWM_H_
#include "main.h"
void tst_TIMER_PWM_Init(void);
#endif