STM32F4 + RT-Thread 實戰指南:TIM10 硬件定時器驅動開發與 1 秒定時功能實現

目錄

  • 前言
  • 一、STM32定時器10是個什么定時器?
  • 二、工程創建、環境配置
  • 三、程序代碼
  • 四、運行

前言

rtthread中,STM32F4的定時器10有些驅動并不完整,對比與其它定時器在使用時需要手動的添加一些代碼,我在使用上拆踩了一些坑,因此寫這篇文章分享出來,幫助大家避坑

一、STM32定時器10是個什么定時器?

TIM10是一個簡化版的通用定時器,它功能精簡,只可實現基礎的定時 / 脈沖控制場景。
STM32F4定時器分類:

定時器類型代表型號核心特點適用場景
高級定時器TIM1、TIM816/32 位、支持死區控制、互補輸出、剎車功能電機控制(如 BLDC、步進電機)、大功率 PWM
通用定時器TIM2~TIM5(全功能)16/32 位、4 個捕獲比較通道、支持多種計數模式復雜定時、多路 PWM、多通道輸入捕獲
通用定時器(簡化版)TIM9~TIM1416 位、僅 1 個捕獲比較通道、功能精簡簡單定時、單路 PWM / 捕獲
基本定時器TIM6、TIM716 位、無捕獲比較通道、僅定時 + DAC 觸發純定時中斷、DAC 同步觸發

二、工程創建、環境配置

1、 新建一個工程
在這里插入圖片描述
2、打開CubeMX Settings,
在這里插入圖片描述
3、時鐘源配置,使用外部晶振
在這里插入圖片描述
4、調試口配置
在這里插入圖片描述
5、開啟TIM10,這里的預分頻系數不需要配置,因為我們最終會使用到RTthread的API函數對其頻率進行配置,因此就算這里配置了最終也會被覆蓋
在這里插入圖片描述
6、串口一順便也打開
在這里插入圖片描述
7、時鐘樹配置
在這里插入圖片描述
8、選擇MDK-ARM工具鏈
在這里插入圖片描述
9、生成.c 和.h文件
在這里插入圖片描述
10、生成代碼
在這里插入圖片描述
11、打開HWTIMER設備驅動程序
在這里插入圖片描述
12、使能定時器模塊
在這里插入圖片描述
13、打開TIM10的宏
在這里插入圖片描述
14、沒看到單獨的tim.c文件,是因為腳本里面沒有添加,我們在腳本里面添加
在這里插入圖片描述
15、然后打開CubeMX重新生成代碼
在這里插入圖片描述
16、現在就能看到tim.c文件了
在這里插入圖片描述
17、找到TIM10初始化函數,添加TIM10的時鐘初始化
在這里插入圖片描述
18、添加TIM10的CONFIG,這個需要自己手動補充
在這里插入圖片描述
19、補充TIM10的中斷,這個也是庫里沒有,需要手動補充
在這里插入圖片描述
20、補充TIM10的回調,這個庫里也沒有
在這里插入圖片描述

三、程序代碼

代碼里的注釋寫的很清楚,就不對代碼進行解釋了,在主函數里寫入以下就行

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>/* 硬件定時器設備名稱 - 根據實際BSP配置修改 */
#define HWTIMER10_DEV_NAME "timer10"/* 定時器超時時間(微秒) */
#define HWTIMER10_TIMEOUT_US 1000000  // 1秒/* 定時器頻率(Hz) */
#define HWTIMER10_FREQ 1000000        // 1MHz/* 定時器模式 */
#define HWTIMER10_MODE HWTIMER_MODE_PERIOD/* 硬件定時器設備句柄 */
static rt_device_t hwtimer10_dev = RT_NULL;int main(void)
{int count = 1;while (count++){//rt_kprintf("hello world!\r\n");rt_thread_mdelay(1000);}return RT_EOK;
}/* 硬件定時器回調函數 */
static rt_err_t hwtimer10_callback(rt_device_t dev, rt_size_t size)
{/* 定時器中斷處理 */rt_kprintf("Hardware Timer timeout! Tick: %d\n", rt_tick_get());return RT_EOK;
}/* 硬件定時器初始化函數 */
static int hwtimer10_init(void)
{rt_err_t ret = RT_EOK;rt_hwtimerval_t timeout_val;/* 查找硬件定時器設備 */hwtimer10_dev = rt_device_find(HWTIMER10_DEV_NAME);if (hwtimer10_dev == RT_NULL){rt_kprintf("Failed to find %s device!\n", HWTIMER10_DEV_NAME);return -RT_ERROR;}/* 打開硬件定時器設備 */ret = rt_device_open(hwtimer10_dev, RT_DEVICE_OFLAG_RDWR);if (ret != RT_EOK){rt_kprintf("Failed to open %s device!\n", HWTIMER10_DEV_NAME);return ret;}/* 設置定時器頻率 */rt_uint32_t freq = HWTIMER10_FREQ;ret = rt_device_control(hwtimer10_dev, HWTIMER_CTRL_FREQ_SET, &freq);if (ret != RT_EOK){rt_kprintf("Failed to set %s frequency!\n", HWTIMER10_DEV_NAME);return ret;}/* 設置定時器模式 */rt_hwtimer_mode_t mode = HWTIMER10_MODE;ret = rt_device_control(hwtimer10_dev, HWTIMER_CTRL_MODE_SET, &mode);if (ret != RT_EOK){rt_kprintf("Failed to set %s mode!\n", HWTIMER10_DEV_NAME);return ret;}/* 設置超時時間 */timeout_val.sec = 0;                      // 秒部分timeout_val.usec = HWTIMER10_TIMEOUT_US;    // 微秒部分/* 寫入超時值以啟動定時器 */if (rt_device_write(hwtimer10_dev, 0, &timeout_val, sizeof(timeout_val)) != sizeof(rt_hwtimerval_t)){rt_kprintf("Failed to set %s timeout!\n", HWTIMER10_DEV_NAME);return -RT_ERROR;}/* 設置回調函數 */ret = rt_device_set_rx_indicate(hwtimer10_dev, hwtimer10_callback);if (ret != RT_EOK){rt_kprintf("Failed to set %s callback!\n", HWTIMER10_DEV_NAME);return ret;}rt_kprintf("Hardware Timer %s initialized successfully! Interval: %d us\n",HWTIMER10_DEV_NAME, HWTIMER10_TIMEOUT_US);return RT_EOK;
}/* 停止硬件定時器函數 */
static void hwtimer10_stop(void)
{if (hwtimer10_dev != RT_NULL){/* 關閉設備會自動停止定時器 */rt_device_close(hwtimer10_dev);rt_kprintf("Hardware Timer %s stopped!\n", HWTIMER10_DEV_NAME);}
}/* 導出到MSH命令列表 */
MSH_CMD_EXPORT(hwtimer10_init, initialize and start hardware timer10);
MSH_CMD_EXPORT(hwtimer10_stop, stop hardware timer10);

在主函數里寫入上面貼出的代碼
在這里插入圖片描述

四、運行

程序下載后。
在命令行執行指令
在這里插入圖片描述
可以看到1s進一次回調函數,說明我們的TIM10配置成功了
在這里插入圖片描述

敲入停止指令可停止回調
在這里插入圖片描述

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

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

相關文章

echarts圖庫

環形圖// 指定圖表的配置項和數據this.option {// tooltip: {// trigger: item// },color: [#FFB32F, #FF5757, #57D5FF, #2FA8FF, #95FFF1], // 扇形區域以及列表顏色legend: {orient:vertical,//文字橫向排itemGap:20,left: left,textStyle:{color: #F3F9FF,// fontSi…

進程(Process)全面概述

進程&#xff08;Process&#xff09;全面概述 本文檔擴展了進程的定義、屬性、生命周期、管理機制及示例&#xff0c;涵蓋 task_struct 結構、進程鏈表、狀態與優先級、fork 函數及其寫時復制示例。 一、進程基本概念 進程&#xff1a;系統進行資源分配和調度的基本單位&#…

Java并發編程:sleep()與wait()核心區別詳解

今天完成了實驗室納新網站的工作&#xff0c;大體功能都已經完善&#xff0c;也和前端測試過了&#xff0c;費了點時間&#xff0c;而且今天大部分時間在看langchain4j的東西&#xff0c;就簡單復習一下八股&#xff0c;等會再復習一下算法題吧在Java并發編程中&#xff0c;sle…

AR眼鏡在智能制造的應用方向和場景用例|阿法龍XR云平臺

AR巡檢在制造業的應用已形成覆蓋設備維護、質量檢測、安全監控和遠程協作四大類別的成熟場景&#xff0c;不同制造領域的實踐各具特色&#xff0c;為行業提供了寶貴參考。在汽車制造領域&#xff0c;AR 巡檢主要應用于生產線設備維護和焊接質量檢測。在汽車廠總裝車間部署 AR 系…

【Linux系統】線程同步

在上一章節中&#xff0c;我們使用互斥量之后&#xff0c;確實解決了數據競爭問題&#xff0c;但出現了新的問題&#xff1a;只有一個線程&#xff08;thread 1&#xff09;在處理所有售票任務。這展示了互斥量的一個局限性&#xff1a;它確保了線程安全&#xff0c;但不保證公…

代碼隨想錄訓練營第三十一天|LeetCode56.合并區間、LeetCode738.單調遞增的數字

56.合并區間 思路&#xff1a;先讓二維數組進行排序&#xff1b; 遍歷數組&#xff0c;定義一個min表示重合區間的左邊界&#xff0c;max表示重合區間的右邊界&#xff1b; 如果當前區間左邊大于max&#xff0c;就證明重合區間斷了&#xff0c;就要對它進行加入ArrayList&am…

【Unity項目經驗分享】實現左右分屏裸眼3D程序

1、實現原理左右分屏原理&#xff0c;左右屏內容左右方向存在些許偏差。通過左右相機&#xff0c;然后左側相機向左側偏移一點3cm&#xff0c;右側相機向右側屏偏移一定3cm&#xff0c;然后將左右相機渲染內容通過RenderTexture渲染到Canvas上面的左右RawImage上面。2、實現具體…

設計軟件啟動失敗?“找不到vcruntime140.dll,無法繼續執行代碼” 場景化解決方案來了

打游戲時&#xff0c;剛加載到登錄界面就因 “找不到 vcruntime140.dll, 無法繼續執行代碼” 閃退&#xff1b;寫代碼時&#xff0c;編譯工具突然報錯中斷工作&#xff1b;做設計時&#xff0c;PS、AE 啟動失敗彈出相同提示 —— 不同場景下的 vcruntime140.dll 錯誤&#xff0…

基于Echarts+HTML5可視化數據大屏展示-茶葉種植大數據溯源平臺

效果展示&#xff1a;代碼結構&#xff1a;主要代碼實現 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

PLOS One圖片處理要求及處理辦法

PLOS One圖片處理&#xff1a; 要求&#xff1a;Please remove your figures from within your manuscript file, leaving only the individual TIFF/EPS image files. These will be automatically included in the reviewer’s PDF. 請從稿件文件中移除所有圖表&#xff0c;…

AutoLayout與Masonry:簡化iOS布局

Auto Layout 與 Masonry蘋果提供的自動布局&#xff08;Auto Layout&#xff09;能夠對視圖進行靈活有效的布局。但是&#xff0c;使用原生的自動布局相關的語法創建約束的過程是非常冗長的&#xff0c;可讀性也比較差。Masonry 的目標其實就是 為了解決原生自動布局語法冗長的…

從設計到落地:校園圖書館系統的面向對象實現全流程

很多小白學面向對象時總困惑&#xff1a;“類圖、用例圖我會畫&#xff0c;但怎么把這些設計變成能跑的代碼&#xff1f;” 這篇文章就用 “校園圖書館管理系統” 當例子&#xff0c;從需求分析→設計方案→代碼實現→測試驗證&#xff0c;帶你走通 “設計→實現” 的完整鏈路&…

[鴻蒙心跡]帶新人學鴻蒙的悲歡離合

2023年底&#xff0c;我和陸神&#xff0c;威哥&#xff0c;老羅一起去深圳參加了鴻蒙師資培訓正式開啟了鴻蒙之旅&#xff0c;當時和陸神拍的合照但是我把陸神打碼了 學完以后就考取了鴻蒙的高級認證 看到沒有時間是2023年11月 馬上都要到期了。 想一想時間過得真快&#xff…

MindShow AI:AI思維導圖生成工具高效解決思路混亂難題,快速搭建學習與工作大綱

你有沒有過這種時候&#xff1f;想整理一份學習大綱或者項目方案&#xff0c;腦子裡一堆想法卻散得像亂麻 —— 比如要做個 “數據分析入門規劃”&#xff0c;明明知道要學 Excel、SQL、Python&#xff0c;可怎么分階段、每個階段學哪些重點&#xff0c;對著空白文檔半天列不出…

快速搭建一個Vue+TS+Vite項目

1、在一個文件夾下通過cmd打開&#xff0c;輸入命令npm create vitelatest命名要為英文2.選擇項目框架通過上下鍵位選擇Vue框架&#xff1a;選好按回車鍵3.選擇開發語言選擇TypeScript語言&#xff0c;方便后續開發&#xff1a;創建好的項目目錄為&#xff1a;4.安裝Vite依賴接…

深度學習:ResNet 殘差神經網絡詳解

一、ResNet 殘差神經網絡的起源與核心地位ResNet&#xff08;Residual Neural Network&#xff0c;殘差神經網絡&#xff09;是 2015 年由微軟亞洲研究院的何凱明、張祥雨等研究者提出的深度神經網絡架構。在當年的 ImageNet 大規模視覺識別挑戰賽&#xff08;ILSVRC&#xff0…

Python面試題及詳細答案150道(116-125) -- 性能優化與調試篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 116. 如何查找Python程序的…

C++11 智能指針的使?及其原理

目錄 1. 智能指針的使?場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使? 4. 智能指針的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循環引?問題 5.2 weak_ptr 6. shared_ptr的線程安全問題 7. C11和boost中智能指針的關系 8. 內存泄漏 8.1 什么是…

【Linux】Linux進程狀態和僵尸進程:一篇看懂“進程在忙啥”

前言&#xff1a;歡迎各位光臨本博客&#xff0c;這里小編帶你直接手撕Make/Makefile (自動化構建)&#xff0c;文章并不復雜&#xff0c;愿諸君耐其心性&#xff0c;忘卻雜塵&#xff0c;道有所長&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;個人主頁&a…

開源視頻剪輯工具推薦

開源視頻剪輯和處理工具近年來發展非常迅速&#xff0c;許多工具的功能已經足以媲美甚至超越一些商業軟件。以下是一些頂級的開源視頻編輯和處理工具&#xff0c;涵蓋了從簡單易用到專業級別的不同需求。 一、 主要視頻編輯軟件&#xff08;非線性編輯&#xff0c;NLE&#xf…