【DSP28335 入門教程】定時器中斷:為你的系統注入精準的“心跳”

大家好,歡迎來到 DSP28335 的核心精講系列。我們已經掌握了如何通過外部中斷來響應“外部事件”,但系統內部同樣需要一個精準的節拍器來處理“內部周期性任務”。單純依靠?DELAY_US()?這樣的軟件延時,不僅精度差,而且會在延時期間霸占整個CPU,導致系統無法響應其他任何事情,這是專業開發中無法接受的。

今天,我們將學習嵌入式系統的“心臟”——CPU 定時器 (CPU Timer),并利用它來產生精確的定時器中斷。掌握它,你就能創建一個非阻塞的、可以同時執行多個任務的、真正意義上的多任務雛形系統。

一、硬件原理:一個會自動重裝的“數字沙漏”

F28335 內置了三個 32 位的 CPU 定時器 (Timer0, Timer1, Timer2)。要理解它們如何工作,我們首先要看懂其內部的硬件邏輯。

[圖1: CPU 定時器硬件邏輯圖]

這個看似復雜的圖,其核心工作原理就像一個可以精確計時的“數字沙漏”:

  1. 時鐘源 (Clock Source):?定時器的動力來自系統時鐘?SYSCLKOUT。這就是“沙漏”中“沙子”下落的速度基準。

  2. 預分頻器 (Prescaler):

    • PSCH:PSC?(16位) 是一個預分-頻計數器

    • TDDHR:TDDR?(16位) 是一個定時器分頻器

    • 它們組合起來,可以對輸入的?SYSCLKOUT?進行分頻。例如,如果?SYSCLKOUT?是 150MHz,我們可以設置一個 N 分頻,讓最終進入主計數器的時鐘頻率變為?150MHz / N。這允許我們實現更長時間的定時。

  3. 計數器 (Counter):?TIMH:TIM?是一個 32 位的遞減計數器。這是“沙漏”的上半部分。它在每個分頻后的時鐘脈沖到來時,數值減一。

  4. 周期寄存器 (Period Register):?PRDH:PRD?是一個 32 位的周期寄存器。這是“沙漏”的下半部分,用來設定總的“沙子”量。

  5. 工作流程:

    • 啟動:?當我們啟動定時器時,PRD?的值被加載到?TIM?計數器中。

    • 遞減:?TIM?寄存器開始以分頻后的時鐘速度向下計數。

    • 中斷:?當?TIM?減到?0?時,它會產生一個中斷信號 (INT) 給 PIE 模塊。

    • 重載:?與此同時,TIM?會自動將?PRD?的值重新加載進來,然后開始新一輪的遞減計數。

這個“遞減->歸零->中斷->重載”的過程周而復始,就為我們提供了一個穩定、精確的周期性中斷信號,成為了系統的“心跳”。

二、控制樞紐:關鍵寄存器解析

要指揮定時器工作,我們必須學會操作它的控制寄存器。

[圖2 & 圖3: Timer0/1/2 寄存器地址映射]

每個定時器都有一組獨立的寄存器。其中,最重要的就是控制寄存器 (TCR - Timer Control Register)

[圖4 & 圖5: TCR 寄存器位功能描述]

讓我們來認識一下TCR中最重要的幾個“開關”:

  • bit 15 (TIF): 中斷標志位 (Timer Interrupt Flag)

    • 當計數器減到 0 時,硬件會自動將該位置 1。

    • 我們必須在中斷服務函數中手動向該位寫 1?來清除它,否則中斷會不停地產生。

  • bit 14 (TIE): 中斷使能位 (Timer Interrupt Enable)

    • 只有將該位置 1,當計數器減到 0 時,才會向 PIE 發出中斷請求。

  • bit 5 (TRB): 重載控制位 (Timer Reload Bit)

    • 必須將該位置 1。當它為 1 時,每當定時器啟動或計數器歸零時,PRD?的值都會被重新加載到?TIM。這是實現周期性定時的關鍵。

  • bit 4 (TSS): 啟動/停止位 (Timer Start/Stop)

    • 寫 1 停止?定時器。

    • 寫 0 啟動?或?重新啟動?定時器。

三、軟件配置:五步點燃“心跳引擎”

TI 官方在?DSP2833x_CpuTimers.c?文件中為我們提供了一系列標準函數,極大地簡化了定時器的配置。結合這些庫函數,我們的配置流程非常清晰。

Step 1: 使能定時器外設時鐘

任何外設工作的前提都是有時鐘。

EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // 開啟 Timer 0 的時鐘
EDIS;
Step 2: 初始化定時器參數 (使用庫函數)

TI 提供了一個強大的函數?ConfigCpuTimer(),它能自動根據我們設定的 CPU 頻率和想要的定時周期(微秒),計算出正確的?PRD?周期值并寫入寄存器。

// 使用示例:
// 假設 Freq=150 (MHz), Period=500000 (us)
ConfigCpuTimer(&CpuTimer0, Freq, Period);```
?Step 3: 關聯中斷向量與 ISR
//在 PIE 中斷向量表中,將 TINT0 (定時器0中斷) 指向我們自己的中斷服務函數 `TIM0_IRQn`。
EALLOW;
PieVectTable.TINT0 = &TIM0_IRQn;
EDIS;```
Step 4: 開啟中斷通路并啟動定時器
// PIE 級:TINT0 屬于第1組第7個中斷
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// CPU 級
IER |= M_INT1;
// 全局
EINT;
// 啟動定時器!
CpuTimer0Regs.TCR.bit.TSS = 0;
Step 5: 編寫中斷服務函數 (ISR)

這是中斷發生時執行的代碼。記得在函數末尾進行中斷應答

interrupt void TIM0_IRQn(void)
{// ... 用戶功能代碼 ...// PIE 中斷應答PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

四、代碼實戰:雙燈齊“閃”,各司其職

下面的代碼將實現:

  • D2 指示燈:由 Timer0 中斷精確控制,每 500ms 翻轉一次。

  • D1 指示燈:在主函數?while(1)?循環中閃爍,證明 CPU 在沒有中斷時并未閑置。

time.h
#ifndef TIME_H_
#define TIME_H_#include "DSP2833x_Device.h"     // DSP2833x 頭文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相關頭文件// 聲明初始化函數和中斷服務函數
void TIM0_Init(float Freq, float Period);
interrupt void TIM0_IRQn(void);#endif /* TIME_H_ */
time.c
#include "time.h"
#include "leds.h"void TIM0_Init(float Freq, float Period)
{// Step 1: 使能時鐘EALLOW;SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;EDIS;// Step 3: 關聯中斷向量EALLOW;PieVectTable.TINT0 = &TIM0_IRQn;EDIS;// 手動進行一些基礎配置CpuTimer0.RegsAddr = &CpuTimer0Regs;CpuTimer0Regs.PRD.all  = 0xFFFFFFFF; // 先設為最大值CpuTimer0Regs.TCR.bit.TSS = 1;       // 確保停止CpuTimer0Regs.TCR.bit.TRB = 1;       // 使能重載CpuTimer0.InterruptCount = 0;// Step 2: 使用庫函數計算并配置周期ConfigCpuTimer(&CpuTimer0, Freq, Period);// Step 4: 開啟中斷通路并啟動定時器IER |= M_INT1;PieCtrlRegs.PIEIER1.bit.INTx7 = 1;CpuTimer0Regs.TCR.bit.TSS = 0; // 啟動!EINT;ERTM;
}// Step 5: 編寫 ISR
interrupt void TIM0_IRQn(void)
{EALLOW;LED2_TOGGLE; // 精確的周期性任務PieCtrlRegs.PIEACK.bit.ACK1 = 1; // 中斷應答EDIS;
}
main.c
#include "leds.h"
#include "time.h"void main()
{int i=0;InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();// 初始化定時器0,CPU頻率150MHz,定時周期500000us (0.5s)TIM0_Init(150, 500000);while(1){i++;if(i%2000==0){LED1_TOGGLE; // 主循環任務}DELAY_US(100);}
}

現象: 程序運行后,你會看到 D2 指示燈以非常精準的 1Hz 頻率在閃爍,而 D1 指示燈則以 `while` 循環的速度在閃爍。D2 的閃爍完全不受主循環中 `DELAY_US` 的影響,反之亦然。這完美地展示了前臺任務(中斷)和后臺任務(主循環)并行工作的場景。

### 總結

CPU 定時器中斷是嵌入式開發從“入門”走向“專業”的分水嶺。通過本次學習,你已經掌握了:
1. ?定時器的**硬件工作原理**:基于遞減計數器和周期寄存器實現周期性中斷。
2. ?**關鍵寄存器 TCR** 的配置方法,尤其是啟動、停止和重載位。
3. ?利用 TI 庫函數進行**標準化配置的完整流程**。
4. ?如何編寫中斷服務函數來執行**精確的周期性任務**。

定時器是操作系統的“時鐘節拍”、PWM生成的“基準”、任務調度的“指揮官”。精通了它,你就擁有了構建復雜、實時、高效嵌入式系統的核心能力。

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

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

相關文章

從零開始:用代碼解析區塊鏈的核心工作原理

區塊鏈技術被譽為信任的機器,它正在重塑金融、供應鏈、數字身份等眾多領域。但對于許多開發者來說,它仍然像一個神秘的黑盒子。今天,我們將拋開炒作的泡沫,深入技術本質,用大約100行Python代碼構建一個簡易的區塊鏈&am…

網絡通信IP細節

目錄 1.通信的NAT技術 2.代理服務器 3.內網穿透和內網打洞 1.通信的NAT技術 NAT技術產生的背景是我們為了解決IPV4不夠用的問題,NAT在通信的時候可以對IP將私網IP轉化為公網IP,全局IP要求唯一,但是私人IP不是唯一的。 將報文發給路由器進行…

國內真實的交換機、路由器和分組情況

一、未考慮擁擠情況理想狀態的網絡通信 前面我對骨干網: 宜春城區SDH網圖分析-CSDN博客 數據鏈路層MAC傳輸: 無線通信網卡底層原理(Inter Wi-Fi AX201)_ax201ngw是cnvio轉pci-e-CSDN博客 物理層、數據鏈路層、網絡層及傳輸層…

atomic常用類方法

Java中的java.util.concurrent.atomic包提供了多種原子操作工具類,以下是核心類及其方法:?1. AtomicBoolean??方法?:get():獲取當前值set(boolean newValue):強制設置值compareAndSet(boolean expect, boolean upd…

算法題打卡力扣第3題:無重復字符的最長子串(mid)

文章目錄題目描述解法一:暴力解解法二:滑動窗口題目描述 解法一:暴力解 遍歷每一個可能的子串,然后逐一判斷每個子串中是否有重復字符。 具體步驟: 使用兩層嵌套循環來生成所有子串的起止位置: 外層循環 i…

HTML5 簡介和基礎骨架

一、HTML5 簡介HTML5 是 HTML(超文本標記語言)的第五個主要版本,于 2014 年 10 月由 W3C(萬維網聯盟)正式發布。它不僅是對 HTML4.01 和 XHTML 的升級,更是一套完整的 Web 技術標準,包含了新的標…

.NET技術深度解析:現代企業級開發指南

每日激勵: “不要一直責怪過去的自己,他曾經站在霧里也很迷茫” 🌟 Hello,我是蔣星熠Jaxonic! 🌈 在浩瀚無垠的技術宇宙中,我是一名執著的星際旅人,用代碼繪制探索的軌跡。 &#x1…

蘋果手機文本轉音頻,自行制作背誦素材

當你在學習一段專業內容或者背誦重要知識點時,是不是有時會覺得眼睛看久了疲憊,而且記憶效果也不太理想呢?利用手頭的蘋果手機或iPad,你可以輕松將文本內容生成音頻文件,然后隨時隨地反復聽,這對于備考人士…

電子電子技術知識------MOSFET管

電子電子技術知識------MOSFET管前言一、結構與符號二、工作原理1.小功率MOSFET(橫向導電)2.電力MOS管三、基本特性總結前言 MOSFET是電力場效應晶體管的英文簡寫,又稱功率mos管,mos管 一、結構與符號 二、工作原理 1.小功率M…

仿真波導中超短脈沖傳輸中的各種非線性效應所產生的超連續譜

在波導中,超短脈沖傳輸時會受到各種非線性效應的影響,從而產生超連續譜。這些非線性效應包括自相位調制(SPM)、交叉相位調制(XPM)、四波混頻(FWM)等。基于MATLAB的仿真程序&#xff…

docker-compose的使用

目錄 1-查看容器 2-查看docker鏡像 3-運行兩個容器 4-進入idea 編寫docker-compose文件中的內容 5-編寫配置文件 6-運行 7-docker-compose中的一些命令 啟動服務 關閉服務 查看正在運行的容器 查看日志 重構新的服務 指令docker-compose 文件名 停止已運行的服務 啟動 重啟 1-查…

搭建分布式Hadoop集群[2025] 實戰筆記

文章目錄 一、實戰目標 二、集群規劃 1. 集群拓撲結構 2. 角色分配 說明: 三、環境準備 1. 修改 SSH 端口(安全加固) 操作步驟(所有節點執行): 2. FinalShell 連接配置 3. 防火墻配置 啟動并配置 firewalld: 關閉并禁用防火墻(生產環境建議精細配置,測試環境可關閉):…

【自記錄】Ubuntu20.04下Python自編譯

因為需要新的Python版本,但是我們不希望修改系統原生的Python版本避免某些系統應用無法啟動,因此自建一個干凈的路徑引入Python。 1.編譯 以下在aarch64下測試,x64下可能有差異 必須把相關的devel包安裝完畢,否則python可能缺功能…

Linux - 進程切換

🎁個人主頁:工藤新一 🔍系列專欄:C面向對象(類和對象篇) 🌟心中的天空之城,終會照亮我前方的路 🎉歡迎大家點贊👍評論📝收藏?文章 文章目錄進…

機器算法(五)模型選擇與調優

一 交叉驗證1 保留交叉驗證HoldOutholdOut Cross-validation(Train-Test Split)在這種交叉驗證技術中,整個技術集被隨機劃分為訓練集和驗證集。根據經驗法則,整個數據集的近70%被用作訓練集,其余30%被用作驗證集,也就是最常使用的…

Ubuntu 服務器實戰:Docker 部署 Nextcloud+ZeroTier,打造可遠程訪問的個人云

本次部署基于 Ubuntu 系統(桌面版 / Server 版通用,核心操作一致),硬件配置參考如下,低配置主機可順暢運行: ubuntu服務器配置如下 硬件類型具體型號/參數CPUIntel Core i3-6100T內存條8GB(DD…

移動硬盤刪除東西后,沒有釋放空間

請按照以下步驟,從最簡單、最常見的原因開始排查和解決:主要原因和解決方案1. 檢查操作系統回收站 (最常見原因!)這是最容易被忽略的一點。當您直接在外接移動硬盤上刪除文件時,文件并不會直接消失,而是被移到了該移動…

spring boot驢友結伴游網站的設計與實現(代碼+數據庫+LW)

摘要 本文介紹了基于Spring Boot框架開發的驢友結伴游網站的設計與實現。該網站旨在為旅行愛好者提供一個便捷的平臺,使他們能夠輕松地尋找伙伴、預定酒店、參與活動以及分享旅行經歷。系統主要分為兩大模塊:用戶模塊和管理員模塊。用戶可以通過注冊賬號…

人機之間的強交互與弱交互

人機交互不是簡單的人機,其本質是人機環境系統的交互。在這個系統中,人和機器不是孤立的存在,而是在特定環境下相互影響、相互作用的一部分。人機之間的強交互與弱交互可以從以下幾個方面來理解:1、人機強交互通常是指人與機器之間…

OpenCV 基礎知識總結

學習網站 https://zhuanlan.zhihu.com/p/483604320 命名空間 using namespace cv; Mat 作用 創建圖像(矩陣) 格式 Mat image; //創建一個空圖像image,大小為0 Mat image(100,100,CV_8U); //指定矩陣大小(矩陣行數/列數&#xff09…