STM32:基本定時器原理和定時程序

一、初識定時器TIM

? ? ? ? 定時器就是計數器,定時器的作用就是設置一個時間,然后時間到后就會通過中斷等方式通知STM32執行某些程序。定時器除了可以實現普通的定時功能,還可以實現捕獲脈沖寬度,計算PWM占空比,輸出PWM波形,編碼器計數等。

STM32共11個定時器,2個高級控制定時器TIM1和TIM8,4個通用定時器TIM2~TIM5,兩個基本定時器TIM6和TIM7,兩個看門狗定時器和一個系統滴答定時器Systick.
高級定時器TIM1和TIM8的時鐘由APB1產生,其它六個通用定時器的時鐘由APB2產生。它們的最大頻率都可以配置成系統時鐘的頻率。

定時器種類位數計數模式捕獲/比較通道應用場景
通用定時器
TIM2~TIM5
16向上,向下,雙向4定時計數,PWM,輸入捕獲,輸出比較
高級定時器
TIM1和TIM8
16向上,向下,雙向4在通用的基礎上,多了剎車信號輸入,死區時間互補輸出等工業電機功能
基本定時器
TIM6和TIM7
16向上,向下,雙向4定時計數

二、基本定時器

(1)計數功能原理

? ? ? ? 在上一期文章提到,時鐘樹提供穩定頻率的方波信號,APB1上的時鐘線連接了基本定時器和通用寄存器,APB2上的時鐘線連接了高級定時器。

? ? ? ? 對于實現計數功能,只需要一個寄存器就可以滿足,寄存器只需要讀到時鐘信號的上升沿數值就加1。假如72MHZ的時鐘信號作為輸入,當該寄存器數值累加到7.2*10^7,就代表時間過去了1秒。但是寄存器通常只有16bit,最多能計數?65536個數。因此在該寄存器前面還要加一個類似的計數器,當計數滿足條件時才往后續電路發送高電平,預分頻器就可以充當這個角色,其本質也是一個16bit的計數器。當只需要將其設置為n-1,就可以進行n分頻,從0開始計數,一直計數到n-1才會向后續電路發送高電平。預分頻器最多可以進行65536分頻。因此一個由預分頻器和一個計數器組合成的定時器,最多可以計數65536^2次。m個定時器串聯,就可以計數65536^(2*m)次。?

(2) 自動重裝載寄存器

???????? 自動重裝載寄存器,它的作用就是實時監控計數器的值是否與自己的值相同。當計數器的值與自己的值相同時,便將計數器重置為0,并觸發定時器更新中斷。

(3)影子寄存器

? ? ? ? 所謂的影子寄存器就是某個寄存器的拷貝。在上圖中工作在一線的預分頻器和自動重裝載寄存器其實都是自己的影子寄存器。當定時器正在工作時,如果重新設置預分頻器值或者重新這是自動重裝載寄存器的值,那么只有當計數器和自動重裝載寄存器的值一樣時才會將新值更新到自身影子寄存器中。也就是給定時器設置的新參數值要等下個計數周期才生效。

? ? ? ? 自動重裝載寄存器可以根據程序員選擇是否開啟影子寄存器。如果不開啟,那么將自動重裝載寄存器數值調小時,可能會錯過計數器的值,使計數器一路上到65536才會歸0。

三、定時程序

(1)準備工作

為了發送數據進行模擬,需打開USART2用于設置模式為“異步”,在NVIC Settings中打開中斷,打上√,在DMA Settings,打開DMA傳輸功能,添加傳輸通道。

為提高計數精度,將外部時鐘源設置為"晶振",在時鐘設置界面中的HCLK的頻率設置為72MHZ,自動調整其它器件的時鐘頻率。

對于我使用的STM32F108T6芯片只有4個定時器,即1個高級,3個通用寄存器。雖然沒有基本定時器,但是這些定時器都包含了基本定時器功能。只需要對定時器的時鐘源選擇 Internal Clock (內部時鐘源)就算打開了定時器。因為本次模擬的時鐘頻率是72MHZ,設置預分頻器7200,自動重裝載寄存器為10000,那么完成一個周期的計數就是1s,也就是1s觸發一次定時器更新中斷。同第一步類似,TIM也可以開啟中斷和DMA通道。保存并生成代碼。

(2)實現定時任務和獲取計數器數值:

以下示例代碼為開啟TIM中斷和USART2中斷實現,以及開啟了自動重裝載寄存器的影子寄存器

1.開啟定時器

HAL_TIM_Base_Start(&htim);? ? ? ? //用阻塞的方式開始定時器

HAL_TIM_Base_Start_IT(&htim);? ? ? ? //用中斷(非阻塞)的方式開始定時器

HAL_TIM_Base_Start_DMA(&htim);? ? //用DMA(非阻塞)的方式開始定時器

2.中斷回調函數

在路徑 ~/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c中

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

當計數器數值和自動重裝載寄存器值一樣時調用

3.讀寫定時器中寄存器的宏定義操作

__HAL_TIM_GET_ANTORELOAD //獲取自動重裝載寄存器數值

__HAL_TIM_SET_ANTORELOAD?//設置自動重裝載寄存器數值

__HAL_TIM_GET_COUNTER????????//獲取計數器數值

__HAL_TIM_SET_COUNTER????????//設置計數器數值

__HAL_TIM_SET_PRESCALER? ??//設置預分頻器數值

4.示例代碼

/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim4;UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM4_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
char message2[]="??";
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim == &htim4){HAL_UART_Transmit_IT(&huart2, (uint8_t*)message2,strlen(message2));}
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();//TIM4的初始化MX_TIM4_Init();/* USER CODE BEGIN 2 *///用中斷的方式開啟定時器HAL_TIM_Base_Start_IT(&htim4);int counter = 0;char message[20];/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){counter = __HAL_TIM_GET_COUNTER(&htim4);sprintf(message,"counter:%d",counter);//每隔100ms發送 counter計數器數值//HAL_UART_Transmit_IT(&huart2, (uint8_t*)message,strlen(message));//延遲100msHAL_Delay(100-1);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

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

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

相關文章

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官網并沒有提供各個前端框架Vue&#xff0c;React&#xff0c;Angular的直接使用的適配版本&#xff0c; 所以本次使用的vue3-ace-editor 是個人開源者維護的版本&#xff0c;原生是支持 SFC 模版用的&#xff0c;由于我這里習慣使用 JSX 或 TSX的方式&a…

【03】ES6:解構賦值

一、數組的解構賦值 ES6 允許按照一定模式&#xff0c;從數組和對象中提取值&#xff0c;對變量進行賦值&#xff0c;這被稱為解構&#xff08;Destructuring&#xff09;。 1、基本使用 遵循 “模式匹配” &#xff0c;索引值相同的完成賦值 // 為變量賦值&#xff0c;只能…

Centos7 Python環境和yum修復

1、刪除現有殘余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##驗證清除&…

mybatis注解方式動態標簽時有特殊符號,出現元素內容必須由格式正確的字符數據或標記組成

原始代碼demo Select("SELECT COUNT(1) FROM AAAA WHERE name #{nage} AND age< 4") public Integer sumXxxxx(String nage, String age);現需求改為nage可以為空&#xff0c;因此使用了動態拼接 Select("<script> SELECT COUNT(1) FROM AAAA WHERE …

SWT/Jface(2): 表格的編輯

前言 上節說到, 創建和渲染表格需要如下幾個步驟: 接收源數據數組(也可以是單個對象或者其他集合類型): TableViewer.setInput(Object)渲染接收的數據 渲染表頭: TableViewer.setLabelProvider(IBaseLabelProvider)渲染內容: TableViewer.setContentProvider(IContentProvide…

java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx

windows系統下連接hdfs進行操作時&#xff0c;上來就出現java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx java.lang.IllegalArgumentException: java.net.UnknownHostException: liujianat org.apache.hadoop.security.SecurityUtil.buildTokenServ…

Keil Vision5—新建工程project

注意&#xff1a;創建的工程目錄必須是純英文目錄 目錄 1.開始配置 2.為該路徑下新建個文件夾 3.選擇器件 4.工程配置 4.右擊魔術棒&#xff0c;設置參數 ?編輯 &#xff08;1&#xff09;target配置 &#xff08;2&#xff09;output配置 &#xff08;3&#xff09;c…

字符串結尾空格比較相關參數BLANK_PAD_MODE(DM8:達夢數據庫)

DM8:達夢數據庫 字符串結尾空格比較相關參數BLANK_PAD_MODE 環境介紹1 BLANK_PAD_MODE01.1 初始化數據庫1.2 創建測試表 T0 2 BLANK_PAD_MODE12.1 初始化數據庫2.2 創建測試表 T1 3 BLANK_PAD_MODE只對字段varchar類型生效3.1 BLANK_PAD_MODE 對char 類型對比無效3.2 在兩個數據…

計算機中了halo勒索病毒怎么清除,halo勒索病毒解密數據恢復

科技的進步加快了企業發展的步伐&#xff0c;網絡技術的不斷應用為企業的生產運營提供了極大幫助&#xff0c;但隨之而來的網絡安全威脅也不斷增加&#xff0c;近期&#xff0c;云天數據恢復中心接到很多企業的求助&#xff0c;企業的計算機服務器遭到了halo勒索病毒攻擊&#…

Jmeter快速入門

文章目錄 1.安裝Jmeter1.1.下載1.2.解壓1.3.運行 2.快速入門2.1.設置中文語言2.2.基本用法 1.安裝Jmeter Jmeter依賴于JDK&#xff0c;所以必須確保當前計算機上已經安裝了JDK&#xff0c;并且配置了環境變量。 1.1.下載 可以Apache Jmeter官網下載&#xff0c;地址&#xf…

uni-app打包后,打開軟件時使其橫屏顯示

找到page.json文件&#xff0c;在global加入以下代碼&#xff1a; 這樣就可以橫屏顯示了。

CANdelaStudio 使用教程 1

文章目錄 CANdelaStudio 軟件下載CANdelaStudio 軟件的權限View Edition 和 Admin Edition 區別&#xff1a;打開文件 CDD / CDDT 文件新建 CDD 文件新建 CDDT 文件CDD 和 CDDT 文件的區別 CANdelaStudio 軟件下載 1、 來到 Vector 官網下載中心 https://www.vector.com/cn/zh…

[shader] 光照入門(未完結。。。

反射 漫反射&#xff1a;而當物體表面粗糙時&#xff0c;我們把物體表面看作無數不同方向的微小鏡面&#xff0c;則這些鏡面反射出的光方向均不相同&#xff0c;這就是漫反射。 高光反射&#xff1a;我們假定物體表面光滑&#xff0c;只有一個鏡面&#xff0c;那么所有的光都…

報錯For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.報錯For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 報錯信息如下&#xff1a; ./aten/…

力扣labuladong——一刷day46

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、力扣971. 翻轉二叉樹以匹配先序遍歷二、力扣987. 二叉樹的垂序遍歷三、力扣666. 路徑總和 IV 前言 二叉樹的遞歸分為「遍歷」和「分解問題」兩種思維模式&a…

面試:RocketMQ相關問題

文章目錄 什么是 RocketMQ&#xff0c;有哪些使用場景&#xff1f;RocketMQ 由哪些?色組成&#xff0c;每個?色作用和特點是什么&#xff1f;RocketMQ 中的 Topic 和 JMS 的 queue 有什么區別&#xff1f;RocketMQ 消費模式有幾種&#xff1f;RocketMQ 的 Consumer 是如何消費…

【深度學習】Python快捷調用InsightFace人臉檢測,純ONNX推理

pypi資料&#xff1a; https://pypi.org/project/insightface/ 模型選擇&#xff1a; https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU對應CUDA &#xff1a; https://onnxruntime.ai/docs/reference/compatibility …

1999-2021年地級市城鎮居民人均消費性支出數據

1999-2021年地級市城鎮居民人均消費性支出數據 1、時間&#xff1a;1999-2021年 2、指標&#xff1a;城鎮居民人均消費性支出 3、范圍&#xff1a;290個地級市 4、來源&#xff1a;城市年鑒、地級市統計公報 5、指標解釋&#xff1a; 城鎮居民人均消費性支出&#xff1a;指…

kubesphere安裝依賴文件

yum install socat -y yum install conntrack -y

GAMES101-Homework2

目錄 普通作業&#xff1a;提高作業&#xff1a;參考博客博客一博客二博客三 附代碼框架的個人一些注釋和理解&#xff1a;rasterizer.cppTriangle.cpp 普通作業&#xff1a; // 判斷點是否在三角形內的輔助函數 static bool insideTriangle(float x, float y, const Vector3f…