STM32--寄存器與標準庫函數--通用定時器--輸出比較(PWM生成)

目錄

前言

通用定時器類型

? ? ? ? 向上計數、向下計數、中心對齊

輸入捕獲與輸出比較概念

輸出比較典型例子:驅動舵機旋轉

通用定時器的輸出比較庫函數

代碼

通用定時器的輸出比較寄存器操作

代碼

這里提供數據手冊的寄存器

后言


前言

使用平臺:STM32F407ZET6

使用數據手冊:STM32F407數據手冊.pdf

使用參考手冊:STM32F4xx參考手冊(中文).pdf

使用cortex-M手冊:Cortex M3與M4權威指南.pdf

對于STM32F407微處理器而言,內部一共集成了14個定時器,其中有2個基本定時器(TIM6和TIM7)、10個通用定時器(TIM2~TIM5、TIM9~TIM14)、2個高級定時器(TIM1和TIM8)。

通用定時器類型

? ? ? ? 通用定時器相對于基本定時器增加了輸入捕獲與輸出比較功能。

可以確定,遞增計數是所有定時器通用的,保險起見,整體設置為遞增計數可以提高通用性。

? ? ? ? 向上計數、向下計數、中心對齊

STM32F407ZET6一共提供10個通用定時器(TIM2~TIM5、TIM9~TIM14),TIM2和TIM5是32bit定時器,其他的定時器都是16bit定時器。TIM2~TIM5的計數方式有三種可以選擇,分別為遞增計數、遞減計數、遞增/遞減計數。

遞增計數:計數器從 0 計數到自動重載值(TIMx_ARR 寄存器的內容),然后重新從 0 開始計數并生成計數器上溢事件。

遞減計數:計數器從自動重載值(TIMx_ARR 寄存器的內容)開始遞減計數到 0,然后重新從自動重載值開始計數并生成計數器下溢事件。

中心對齊:計數器從 0 開始計數到自動重載值(TIMx_ARR 寄存器的內容)- 1,生成計數器上溢事件;然后從自動重載值開始向下計數到 1 并生成計數器下溢事件。之后從 0 開始重新計數。

對于通用定時器TIM2~TIM5,都掛載在APB1外設總線下,定時器的頻率為84MHZ,對于TIM12~TIM14都掛載在APB1外設總線下,定時器的頻率為84MHZ,TIM9~TIM11是掛載在APB2總線下,所以定時器的頻率為168MHZ,如下圖

輸入捕獲與輸出比較概念

輸入捕獲:可以把定時器的某個通道連接到GPIO引腳上,然后從外部輸入脈沖信號,經過通道的濾波以及邊沿檢測之后,可以記錄某個電平信號的脈沖寬度以及周期。

輸出比較:可以把定時器的某個通道連接到GPIO引腳上,主動從引腳輸出一個固定的脈沖,原理很簡單,其實就是計數器(TIM_CNT)如果超過比較寄存器(CCR)中的值,就可以輸出一個電平信號(高電平或者低電平)。

對于TIM9~TIM14而言,也可以進行定時功能,同樣也具有輸入捕獲以及輸出比較功能,但是只能采用向上計數的方式,并且相比于TIM2~TIM5,只有2個獨立通道。

輸出比較典型例子:驅動舵機旋轉

? ? ? ? 驅動舵機旋轉需要調制PWM,PWM技術的關鍵參數有兩個,一個是頻率,一個是占空比。頻率指的是利用STM32的定時器通道輸出脈沖的次數。占空比是指在一個脈沖周期中通電時間相對于總時間所占的比例,也可以簡單理解為一個周期內高電平持續時間相對于總時間所占的比例(%

????????舵機(Servo Motor)是一種集成了電機、減速齒輪組、控制電路和位置反饋系統的微型伺服裝置,可通過接收外部控制信號實現高精度角度定位。與傳統電機不同,舵機無需持續旋轉,而是通過內置電位器或編碼器實時檢測輸出軸角度,形成閉環控制,從而精準到達指定位置并保持力矩。

????????一般180°控制旋轉的舵機,驅動的PWM參數:

通用定時器的輸出比較庫函數

代碼

本質調用了如下函數可以實現輸出比較功能

RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) 
RCC_AHBxPeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);GPIO_Init(GPIOx, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_TIMx);TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct);
TIM_OCxInit(TIMx, &TIM_OCInitStruct);TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE); 
TIM_ARRPreloadConfig(TIMx, ENABLE);TIM_Cmd(ENABLE)

庫函數代碼:

PF9的TIM14通用定時器實現的PWM

/*** @brief PF9的TIM14通用定時器實現的PWM**/
void TimerCaptureOutputInit(void)
{/* 開啟GPIOF與TIM14的時鐘 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);/* 配置GPIO為AF復用功能 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOF, &GPIO_InitStruct);GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);/* 配置定時器的時基配置 20ms*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 2000 - 1;TIM_TimeBaseInitStruct.TIM_Prescaler = 840 - 1;TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);/* 配置輸出捕獲配置 */TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 1000;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM14, &TIM_OCInitStruct);TIM_ARRPreloadConfig(TIM14, ENABLE);TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);TIM_Cmd(TIM14, ENABLE);
}

通過操控CRR寄存器或者TIM_SetComparex函數

TIM_SetComparex(TIMx, Compare1)

或者

TIMx->CCRx = 1500;

通用定時器的輸出比較寄存器操作

代碼

/*** @brief 基本定時器TIM4 CH4 PB9*        PWM波生成*/
void TimerNormalTIM4_4RegisterInit(void)
{// 初始化時鐘RCC->AHB1ENR |= (1 << 1); // GPIOBRCC->APB1ENR |= (1 << 2); // TIM4// 對GPIOB的模式配置GPIOB->MODER &= ~(3 << (2 * 9));GPIOB->MODER |= (2 << (2 * 9)); //復用功能GPIOB->OSPEEDR |= (3 << (2 * 9));GPIOB->OTYPER &= ~(1 << 9); //推挽GPIOB->PUPDR &= ~(3 << 18); // 先清零GPIOB->PUPDR |= (1 << 18);  // 上拉(或 0 浮空,2 下拉)// 配置GPIOB與復用功能(TIM4_CH4)聯合GPIOB->AFR[1] &= ~(0xf << 4);GPIOB->AFR[1] |= (2 << 4); //綁定具體的復用功能 TIM4 CH4// 配置定時器參數TIM4->CR1 &= ~(1 << 0); // 關閉定時器/* 配置分頻系數等參數 */TIM4->ARR = 20000 - 1;TIM4->CNT = 0;TIM4->PSC = 84 - 1;TIM4->CCR4 = 1500 - 1;TIM4->CR1 |= (1 << 7);  // 自動重載預裝載值TIM4->CR1 &= ~(1 << 4); // 計數器向上計數TIM4->CCMR2 &= ~(7 << 12);TIM4->CCMR2 |= (6 << 12); // PWM模式1TIM4->CCMR2 |= (1 << 11); // 輸出比較4預裝載使能TIM4->CCER |= (1 << 12);  //使能通道CH4TIM4->DIER &= ~(1 << 0);  //未使用中斷,所以禁止中斷TIM4->EGR |= (1 << 0);  //TIM4->CR1 |= (1 << 0); // 開啟定時器
}

這里提供數據手冊的寄存器

GPIO的模式寄存器設置為復用功能模式

復用功能寄存器

此寄存器需要對照數據手冊

TIM的部分寄存器

控制寄存器

TIM捕獲/比較模式寄存器

TIM捕獲/比較使能寄存器

TIM事件生成寄存器

后言

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93012.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93012.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

91、23種設計模式

設計模式是軟件設計中反復出現的解決方案的模板&#xff0c;用于解決特定問題并提高代碼的可維護性、可擴展性和可復用性。23種經典設計模式可分為創建型、結構型和行為型三大類&#xff0c;以下是具體分類及模式概述&#xff1a; 一、創建型模式&#xff08;5種&#xff09; 關…

力扣(串聯所有單詞的子串)

串聯所有單詞的子串問題&#xff1a;多滑動窗口與哈希表的實戰應用。 一、題目分析&#xff08;一&#xff09;問題定義 給定字符串 s 和字符串數組 words&#xff08;words 中所有單詞長度相同 &#xff09;&#xff0c;找出 s 中所有“串聯子串”的起始索引。串聯子串指包含 …

RH134 管理基本存儲知識點

1. 對 Linux 磁盤進行分區時有哪兩種方案&#xff1f;分別加以詳細說明。答&#xff1a;MBR分區&#xff1a;主引導記錄(MBR)分區方案是運行BIOS固件的系統上的標準方案。此方案支持最 多四個主分區。在Linux系統上&#xff0c;您可以使用擴展分區和邏輯分區來創建最多…

【JS 異步】告別回調地獄:Async/Await 和 Promise 的優雅實踐與錯誤處理

【JS 異步】告別回調地獄&#xff1a;Async/Await 和 Promise 的優雅實踐與錯誤處理 所屬專欄&#xff1a; 《前端小技巧集合&#xff1a;讓你的代碼更優雅高效 上一篇&#xff1a; 【JS 數組】數組操作的“瑞士軍刀”&#xff1a;精通 Array.reduce() 的騷操作 作者&#xff…

23.Linux : ftp服務及配置詳解

Linux &#xff1a; ftp服務及配置詳解 FTP 基本概念 定義&#xff1a;文件傳輸協議&#xff08;File Transfer Protocol&#xff09;&#xff0c;采用 C/S 模式工作。端口&#xff1a; 控制端口&#xff1a;21數據端口&#xff1a;20FTP 工作原理模式工作流程連接發起方主動模…

悲觀鎖樂觀鎖與事務注解在項目實戰中的應用場景及詳細解析

在今天做的項目練習部分中真的學到了很多東西&#xff0c;也補充了許多之前遺漏或是忘記的知識點&#xff0c;但時間精力有限&#xff0c;我就先記錄一下今天用到的一個新東西&#xff0c;悲觀鎖和樂觀鎖。首先給出實際應用背景&#xff1a;在加入鎖和事務注解之前&#xff0c;…

Java構造器與工廠模式(靜態工程方法)詳解

1. 構造器1.1 構造器的核心意義1.1.1 對象初始化構造器在創建對象 (new) 時自動調用, 用于初始化對象的狀態 (如設置字段初始值, 分配資源等)無構造器時: 字段為默認值&#xff08;0/null/false&#xff09;有構造器&#xff1a;確保對象創建后即處于有效狀態1.1.2 強制初始化…

解決jdk初始化運行,防火墻通信選錯專業網絡問題

問題描述新項目添加不同版本的jdk&#xff0c;運行時提示防火墻通信策略&#xff0c;選成專用網絡。其他人訪問后端接口時&#xff0c;提示連接失敗。 解決方案&#xff1a;1、在搜索欄中輸入 防火墻關鍵字&#xff0c;選擇到防火墻和網絡保護2、選擇允許應用通過防火墻3、先點…

【Linux】常用命令(三)

【Linux】常用命令&#xff08;三&#xff09;1. export1.1 原理1.2 常用語法1.3 示例1.4 書中對命令的解釋1.5 生效范圍2. 測試服務地址與其端口能否訪問2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (適用于HTTP/HTTPS 服務)1. export export 是 Linux Shell&#xff…

Pytest項目_day15(yaml)

YAMLYAML是一個對所有編程語言都很友好的數據序列化標準&#xff0c;它是一種直觀的能夠被電腦識別的數據序列化格式&#xff0c;是一種可讀性高且容易被人類閱讀的腳本語言YAML語言的本質是一種通用的數據串行化格式適用場景 可以直接序列化為數組、字典解析成本低專門寫配置文…

審批流程系統設計與實現:狀態驅動、靈活擴展的企業級解決方案

審批流程系統設計與實現&#xff1a;狀態驅動、靈活擴展的企業級解決方案 本文基于實際企業級審批系統源碼&#xff0c;深入解析如何設計高擴展性、強一致性的審批流程引擎&#xff0c;涵蓋狀態機設計、多租戶隔離、文件服務集成等核心實現。 1. 系統設計概覽 審批系統的核心架…

汽車免拆診斷案例 | 2010款奧迪A4L車行駛中發動機偶爾自動熄火

故障現象 一輛2010款奧迪A4L車&#xff0c;搭載CDZ發動機 &#xff0c;累計行駛里程約為18.2萬km。該車行駛中發動機偶爾自動熄火&#xff0c;有時熄火后能夠立即重新起動著機&#xff0c;有時需要等待一會兒才能重新起動著機&#xff0c;故障頻率較低。因該故障在其他維修廠陸…

Liam ERD:自動生成美觀的交互式實體關系圖

Liam ERD 是一個可以快速生成美觀且具有交互性的數據庫實體關系圖&#xff08;ERD&#xff09;的工具&#xff0c;可以幫助用戶實現復雜數據庫結構的可視化。 Liam ERD 是一個免費開源的項目&#xff0c;代碼托管在 GitHub&#xff1a; https://github.com/liam-hq/liam 功能…

網絡協議序列化工具Protobuf

目錄前言一、下載注意二、解壓安裝三、Protobuf的使用1、創建.proto文件2、利用protoc編譯.proto文件前言 Protocol Buffers是Google的?種語??關、平臺?關、可擴展的序列化結構數據的?法&#xff0c;它可?于&#xff08;數據&#xff09;通信協議、數據存儲等。 Protoco…

從表單校驗到API網關:全鏈路輸入安全防護指南

從表單校驗到 API 網關:全鏈路輸入安全防護指南 在軟件系統的安全防御體系中,輸入安全是第一道防線,而這道防線的堅固程度直接決定了系統抵御外部攻擊的能力。從用戶在瀏覽器中填寫表單的那一刻起,到數據經過 API 網關流轉至后端服務,每一個環節都可能成為輸入攻擊的突破…

Flask vs Django:微框架與一站式對決

Flask 簡介 1、簡介 Flask誕生于2010年&#xff0c;是Armin ronacher用Python語言基于Werkzeug工具箱編寫的輕量級Web開發框架&#xff0c;又稱之為微框架。 "微"的含義&#xff1a;Flask旨在保持核心簡潔&#xff0c;本身相當于內核&#xff0c;其他功能需通過擴展…

真實業務場景:mysql慢查詢優化(從17秒的查詢優化到700毫秒)

慢查詢業務場景:原先在我們系統中要統計一些人員的單位 部門信息的數據情況&#xff0c;比如總的男女人數&#xff0c;每個單位下的男女人數等等&#xff0c;然后原來的sql是這樣寫的 根據一個單位的id 然后對一張表做出多個子查詢進行查詢&#xff0c;這時候統計記錄 由于加載…

遠程影音訪問:通過 cpolar 內網穿透服務使用 LibreTV

文章目錄前言【視頻教程】1.關于LibreTV2.docker部署LibreTV3.簡單使用LibreTV4.安裝cpolar內網穿透5.配置ward公網地址6.配置固定公網地址總結LibreTV 與 cpolar 的協同應用&#xff0c;為用戶打造了一條通往高清觀影自由的便捷之路。通過這一方案&#xff0c;用戶不僅擺脫了商…

Apache ECharts 6 核心技術解密 – Vue3企業級可視化實戰指南

簡介 ECharts 是百度開源的一個使用 JavaScript 實現的開源可視化庫&#xff0c;它能夠生動、可交互地展示數據。在 Vue3 項目中集成 ECharts 可以讓你的項目更加直觀和動態地呈現數據信息。 核心優勢 特性SVG渲染器Canvas渲染器縮放保真度★★★★★★★☆☆☆動態交互性能…

考公VS考研,拼哪個性價比高?

即將到來下半年&#xff0c;將迎來考公和考研是兩個非常重要的考試&#xff0c;也是許多年輕人為之奮斗的目標。無論是獲得一份穩定的“鐵飯碗”&#xff0c;還是提升學歷學位獲得更高的競爭力&#xff0c;都是值得努力的方向。那么&#xff0c;考公vs考研&#xff0c;到底哪個…