STM32F030CT86 定时器3通道1来验证PWM前后切模式

一、相关结构体定义

typedef enum
{
    DIMMER_PWM_CHN1 = 0,
    DIMMER_PWM_CHN2,
    DIMMER_PWM_CHN3,
    DIMMER_PWM_CHN4,
    DIMMER_PWM_CHN5,
    DIMMER_PWM_CHN6,
    DIMMER_CHN_NUM,
}EM_DIMMER_CHx_INDEX;


typedef struct {
    GPIO_TypeDef* GPIOx;
    uint16_t GPIO_Pin;
}DIMMER_STATUS_CONFIG_TABLE;  

typedef struct {
    TIM_TypeDef *TIMx;
    EM_DIMMER_CHx_INDEX PWM_CHx;
}DIMMER_CHx_CONFIG_TABLE; 

typedef struct {
    GPIO_TypeDef* GPIOx;
    uint16_t GPIO_Pin;
    uint8_t  GPIO_PinSourcex;
    uint8_t  GPIO_AF_x;
}DIMMER_IO_CONFIG_TABLE;   

typedef struct {
    TIM_TypeDef *TIMx;
    uint32_t  RCC_APBxPeriph_TIMx;
}DIMMER_TIM_CONFIG_TABLE;

 

二、PWM初始化 配置频率为 f=100Hz,分频系数为psc=4799。

const DIMMER_CHx_CONFIG_TABLE dimmer_config_table[] = 
{    
       {TIM3, DIMMER_PWM_CHN1},   
};

/*
#define GPIO_AF_1            ((uint8_t)0x01)  USART2, CEC, TIM3, USART1, IR_OUT,
                                                EVENTOUT, I2C1, I2C2, TIM15 

*/
const DIMMER_IO_CONFIG_TABLE dimmer_io_config_table[] = 
{       
    {GPIOB, GPIO_Pin_4, GPIO_PinSource4, GPIO_AF_1},//PB4
    
};

const DIMMER_TIM_CONFIG_TABLE dimmer_timer_config_table[] = 
{
    {TIM3, RCC_APB1Periph_TIM3},  
};

void pwm_init(void)
{
    uint8_t chn = 0;
    uint16_t ARR_value = 0;
    uint16_t CCR_value = 0;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* GPIOA, GPIOB and GPIOE Clocks enable */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    
    for(chn = 0; chn < (sizeof(dimmer_io_config_table)/sizeof(dimmer_io_config_table[0])); chn++) {    
        GPIO_PinAFConfig(dimmer_io_config_table[chn].GPIOx, dimmer_io_config_table[chn].GPIO_PinSourcex, dimmer_io_config_table[chn].GPIO_AF_x); 
        GPIO_InitStructure.GPIO_Pin = dimmer_io_config_table[chn].GPIO_Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;                
        GPIO_Init(dimmer_io_config_table[chn].GPIOx, &GPIO_InitStructure);        
    }

    for (chn = 0; chn <(sizeof(dimmer_timer_config_table)/sizeof(dimmer_timer_config_table[0])); chn++) {

        //TODO
        /* Compute the value to be set in ARR regiter to generate signal frequency at 17.57 Khz */
          ARR_value = 99;
          /* Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N */
          CCR_value = 0;

          /* timer clock enable */
          if (dimmer_timer_config_table[chn].TIMx == TIM3) {
               RCC_APB1PeriphClockCmd(dimmer_timer_config_table[chn].RCC_APBxPeriph_TIMx, ENABLE);
          }

        /* timer Base configuration */
          TIM_TimeBaseStructure.TIM_Prescaler = 4799;                     
          TIM_TimeBaseStructure.TIM_ClockDivision = 0;
          TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
          TIM_TimeBaseStructure.TIM_Period = ARR_value; 
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
          TIM_TimeBaseInit(dimmer_timer_config_table[chn].TIMx, &TIM_TimeBaseStructure);
        TIM_ARRPreloadConfig(dimmer_timer_config_table[chn].TIMx, ENABLE);
        
        /*    LPC前切   TPC后切 默认后切
            TPC配置:TIM_OCMode_PWM1, TIM_OCPolarity_High
            LPC配置:TIM_OCMode_PWM2, TIM_OCPolarity_High
        */    
          TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
          TIM_OCInitStructure.TIM_Pulse = CCR_value;
          TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
          TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;        
          TIM_OC1Init(dimmer_timer_config_table[chn].TIMx, &TIM_OCInitStructure);
          TIM_OC1PreloadConfig(dimmer_timer_config_table[chn].TIMx, ENABLE);
                    
          /* TIM1 Main Output Enable */
          TIM_CtrlPWMOutputs(dimmer_timer_config_table[chn].TIMx, ENABLE);

          /* TIM1 counter enable */
          TIM_Cmd(dimmer_timer_config_table[chn].TIMx, ENABLE);
    }    
}

三、主程序调用一直循环调用处理

void test_real_time(void)
{        
    TIM_SetCompare1(TIM3, 30);       
}

四、 前后切模式配置注意点

LPC前切   TPC后切 默认后切
TPC配置:TIM_OCMode_PWM1, TIM_OCPolarity_High
LPC配置:TIM_OCMode_PWM2, TIM_OCPolarity_High

五、波形示例,验证成功。

STM32F030CT86 定时器3通道1来验证PWM前后切模式