day 8 TIM定時器

一、STM32 定時器概述

1. 定時器的概述定時器的基本功能,但是 STM32 的定時器除了具有定時功能之外,也具有定時器中斷功能,還具有輸入捕獲(檢測外部信號)以及輸出比較功能(輸出不同的脈沖),可以利用 STM32定時器輸出某種頻率的脈沖信號來控制產品(控制燈的亮度、控制直流電機的轉速、控制舵機的角度.......)

2. 定時器的種類STM32 由于資源豐富,所以提供了多種定時器,一共提供 14 個定時器(不包含系統定時器、不包含看門狗定時器),分為高級定時器(TIM1 和 TIM8)、通用定時器(TIM2~TIM5 +TIM9~TIM14,一共 10 個)、基本定時器(TIM6 和 TIM7)

3. 定時器的使用

基本定時器STM32 提供 TIM6 和 TIM7 作為基本定時器,屬于 STM32 內部資源,都是 16bit 定時器,并沒有和 GPIO 引腳連接,TIM6 和 TIM7 都掛載在 APB1 總線下,而 APB1 定時器時鐘頻率為84MHZ。 ? ??

?時基單元包括:

1計數器寄存器? ? ? ? ?CNT? ? ? ?記錄當前計數的次數

2預分頻器寄存器? ? ? ? PSC? ? ? ? 設置計數一次的周期

3自動重裝載寄存器? ? ARR? ? ? ? ? ? 設置定時的次數(定時時間)

TIM6 的時鐘頻率為 84MHZ,如果想要降低頻率,公式:1MHZ = 84MHZ /(83+1),頻率就降為 1MHZ,也就意味著 TIM_CNT 寄存器累計計數 1 次的時間是 1us,如果打算利用TIM6 定時 1ms,也就是說 TIM_ARR 寄存器的值應該設置為 1000-1,只要 TIM_CNT == TIM_ARR,
就說明時間到了,如果時間到了則 TIM_CNT 清 0,然后重新開始計數

對時鐘進行分頻的目的就是為了延長定時時間

1設置定時器的分頻系數 TIM_Prescaler 范圍 0x0000 and 0xFFFF

設置分頻n,分頻系數n-1

2設置定時器的計數模式TIM_CounterMode 基本定時器只能選擇向上計數

3設置定時器的計數周期 TIM_Period 指的是重載寄存器中的值 0x0000 and 0xFFFF

4設置定時器的時鐘分頻因子 TIM_ClockDivision 在輸入捕獲的采樣使用 不需要設置

5設置定時器的重復計數器 TIM_RepetitionCounter 只有高級定時器需要設置

設置中斷源函數:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

函數參數參數一:TIMx 打算產生中斷的定時器號 如 TIM6

參數二:TIM_IT 指定定時器的中斷源 一般為 TIM_IT_Update 表示更新時中斷

參數三:NewState 打開或關閉中斷源 ENABLE or DISABLE

初始化定時器:

可以調用 TIM_TimeBaseInit 函數實現函數原型

voidTIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)函數參數參數一:TIMx 打算配置參數的定時器號 如 TIM6

參數二:TIM_TimeBaseInitStruct 指的是配置的參數信息 記得取地址 &

#include "stm32f4xx.h" ?

__IO uint32_t TimingDelay;

//LED初始化
void LED_Init(void)
{
?? ?GPIO_InitTypeDef ? GPIO_InitStructure;

?? ?RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
?? ?
?? ?GPIO_InitStructure.GPIO_Mode ?? ?= GPIO_Mode_OUT;?? ??? ??? ?//輸出模式
?? ?GPIO_InitStructure.GPIO_OType?? ?= GPIO_OType_PP;?? ??? ??? ?//推挽輸出
?? ?GPIO_InitStructure.GPIO_Speed?? ?= GPIO_Speed_100MHz;?? ??? ?//輸出速率
?? ?GPIO_InitStructure.GPIO_PuPd ?? ?= GPIO_PuPd_NOPULL;?? ??? ??? ?//無上下拉
?? ?GPIO_InitStructure.GPIO_Pin ?? ?= GPIO_Pin_9;?? ??? ??? ??? ?//引腳編號
?? ?GPIO_Init(GPIOF, &GPIO_InitStructure);
?? ?
?? ?GPIO_SetBits(GPIOF,GPIO_Pin_9); //默認不亮

}
//TIM6定時器的初始化
void TIM6_Init(void)
{
?? ?TIM_TimeBaseInitTypeDef ? ?TIM_TimeBaseStructure ;
?? ?
?? ?NVIC_InitTypeDef ? NVIC_InitStructure ;
//1.打開時鐘
?? ?RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
//2.配置定時時間,定時200ms,APB1定時時鐘84MHZ ?1us數84次 ?200ms: ?84*1000*200(次)
//?? ??? ??? ??? ?定時200ms,經過8400分頻,8400us數84次,即100us數1次,1ms=1000us,10次即可,200ms 2000次

?? ?TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;//預分頻
?? ?TIM_TimeBaseStructure.TIM_Period = 2000-1;//計數周期
?? ?TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//計數模式,向上計數
?? ?TIM_TimeBaseInit ( TIM6 , &TIM_TimeBaseStructure);
?? ?
//3.配置NVIC (中斷通道+優先級)?? ?
?? ?NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn;//中斷通道去f4xx.h里面找
?? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占優先級
?? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//響應優先級
?? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷通道
?? ?NVIC_Init(&NVIC_InitStructure);
?? ?
//4.選擇TIM6的中斷源
?TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);//更新事件
?
?//5.使能定時器
?TIM_Cmd(TIM6,ENABLE);

}

void Delay_ms(__IO uint32_t nTime)
{
?? ?TimingDelay=nTime;
?? ?while(TimingDelay);

}

int main()
{
?? ?//1.硬件初始化
?? ?LED_Init();
?? ?TIM6_Init();
?? ?

?? ?
?? ?
?? ?//2.進入死循環
?? ?while(1)
?? ?{
?? ??? ?
?? ?}
?? ?
}

void TIM6_DAC_IRQHandler(void)
{
?? ?//檢測中斷是否發生
?? ?if (TIM_GetITStatus(TIM6, TIM_IT_CC1) != RESET)
?? ?{
?? ??? ?TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);//清空中斷標志
?? ??? ?//異常處理

?? ??? ?GPIO_ToggleBits(GPIOF,GPIO_Pin_9);//翻轉
?? ?}

}
?

優化:

?通用定時器

STM32 一共提供 10 個通用定時器(TIM2~TIM5、TIM9~TIM14),TIM2 和 TIM5 是 32bit 定時器,其他的定時器都是 16bit 定時器。

? ? ?TIM2~TIM5 的計數方式有多種可以選擇,分別為遞增計數、遞減計數、遞增/遞減計數。

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

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

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

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

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

相關文章

Spring Boot 中使用 Redis:從入門到實戰

🌟 前言 歡迎來到我的技術小宇宙!🌌 這里不僅是我記錄技術點滴的后花園,也是我分享學習心得和項目經驗的樂園。📚 無論你是技術小白還是資深大牛,這里總有一些內容能觸動你的好奇心。🔍 &#x…

hi3516cv610通過menuconfig關閉的宏記錄

hi3516cv610通過menuconfig關閉的宏記錄 defconfig為 hi3516cv610_debug_defconfig或hi3516cv610_new_defconfig 1、 變為 2、 變為 3、 變為 4、 變為 5、 變為

WebSocket 詳解:構建一個復雜的實時聊天應用

文章目錄 一、前言二、WebSocket 基礎2.1 WebSocket 與 HTTP 的區別2.2 WebSocket 的優點 三、搭建 WebSocket 服務端3.1 安裝 ws 和 redis 庫3.2 創建 WebSocket 服務端3.3 創建用戶身份驗證 四、前端實現 WebSocket 客戶端4.1 創建 Vue 3 項目4.2 實現 WebSocket 連接和用戶注…

【JavaEE進階】Spring AOP入門

歡迎關注個人主頁:逸狼 創造不易,可以點點贊嗎 如有錯誤,歡迎指出~ AOP是Spring框架的第??核?(第??核?是 IoC) 什么是AOP? ? AspectOrientedProgramming(?向切?編程) 什么是?向切?編程呢? 切…

算法思想之雙指針(一)

歡迎拜訪:霧里看山-CSDN博客 本篇主題:算法思想之雙指針(一) 發布時間:2025.4.4 隸屬專欄:算法 目錄 雙指針算法介紹對撞指針:快慢指針: 例題移動零題目鏈接題目描述算法思路代碼實現 復寫零題目鏈接題目描…

【11408學習記錄】英語寫作黃金模板+語法全解:用FTC數據泄漏案掌握書信結構與長難句拆解(附思維導圖)

2025.04.04 英語寫作書信寫作第一段私人信件公務信函 語法總結——簡單句簡單句的核心:謂語動詞的變化詞性的拓展限定詞 形容詞與副詞介詞短語 成分的擴展同位語插入語 非謂語動詞 每日一句詞匯 第一步:辨別第二步:斷開第三步:簡化…

手機顯示5GA圖標的條件

最近有星友問在什么情況下才能顯示5G-A?雖然這個我也不知道,但是我有幾個運營商的5G終端白皮書,從上面就可以找到答案。 如上是幾個運營商顯示5G-A的條件,基本上考慮的都是3CC的情況,聯通還有考慮200M CA 2CC的場景&am…

網絡:華為數通HCIA學習:IP路由基礎

華為HCIA學習 IP路由基礎路由協議或路由種類以及對應路由的優先級按工作區域分類:按工作機制及算法分類:路由的優先級路由器選擇最優路由的順序是什么? 前言自治系統LAN和廣播域路由選路IP路由表路由度量建立路由表最長匹配原則路由器轉發數據包總結 IP…

Docker 鏡像相關的基本操作

一、Docker 鏡像基本操作 1. 查找鏡像 命令&#xff1a; docker search <鏡像名稱> 示例&#xff1a;查找 CentOS 鏡像&#xff1a; docker search centos 命令解釋&#xff1a; 默認從 Docker Hub 官方倉庫上搜索鏡像。搜索結果包含多個列&#xff1a; NAME&…

Linux文件特殊權限管理及進程和線程

acl 權限優先級 擁有者 > 特殊指定用戶 > 權限多的組 >權限少的組 > 其他 mask閾值 mask是能夠賦予指定用戶權限的最大閥值 當設定完畢文件的acl列表之后用chmod縮小了文件擁有組的權力 mask會發生變化 恢復&#xff1a; setfacl -m m: 權限 :rwx 文件/…

NVIDIA AgentIQ 詳細介紹

NVIDIA AgentIQ 詳細介紹 1. 引言 NVIDIA AgentIQ 是一個靈活的庫&#xff0c;旨在將企業代理&#xff08;無論使用何種框架&#xff09;與各種數據源和工具無縫集成。通過將代理、工具和代理工作流視為簡單的函數調用&#xff0c;AgentIQ 實現了真正的可組合性&#xff1a;一…

算法設計與分析5(動態規劃)

動態規劃的基本思想 將一個問題劃分為多個不獨立的子問題&#xff0c;這些子問題在求解過程中可能會有些數據進行了重復計算。我們可以把計算過的數據保存起來&#xff0c;當下次遇到同樣的數據計算時&#xff0c;就可以查表直接得到答案&#xff0c;而不是再次計算 動態規劃…

怎么理解量子比特模型,遷移到量子計算機開始編程

怎么理解量子比特模型&#xff0c;遷移到量子計算機開始編程 視頻鏈接&#xff1a; 好的現在是2025年的3月最后一天,3月31號,今天我們討論的話題是量子編程,也就是在量子計算機上,使用特定的語言進行軟件開發。當然我們要討論的,不是,量子編程的某一門語言的技術細節,而是考慮…

使用Expo框架開發APP——詳細教程

在移動應用開發日益普及的今天&#xff0c;跨平臺開發工具越來越受到開發者青睞。Expo 是基于 React Native 的一整套工具和服務&#xff0c;它能夠大幅降低原生開發的門檻&#xff0c;讓開發者只需關注業務邏輯和界面實現&#xff0c;而不用糾結于復雜的原生配置。本文將從零開…

windows技術基礎知識

NT架構 NT 就是new techonology 的英文單詞縮寫&#xff0c;是微軟1993年推出操作系統的重大升級&#xff0c;如內存管理&#xff0c;安全機制&#xff0c;多任務&#xff0c;多線程支持。在此之前操作系統都是基于MS-DOS上面的圖形化界面&#xff0c;只有有限的內存管理和多任…

迪杰斯特拉+二分+優先隊列+拓撲+堆優化(奶牛航線Cowroute、架設電話線dd、路障Roadblocks、奶牛交通Traffic)

原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 題目列表 P1&#xff1a;奶牛航線Cowroute 題目描述 題目描述 Bessie已經厭倦了農場冬天的寒冷氣候&#xff0c;她決定坐飛機去更溫暖的地方去度假。不幸的是&#xf…

#Liunx內存管理# 在32bit Linux內核中,用戶空間和內核空間的比例通常是3:1,可以修改成2:2嗎?

在32位Linux內核中&#xff0c;用戶空間和內核空間的3:1默認比例可以修改為2:2&#xff0c;但需要權衡實際需求和潛在影響。以下是具體分析&#xff1a; 一、修改可行性 1.技術實現 通過內核啟動參數調整虛擬地址空間劃分&#xff0c;例如在GRUB配置中添加mem2G參數&#xff0c…

JAVA:使用 Curator 進行 ZooKeeper 操作的技術指南

1、簡述 Apache Curator 是一個基于 ZooKeeper 的 Java 客戶端庫&#xff0c;它極大地簡化了使用 ZooKeeper 的開發工作。Curator 提供了高層次的 API&#xff0c;封裝了很多復雜的 ZooKeeper 操作&#xff0c;例如連接管理、分布式鎖、Leader 選舉等。 在分布式系統中&#…

Julia語言的測試覆蓋率

Julia語言的測試覆蓋率探討 引言 在現代軟件開發中&#xff0c;測試是確保軟件質量的重要環節。隨著軟件的復雜度不斷增加&#xff0c;測試覆蓋率作為衡量測試質量的一個重要指標&#xff0c;受到了越來越多開發者的關注。Julia語言作為一種高性能的動態編程語言&#xff0c;…

【萬字總結】前端全方位性能優化指南(八)——Webpack 6調優、模塊聯邦升級、Tree Shaking突破

構建工具深度優化——從機械配置到智能工程革命 當Webpack配置項突破2000行、Node進程內存耗盡告警時,傳統構建優化已觸及工具鏈的物理極限:Babel轉譯耗時占比超60%、跨項目模塊復用催生冗余構建、Tree Shaking誤刪關鍵代碼引發線上事故……構建流程正從「工程問題」演變為「…