/******************************************************************************
* filename: pwm.c
* Description:
* Copyright: shanghai huibo, All rights reserved.
* Revision: v1.0
******************************************************************************/
#include "stm32f4xx.h"
#include "paradef.h"
#include "pwm.h"
void PwmInit(uint16_t ctrbit, uint32_t freq)
{
Tim1PwmInit(ctrbit, freq);
}
void PwmControl(uint16_t ctrbit, uint32_t freq)
{
Tim1PwmInit(ctrbit, freq);
}
void Tim1PwmInit(uint16_t ctrbit, uint32_t freq)
{
// TIM1: PE9 PE11 PE13 PE14
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14; 只取E9产生300K方波 汪 2018.08.16
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9, GPIO_AF_TIM1);
//GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1); 汪 2018.08.16
//GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1); 汪 2018.08.16
//GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1); 汪 2018.08.16
TIM_DeInit(TIM1);
uint32_t arr,ccr1,ccr2,ccr3,ccr4;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrecture;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
if(freq > 42000000) freq = 420000000;
arr = SystemCoreClock/(freq);
// 10K
ccr1 = (arr*9)/10; // Channel 00
ccr2 = (arr*9)/10; // Channel 01
ccr3 = (arr*9)/10; // Channel 02
ccr4 = (arr*9)/10; // Channel 03
TIM_TimeBaseInitStrecture.TIM_Period = arr -1;
TIM_TimeBaseInitStrecture.TIM_Prescaler = 0;
TIM_TimeBaseInitStrecture.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStrecture.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStrecture.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStrecture);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
if((ctrbit&BV(TIM1_CHANNEL1))!=0){
TIM_OCInitStructure.TIM_Pulse = ccr1;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
}
else{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}
if((ctrbit&BV(TIM1_CHANNEL2))!=0){
TIM_OCInitStructure.TIM_Pulse = ccr2;
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
}
else{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}
if((ctrbit&BV(TIM1_CHANNEL3))!=0){
TIM_OCInitStructure.TIM_Pulse = ccr3;
TIM_OC3Init(TIM1,&TIM_OCInitStructure);
}
else{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OC3Init(TIM1,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}
if((ctrbit&BV(TIM1_CHANNEL4))!=0){
TIM_OCInitStructure.TIM_Pulse = ccr4;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
}
else{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}