STM32--寄存器與標準庫函數--基本定時器

目錄

前言

基本定時器概念? ? ? ??

定時時間? ? ? ??

定時器時鐘確定

????????倍頻鎖相環被正確配置為168MHz

定時器的庫函數操作

代碼

定時器的寄存器操作

代碼

寄存器

后言


前言

使用平臺:STM32F407ZET6

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

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

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

????????定時器的作用一般是為了使用定時功能和中斷功能(洗衣機、微波爐、電風扇、智能空調......),當然在STM32中也可以利用定時器產生周期性的脈沖信號來控制不同的外設(電機的轉速、舵機的角度、燈光的亮度........),所以掌握STM32中的定時器對于項目開發是很有必要的。

????????定時器有多種,常用的外設定時器有基本定時器、通用定時器與高級定時器。?對于STM32F407微處理器而言,內部一共集成了14個定時器,其中有2個基本定時器(TIM6和TIM7)、10個通用定時器(TIM2~TIM5、TIM9~TIM14)、2個高級定時器(TIM1和TIM8)。其中通用定時器TIM2和TIM5為32位定時器,其他為16位定時器,當然,定時器位數越大,定時時間越久。2的32次方--4 294 967 296,2的16次方65 536。

? ? ?

基本定時器概念? ? ? ??

????????本文使用的是基本定時器,基本定時器具有16位的自動重載計數器(TIM_Period)與16位的預分頻器(TIM_Prescaler)。并且自動重載計數器只能遞增計數(TIM_CounterMode_Up),發生更新事件(TIM_IT_Update)會生成中斷/DMA請求(計數器上溢)。? ? ? ?

定時時間? ? ? ??

定時時間需要三個參數決定,定時器的時鐘頻率、預分頻器的值與自動重載計數器的值。

這里我提供一下我寫的自動計算填的值代碼(這個只匹配16位的定時器哦,32位的不一定適用哦):

.\main.exe 84 1 8400這樣使用即可,第一個參數84是定時器的頻率以MHZ為單位,第二個參數是需要定時的時間,這里以秒為單位,第三個參數可以選擇填自己確定的預分配值或者自動重載值即可。這里可以得到匹配的自動重載值或者預分頻值(在正式填的時候,不要忘記減1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*** @brief 獲得分頻系數或者計數器* * @param argc * @param argv * @return int */
int main(int argc, char const *argv[])
{if (argc != 4) // 需要兩個參數:時間 和 預分頻return -1;int clock = atoi(argv[1])*1000000;              // 84 MHz 定時器時鐘float tim_sec = atof(argv[2]); // 期望的定時秒數int prescaler = atoi(argv[3]); // 預分頻值// 計算 ARR(自動重裝載值)int result = (int)(((float)tim_sec * clock) / ((float)prescaler));if (result > 0 && result < 65536)printf("%d\n", result);elseprintf("Out of range\n");return 0;
}

定時器時鐘確定

我的板子芯片是STM32F407ZET6,最大支持的頻率是168MHz,通過鎖相環分頻器(PLLCLOCK)可以將外部高速時鐘(HSE)的8MHz轉化為168MHz,這里我們通過時鐘樹來分析。

我們的定時器的頻率不是單純的像總線一樣有84MHz或者42MHz限制,這里面的關鍵就是。

如果設置了板子的頻率為168MHz,并且設置了非1的的分頻系數,那么定時器的時鐘頻率是總線的頻率的兩倍

????????倍頻鎖相環被正確配置為168MHz

? ? ? ? 如果在標準庫中設置倍頻鎖相環被正確配置為168MHz。我們其實只要修改兩個地方即可,其一外部晶振的正確頻率,其一PLL_M

對應代碼處為:

我后面會寫一篇文章專門介紹為什么這樣就可以設置系統時鐘為168MHz。可以期待一波。

1.system_stm32f4xx.c文件修改PLL_M值8MHz晶振即為8b?

2.stm32f4xx.h文件修改HSE_VALUE,8MHZ晶振即為8000000

定時器的庫函數操作

代碼

本質使用了若干函數

RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE)
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct)
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
TIM_ITConfig(TIMx, TIM_IT_Update) 
TIM_Cmd(ENABLE)

這里我使用了基本定時器的TIM7,通過定時器的定時中斷操作,把led翻轉。

void TimerBaseInit(void)
{// 開啟定時器時鐘/* 開啟TIM6與TIM7基本定時器時鐘 84MHz*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);// 為每個定時器賦值/* 基本定時器TIM7 800ms 84MHz*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 42000 - 1;TIM_TimeBaseInitStruct.TIM_Prescaler = 1600 - 1;TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStruct);/* TIM7 */NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM7_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0xf;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStruct);TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);TIM_Cmd(TIM7, ENABLE);
}

定時中斷函數:

void TIM7_IRQHandler(void)
{if (TIM_GetITStatus(TIM7, TIM_IT_Update)){TIM_ClearITPendingBit(TIM7, TIM_IT_Update);GPIO_ToggleBits(GPIOF, GPIO_Pin_10);}
}

定時器的寄存器操作

代碼

寄存器初始化:

void TimerBaseRegisterInit(void)
{//開啟定時器時鐘RCC->APB1ENR |= (0b11<<4);    //TIM6、TIM7RCC->APB2ENR |= (0b11<<16);    //TIM9、TIM10//配置定時器/* 配置定時器前先關閉定時器,即關閉計數器 */TIM6->CR1 &= ~(1 <<0 );/* 配置定時器參數 */TIM6->PSC = 10000-1;    //分頻值 10000TIM6->ARR = 8400 - 1;   // 對應分頻器10000TIM6->CNT = 0;          // 清0計數器,個人認為自動重裝初值應該從0開始TIM6->CR1 |= (0b10000100);TIM6->DIER |= (0b1);//配置NVICNVIC->ISER[1] = 1u << (TIM6_DAC_IRQn %32);//配置完成定時器,開啟計數器TIM6->CR1 |= (1 << 0);
}

定時中斷函數:

void TIM7_IRQHandler(void)
{if (TIM7->SR == 1){TIM7->SR = 0;GPIO_ToggleBits(GPIOF, GPIO_Pin_10);}
}

寄存器

這里提供基本定時器使用的寄存器:

啟動定時器時鐘寄存器:

控制寄存器CR1:

寄存器配置寄存器,搭配使用

中斷使能寄存器

狀態寄存器

配置NVIC使能中斷寄存器

后言

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

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

相關文章

PCA 實現多向量壓縮:首個主成分的深層意義

PCA 實現多向量壓縮 第一個主成分(components_[0])正是數據協方差矩陣中最大特征值對應的特征向量。 ,layer_attention_vector[layer] 被賦值為 pca.components_[0],這確實是一個特征向量,具體來說是 PCA 分解得到的第一個主成分(主特征向量)。 關于它的維度: 假設 c…

網絡常識-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09;是互聯網的“地址簿”&#xff0c;負責將人類易記的域名&#xff08;如www.example.com&#xff09;轉換為計算機可識別的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以簡單理解為“從域名到…

Java中 23 種設計模式介紹,附帶示例

文章目錄設計模式六大原則設計模式分類1、創建型模式&#xff08;Creational Patterns&#xff09;2、結構型模式&#xff08;Structural Patterns&#xff09;3、行為型模式&#xff08;Behavioral Patterns&#xff09;一、創建型模式&#xff08;Creational Patterns&#x…

嵌入式開發入門——電子元器件~電磁繼電器、蜂鳴器

文章目錄電磁繼電器定義關鍵參數實物蜂鳴器實物內部結構分類關鍵參數電磁繼電器 定義 概述&#xff1a;電磁繼電器是利用電磁感應原理職稱的一種電磁開關&#xff0c;他能通過&#xff1a;低電壓、低電流的電路&#xff0c;來控制高電壓、高電流的電路。 關鍵參數 線圈電壓…

ROS2基礎

1.helloworld案例1.創建功能包&#xff08;C&#xff09;終端下&#xff0c;進入ws00_helloworld/src目錄&#xff0c;使用如下指令創建一個C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld執行完畢&a…

Python爬蟲實戰:研究pygalmesh,構建Thingiverse平臺三維網格數據處理系統

1. 引言 1.1 研究背景 在數字化浪潮席卷全球的當下,三維建模技術已成為連接虛擬與現實的核心紐帶,廣泛滲透于工程設計、地理信息系統(GIS)、虛擬現實(VR)、增強現實(AR)、醫學影像等關鍵領域。例如,在建筑工程中,BIM(建筑信息模型)技術依賴高精度三維網格實現施工…

開發者說 | EmbodiedGen:為具身智能打造可交互3D世界生成引擎

概述 具身智能的發展離不開高質量、多樣化的可交互3D仿真環境。為突破傳統構建方式的瓶頸&#xff0c;我們提出了EmbodiedGen&#xff0c;一個基于生成式AI技術的自動化3D世界生成引擎&#xff0c;助力低成本、高效率地創建真實且可交互的3D場景。用戶僅需輸入任務定義或場景圖…

GitHub Copilot:AI編程助手的架構演進與真實世界影響

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1. 技術背景與核心架構 GitHub Copilot 是由 GitHub 與 OpenAI 聯合開…

PDF OCR + 大模型:讓文檔理解不止停留在識字

在企業數字化的實際場景中&#xff0c;PDF OCR 已經很普遍了&#xff1a;從掃描件提取文本、表格到生成可搜索 PDF。但這類技術往往停留在"把圖片變成文字"&#xff0c;對文檔背后的語義、邏輯、業務價值理解不足。 而當 OCR 遇上大語言模型&#xff08;LLM&#xff…

半敏捷衛星觀測調度系統的設計與實現

半敏捷衛星觀測調度系統的設計與實現 摘要 本文詳細闡述了一個基于Python的半敏捷衛星觀測調度系統的設計與實現過程。系統針對半敏捷衛星特有的機動能力限制&#xff0c;綜合考慮了地面目標觀測需求、衛星資源約束、能源管理等多重因素&#xff0c;提出了一種混合啟發式算法解…

軟件測試中,常用的抓包工具有哪些?抓包的原理是什么?

回答重點在軟件測試中&#xff0c;常用的抓包工具主要有&#xff1a;1&#xff09;Fiddler2&#xff09;Wireshark3&#xff09;Charles4&#xff09;Postman&#xff08;它的攔截器功能也可以用于抓包&#xff09;5&#xff09;tcpdump抓包的原理大致是通過安裝在本地的抓包工…

Cesium學習(二)-地形可視化處理

Cesium地形可視化是其核心功能之一&#xff0c;允許開發者在3D地球中展示真實的地形數據。以下是關于Cesium地形可視化的詳細處理方法&#xff1a; 文章目錄1. 啟用地形可視化基本地形加載自定義地形提供者2. 地形相關操作地形高度采樣地形夸張效果3. 地形可視化設置地形照明效…

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》 大家好,我是你的朋友,一位與 Python 代碼相伴多年的開發者。在我們的編程生涯中,幾乎都曾與一種“代碼怪獸”搏斗過,它就是那冗長、復雜、牽一發而動全身的 if-elif-else 結構。 每當一個新的需求…

Redis--day7--黑馬點評--優惠券秒殺

&#xff08;以下內容全部來自上述課程&#xff09;優惠券秒殺 1. 全局唯一ID 每個店鋪都可以發布優惠券:當用戶搶購時&#xff0c;就會生成訂單并保存到tb voucher order這張表中&#xff0c;而訂單表如果使用數據庫自增ID就存在一些問題: id的規律性太明顯受單表數據量的限制…

Vue 與 React 深度對比:設計哲學、技術差異與應用場景

一、核心設計理念對比 特性 Vue React 設計目標 漸進式框架,降低學習曲線 構建大型應用,保持靈活性 設計哲學 “約定優于配置” “配置優于約定” 核心思想 響應式數據綁定 函數式編程 + 虛擬DOM 模板語言 HTML-based 模板 JSX(JavaScript XML) 狀態管理 內置響應式系統 依…

軟件開發 - foreground 與 background

foreground 與 background 1、foreground詞性含義n.前景&#xff1b;最突出的位置.v使突出&#xff1b;強調# 例詞in the 【foreground】&#xff08;在最顯眼的位置&#xff09;【foreground】 task&#xff08;前臺任務&#xff09;【foreground】 color&#xff08;前景色&a…

深度學習——03 神經網絡(2)-損失函數

2 損失函數 2.1 概述作用&#xff1a;衡量模型預測結果&#xff08;y^\hat{y}y^?&#xff09;和真實標簽&#xff08;yyy&#xff09;的差異&#xff0c;差異越大&#xff0c;說明模型參數“質量越差”&#xff08;需要調整&#xff09;&#xff1b;本質&#xff1a;深度學習訓…

【大模型微調系列-04】 神經網絡基礎與小項目實戰

【大模型微調系列-04】 神經網絡基礎與小項目實戰&#x1f4a1; 本章目標&#xff1a;通過構建一個能識別手寫數字的AI模型&#xff0c;讓你真正理解神經網絡是如何"學習"的。2-3小時后&#xff0c;你將擁有第一個自己訓練的AI模型&#xff01;4.1 理論講解&#xff…

JavaWeb前端(HTML,CSS具體案例)

前言 一直在學習B站黑馬程序員蒼穹外賣。現在已經學的差不多了&#xff0c;但是我學習一直是針對后端開發的&#xff0c;前端也沒太注重去學&#xff08;他大部分都給課程資料嘻嘻&#x1f92a;&#xff09;&#xff0c;但我還是比較感興趣&#xff0c;準備先把之前學JavaWeb&…

核心數據結構:DataFrame

3.3.1 創建與訪問什么是 DataFrame&#xff1f;DataFrame 是 Pandas 中的核心數據結構之一&#xff0c;多行多列表格數據&#xff0c;類似于 Excel 表格 或 SQL 查詢結果。它是一個 二維表格結構&#xff0c;具有行索引&#xff08;index&#xff09;和列標簽&#xff08;colu…