国民技术N32G430开发笔记(6)- 通用定时器TIM2 pwm的输出

通用定时器TIM2 pwm的输出

1、tim2 为通用定时器,使用其通道3 产生一个pwm波形。
占空比50%,频率1KHZ。
通道3 对应的管脚为PA2.
在这里插入图片描述
管脚复用重映射

在这里插入图片描述
2、代码初始化
新增pwm.c pwm.h文件

pwm.c

#include "main.h"
#include "pwm.h"
#include "type.h"

static void time2_base_init(void)
{
    TIM_TimeBaseInitType TIM_TimeBaseStructure;
    TIM_Base_Struct_Initialize(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period    = 1000-1;
    TIM_TimeBaseStructure.Prescaler = 64-1;
    TIM_TimeBaseStructure.ClkDiv    = 0;
    TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;

    TIM_Base_Initialize(TIM2, &TIM_TimeBaseStructure);  
}

static void time2_pwm_config(void)
{
    OCInitType TIM_OCInitStructure;

    TIM_Output_Channel_Struct_Initialize(&TIM_OCInitStructure);

    /* Channel 1, 2 and 3 Configuration in PWM mode */
    TIM_OCInitStructure.OcMode       = TIM_OCMODE_PWM2;
    TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
    TIM_OCInitStructure.Pulse        = 500;
    TIM_OCInitStructure.OcPolarity   = TIM_OC_POLARITY_LOW;
    TIM_OCInitStructure.OcNPolarity  = TIM_OCN_POLARITY_LOW;
    TIM_OCInitStructure.OcIdleState  = TIM_OC_IDLE_STATE_SET;
    TIM_OCInitStructure.OcNIdleState = TIM_OCN_IDLE_STATE_RESET;


    TIM_Output_Channel3_Initialize(TIM2, &TIM_OCInitStructure);

    // TIM_OCInitStructure.Pulse        = 250;

    // TIM_Output_Channel2_Initialize(TIM2, &TIM_OCInitStructure);

}

static void time2_pwm_gpio_init(void)
{

    GPIO_InitType GPIO_InitStructure;

    GPIO_Structure_Initialize(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_4MA;

    /* TIM2 CH3 PA2 pins init */
    GPIO_InitStructure.Pin        = GPIO_PIN_2;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM2;
    GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);
    
    /* TIM2 CH3 PA1 pins init */
    // GPIO_InitStructure.Pin        = GPIO_PIN_1;
    // GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM2;
    // GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);
}

static MI_BOOL time2_pwm_rcc_init(void)
{
    uint32_t ADTIM_clock;

    RCC_ClocksType RCC_Clocks;

    RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);

    RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);
    
    //APB 高速(APB2)预分频器
    //由软件置位和清零,配置 APB2 时钟(PCLK2)的分频系数。需确保 PCLK2 不 超过 64MHz。
    //0xx:HCLK 不分频
    //100:HCLK 2 分频
    //101:HCLK 4 分频
    //110:HCLK 8 分频
    //111:HCLK 16 分频
   //RCC_Pclk1_Config(RCC_HCLK_DIV4);

    RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM2);
   


    return MI_TRUE;
}

static void tim2_interrupt_init(void)
{
    NVIC_InitType NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Initializes(&NVIC_InitStructure);
    TIM_Interrupt_Enable(TIM2, TIM_INT_UPDATE);
}

void tim2_pwm_init(void)
{
    time2_pwm_rcc_init();
    time2_pwm_gpio_init();
    time2_pwm_config();
    tim2_interrupt_init();
    time2_base_init();

    TIM_On(TIM2);
}

pwm.h

#ifndef __PWM_H__
#define __PWM_H__

void tim2_pwm_init(void);
#endif

main.c调用

在这里插入图片描述
3、产生的波形如图:
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32控制定时器TIM2输出PWM的代码示例: ```c #include "stm32f10x.h" void TIM2_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; GPIO_InitTypeDef GPIO_InitStruct; // 使能TIM2和GPIOA的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIOA的PA0引脚为GPIO输出模式 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置TIM2的基本参数 TIM_TimeBaseInitStruct.TIM_Period = 999; // PWM周期为1ms TIM_TimeBaseInitStruct.TIM_Prescaler = 719; // 时钟预分频为720,计数频率为100KHz TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); // 配置TIM2的PWM参数 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 500; // 占空比为50% TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStruct); // 启动TIM2 TIM_Cmd(TIM2, ENABLE); } int main(void) { TIM2_PWM_Init(); while (1) { // 无限循环,保持PWM输出 } } ``` 在上述代码中,我们首先定义了`TIM2_PWM_Init()`函数,该函数用于初始化定时器TIM2和GPIOA的配置,以便输出PWM信号。在该函数中,我们首先使能了TIM2和GPIOA的时钟,然后配置了GPIOA的PA0引脚为GPIO输出模式。 接下来,我们配置了TIM2的基本参数和PWM参数。其中,我们设置了PWM周期为1ms,时钟预分频为720,计数频率为100KHz,占空比为50%。最后,我们启动了定时器TIM2。 在主函数中,我们调用`TIM2_PWM_Init()`函数进行初始化,然后进入一个无限循环,以保持PWM输出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值