stm32f407之PWM(操作寄存器)

PWM

         脉宽调制模式可以生成一个由TIMx_ARR寄存器的值确定频率和TIMx_CCRx寄存器的值确定占空比的信号。

         可以对每个通道独立选择PWM模式,( OCx输出一个PWM信号)在TIMx_CCMRx寄存器的OCxM位写110(PWM模式1)或111(PWM模式2)。必须通过设置TIMx_CCMRx寄存器的OCxPE位,启用相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

       仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。

        OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。TIMx_CCER寄存器中的CCxE位控制OCx输出使能。详见TIMx_CCERx寄存器的描述。

 

 

 

配置步骤:

1.     使能相关时钟。

2.     配置相关的引脚模式、速度、以及复用功能。

3.     使能TIM时钟

4.     设置分频。

5.     设置周期。(ARR的值)周期=(PSC+1)* ARR / TIMx时钟

6.     产生一次更新事件,更新影子寄存器的值。

7.     在CCMR中设置PWM模式。

8.     设置各通道占空比。占空比= CCRx / ARR。

9.     使能比较输出。

10.  启动预装载。

11.  打开定时器。



程序:

/************************************
    标题:输出4路PWM
    软件平台:IAR for ARM6.21
    硬件平台:stm32f4-discovery
    主频:168M
    
    author:小船
    data:2012-02-08
*************************************/

#include <stm32f4xx.h> 

void main ()
{   

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1
  
  RCC->AHB1ENR |= (1<<2); //打开GPIOC时钟
  GPIOC->MODER |= 0X000AA000;//pc6789第二功能
        //推挽输出
  GPIOC->OSPEEDR |= 0x000ff000;//速度100m
  GPIOC->PUPDR |= 0x00055000;//上拉  
  
  GPIOC->AFR[0] |= 0x22000000;//pc6789第二功能AF2
  GPIOC->AFR[1] |= 0x00000022;
  
  RCC->APB1ENR |= (1<<1); //打开TIM3时钟
  TIM3->PSC = 83; //对时钟84M进行84分频,使得计数频率为1M
  TIM3->ARR = 10000;  //周期10ms
  TIM3->EGR |= 1; //产生一次更新事件
  
  TIM3->CCMR1 |= 0x6060;//PWM模式1
  TIM3->CCMR2 |= 0x6060;//PWM模式1
  
  TIM3->CCR1 = 8000;//设置第一通道占空比80%
  TIM3->CCR2 = 6000;//设置第二通道占空比60%
  TIM3->CCR3 = 4000; //设置第三通道占空比40%
  TIM3->CCR4 = 2000; //设置第四通道占空比20%
  
  TIM3->CCER |= 0x1111;//使能比较输出
  
  TIM3->CCMR1 |= 0x0808;//启动预装载
  TIM3->CCMR2 |= 0x0808;
  
  TIM3->CR1 |= 1; //开始计时

  while(1)
  {
  };
}



好的,关于 stm32f407 定时器 PWM 配置,可以按照以下步骤进行: 1. 配置定时器的时钟源和分频系数,使得定时器的时钟频率为所需的 PWM 频率的若干倍。 2. 配置定时器的自动重载寄存器 ARR,使得定时器的周期为所需的 PWM 周期。 3. 配置定时器的占空比调节寄存器 CCRx,使得 PWM 的占空比符合要求。 4. 配置 GPIO 的复用功能,将对应的引脚设置为定时器输出通道。 具体实现可以参考以下代码: ```c // 定义定时器句柄 TIM_HandleTypeDef htim; // 定义 GPIO 初始化结构体 GPIO_InitTypeDef GPIO_InitStruct; // 定义定时器初始化结构体 TIM_OC_InitTypeDef sConfigOC; // 配置定时器时钟源和分频系数 htim.Instance = TIMx; htim.Init.Prescaler = (uint32_t)(SystemCoreClock / PWM_FREQ / PWM_RESOLUTION) - 1; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = PWM_RESOLUTION - 1; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_PWM_Init(&htim) != HAL_OK) { Error_Handler(); } // 配置定时器占空比调节寄存器 CCRx sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_x) != HAL_OK) { Error_Handler(); } // 配置 GPIO 的复用功能 GPIO_InitStruct.Pin = GPIO_PIN_x; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF_TIMx; HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); // 启动定时器 PWM 输出 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_x); ``` 其中,`PWM_FREQ` 表示所需的 PWM 频率,`PWM_RESOLUTION` 表示 PWM 的分辨率,`TIMx` 表示使用的定时器编号,`TIM_CHANNEL_x` 表示使用的定时器输出通道编号,`GPIO_PIN_x` 表示使用的 GPIO 引脚编号,`GPIOx` 表示使用的 GPIO 端口编号,`GPIO_AF_TIMx` 表示 GPIO 复用功能使用的定时器编号。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值