1. 程式人生 > >stm32f407之PWM(操作暫存器)

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)
  {
  };
}