stm32寄存器版學習筆記05 PWM

来源:http://www.cnblogs.com/kuotian/archive/2016/07/01/5631652.html
-Advertisement-
Play Games

STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。 1.TIM1 CH1輸出PWM配置步驟 ①開啟TIM1時鐘,配置PA8為復用輸出 APB2外設時鐘使能寄存器(RCC_APB2ENR) APB1外設複位寄存器 ...


  STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。

1.TIM1 CH1輸出PWM配置步驟

①開啟TIM1時鐘,配置PA8為復用輸出

  APB2外設時鐘使能寄存器(RCC_APB2ENR)

  APB1外設複位寄存器 (RCC_APB1RSTR)

置1開啟。清0關閉。

  Eg:RCC->APB2ENR|=1<<11;  //使能TIM1時鐘

配置I/O口: 參見stm32寄存器版學習筆記01 GPIO口的配置

  Eg:GPIOA->CRH&=0XFFFFFFF0;  //PA8清除之前的設置

     GPIOA->CRH|=0X0000000B;  //PA8復用功能輸出

 

②設置TIM1的ARR和PSC

  自動重裝載寄存器(TIMx_ARR) 

  TIM1和TIM8預分頻器(TIMx_PSC)

 

③設置TIM1_CH1的PWM模式及通道方向

  TIM1和TIM8捕獲/比較模式寄存器1(TIMx_CCMR1)

 

 

 

 

 

 

 

 

  

 

 

  Eg:TIM1->CCMR1|= 7<<4;  //CH1 PWM2模式

     TIM1->CCMR1|= 1<<3;  //CH1預裝載使能

     CH1為輸出,CC1S[1:0] 預設為00.

 

④使能TIM1的CH1輸出,使能TIM1

設置TIM1_CCER來開啟TIM1的通道1的輸出。設置TIM1_CR1來開啟TIM1的時鐘。

  TIM1和TIM8捕獲/比較使能寄存器(TIMx_CCER)

  Eg:TIM1->CCER|= 1<<3;  //OC1輸出使能

  TIM1和TIM8控制寄存器1(TIMx_CR1)

ARPE:自動重裝載預裝載允許位  0:TIMx_ARR寄存器沒有緩衝; 1:TIMx_ARR寄存器被裝入緩衝器。

CEN:使能計數器  位0 0:禁止計數器; 1:使能計數器。

  Eg:TIM1->CR1=0x0080;  //ARPE使能

     TIM1->CR1|=0X01;  //使能定時器1

 

⑤設置MOE輸出,使能PWM輸出

  普通定時器在完成以上設置後可以輸出PWM,但高級定時器要使能剎車和死區寄存器。

  TIM1和TIM8剎車和死區寄存器(TIMx_BDTR)

  Eg:TIM1->BDTR|=1<<15;  //MOE主輸出使能

 

⑥修改TIM1_CCR1來控制占空比

  Eg:#define PWM_VAL TIM1->CCR1 (可以直接設置)

2.TIMx復用功能重印象

 

……

3.高級定時器TIM1輸出PWM應用

 1 //timer.c
 2 //TIM1_CH1 PWM輸出初始化
 3 //arr:自動重裝值
 4 //psc:時鐘預分頻數
 5 void TIM1_PWM_Init(u16 arr,u16 psc)
 6 {                              
 7     //此部分需手動修改IO口設置
 8     RCC->APB2ENR|=1<<11;     //TIM1時鐘使能    
 9     GPIOA->CRH&=0XFFFFFFF0;    //PA8清除之前的設置
10     GPIOA->CRH|=0X0000000B;    //復用功能輸出 
11     
12     TIM1->ARR=arr;            //設定計數器自動重裝值 
13     TIM1->PSC=psc;            //預分頻器設置
14   
15     TIM1->CCMR1|=7<<4;      //CH1 PWM2模式         
16     TIM1->CCMR1|=1<<3;         //CH1預裝載使能     
17      TIM1->CCER|=1<<0;       //OC1 輸出使能       
18     TIM1->BDTR|=1<<15;       //MOE 主輸出使能       
19 
20     TIM1->CR1=0x0080;       //ARPE使能 
21     TIM1->CR1|=0x01;        //使能定時器1                                           
22 }  
1 //timer.h
2 #ifndef __TIMER_H
3 #define __TIMER_H
4 #include "sys.h" 
5 //通過改變TIM1->CCR1的值來改變占空比,從而控制LED0的亮度
6 #define LED0_PWM_VAL TIM1->CCR1     
7 
8 void TIM1_PWM_Init(u16 arr,u16 psc);
9 #endif

 

4.普通定時器TIM2輸出2路PWM 應用

 1 //TIM2_CH3~4 PWM輸出初始化
 2 //arr:自動重裝值
 3 //psc:時鐘預分頻數
 4 void TIM2_PWM_Init(u16 arr,u16 psc)
 5 {                              
 6     //此部分需手動修改IO口設置
 7     RCC->APB1ENR|=1<<0;     //TIM2時鐘使能    
 8     GPIOA->CRL&=0XFFFF00FF;    //PA2-3清除之前的設置
 9     GPIOA->CRL|=0X0000BB00;    //復用功能輸出 
10     
11     TIM2->ARR=arr;            //設定計數器自動重裝值 
12     TIM2->PSC=psc;            //預分頻器設置
13   
14     
15     TIM2->CCMR2|=7<<4;      //CH3 PWM2模式(輸出)
16     TIM2->CCMR2|=1<<3;         //CH3預裝載使能
17     TIM2->CCER|=1<<8;       //OC3 輸出使能
18     
19     TIM2->CCMR2|=7<<12;      //CH4 PWM2模式(輸出)         
20     TIM2->CCMR2|=1<<11;     //CH4預裝載使能    
21     TIM2->CCER|=1<<12;       //OC4 輸出使能
22 
23     TIM2->CR1=0x0080;       //ARPE使能 
24     TIM2->CR1|=0x01;        //使能定時器2                                                       
25 }  
26 
27 
28 //設定占空比 duty<899
29 //設置多少就是多少低的
30 void pwm_duty1(u16 duty)
31 {
32     
33     TIM2->CCR3=duty;
34 }
35 
36 void pwm_duty2(u16 duty)
37 {                      
38     TIM2->CCR4=duty;
39 }

 

5.普通定時器TIM3輸出2路PWM 應用

 1 //timer.c
 2 //TIM3_CH1~2 PWM輸出初始化
 3 //arr:自動重裝值
 4 //psc:時鐘預分頻數
 5 void TIM3_PWM_Init(u16 arr,u16 psc)
 6 {                              
 7     //此部分需手動修改IO口設置
 8     RCC->APB1ENR|=1<<1;     //TIM3時鐘使能    
 9     GPIOA->CRL&=0X00FFFFFF;    //PA6-7清除之前的設置
10     GPIOA->CRL|=0XBB000000;    //復用功能輸出 
11     
12     TIM3->ARR=arr;            //設定計數器自動重裝值 
13     TIM3->PSC=psc;            //預分頻器設置
14     
15     TIM3->CCMR1|=7<<4;      //CH1 PWM2模式(輸出)
16     TIM3->CCMR1|=1<<3;         //CH1預裝載使能
17     TIM3->CCER|=1<<0;       //OC1 輸出使能
18     
19     TIM3->CCMR1|=7<<12;      //CH2 PWM2模式(輸出)         
20     TIM3->CCMR1|=1<<11;     //CH2預裝載使能    
21     TIM3->CCER|=1<<4;       //OC2 輸出使能
22 
23     TIM3->CR1=0x0080;       //ARPE使能 
24     TIM3->CR1|=0x01;        //使能定時器3                                                       
25 } 
26 void pwm_duty3(u16 duty)
27 {
28     
29     PWM3_PWM_VAL=duty;
30 }
31 
32 void pwm_duty4(u16 duty)
33 {                      
34     PWM4_PWM_VAL=duty;
35 }
36 
37 //timer.h
38 #define PWM3_PWM_VAL TIM3->CCR1
39 #define PWM4_PWM_VAL TIM3->CCR2

 

切記在主函數前添加輸出化函數!

Eg:TIM2_PWM_Init(899,0);//不分頻。PWM頻率=72000/(899+1)=80Khz 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • http://www.postgresonline.com/journal/archives/131-Using-Recursive-Common-table-expressions-to-represent-Tree-structures.html Tree Problem and was bas ...
  • 幾個重要概念 Slab memcached通過slab機制進行記憶體的分配和回收,slab是一個記憶體塊,它是memcached一次申請記憶體的最小單位,。在啟動memcached的時候一般會使用參數-m指定其可用記憶體,但是並不是在啟動的那一刻所有的記憶體就全部分配出去了,只有在需要的時候才會去申請,而且每 ...
  • 本文轉自http://www.cnblogs.com/yunf/archive/2011/04/12/2013448.html,在此感謝作者yfProgramer。 對於我這種剛學mysql的,還是十分有用的。 雖然現在mysql已經可以利用workbench直接創建資料庫了,但是開頭的對庫和表的增 ...
  • 好久不寫文,最近得空寫一點。Oracle資料庫國內用戶量主要在企業上,其中有一種byte的存儲稱為Blob,並不能直接看。 有時候為了調試需要,可以通過: 這種sql去轉為字元串查看,但是不方便,一次最多轉出2000個位元組。需要通過index拼成完整的文本。 另外一種情況下,如果存儲的是圖片、wor ...
  • 安裝好MySQL以後,系統給了個預設的的密碼,然後說如果忘記了預設的密碼。。。。。。我複製了預設密碼就走過了只一步,這一步就是我漫長旅程的開始。他給的密碼太複雜了,當然我得換一個,而且我還要假裝我不記得密碼了,就這樣我走上了不歸路。。。。。。 這個過程是心酸的,網上的資料多如狗,關鍵是各有各的錯法, ...
  • 當我談論索引時,大家經常會問我在複合非聚集索引里,列的順序是否重要?簡單來說:“看情況”。我們來具體看下為啥“看情況”…… 單例查找(Singleton Lookups) 當在你的表上有進行單例查找的查詢時,在複合非聚集索引里列的順序真的不重要。假設下列查詢: 現在你可以在StateProvince ...
  • 聲明:以下的代碼成果,是參考了網上的injso技術,文章最後會給出地址。 另外一個,injso文章中的代碼實際上不能夠運行起來的,後面出現的代碼都是經過我個人修改和檢測的。 最近因為在學習一些調試的技術,但是很少有提到如何在函數運行時實現函數替換的。 為什麼會想到這一點?因為在學習調試時,難免會看到 ...
  • call和jmp都是跳轉指令,但是call的同時會把pc地址壓入堆棧,並且這兩種方式都有遠和近跳轉。下麵的分析不全,因為沒有在網上找到足夠的資料,個人創造這個情景還是有些困難。 1.例子中的call的機器碼為0xe8。 0x400204ba <+30>: e8 41 b6 05 00 call 0x ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...