惡補DSP:2.F28335的定時器系統

一、定時器原理

????????F28335 城市的三座時鐘塔(Timer0、Timer1、Timer2)是城市時間管理的核心設施,每座均為32位精度,依靠城市能源脈沖(系統時鐘 SYSCLKOUT,典型頻率為150 MHz)驅動。它們由兩個核心模塊組成:節奏調節站(預分頻模塊)計時核心站(定時/計數模塊),協同工作以實現精確計時。

  • 節奏調節站(預分頻模塊)

    • 節奏分頻器(16位定時器分頻寄存器 TDDRH:TDDR):決定城市能源脈沖的“放慢”倍數。例如,若 TDDR=9,則每10個脈沖(從0到9)產生一次有效信號,相當于將脈沖頻率除以10。
    • 節奏計數器(16位預定標計數器 PSCH:PSC):記錄收到的脈沖數。每次脈沖到來,PSC 減1;當 PSC 減到0時,觸發“下溢”,向計時核心站發送信號,并重新裝載 TDDR 的值,開始下一輪計數。
  • 計時核心站(定時/計數模塊)

    • 周期藍圖(32位周期寄存器 PRDH:PRD):定義一次完整計時周期的長度,決定時鐘塔多久敲響一次“鐘聲”。
    • 計時器(32位計數寄存器 TIMH:TIM):記錄當前計時進度。每次從節奏調節站收到信號,TIM 減1;當 TIM 減到0時,觸發“下溢”,產生“鐘聲”(中斷信號),并重新裝載 PRD 的值。

工作流程如下:

  1. 城市能源脈沖(SYSCLKOUT)每跳動一次,節奏計數器(PSC)減1。
  2. 當 PSC 減到0,觸發下溢,向計時器(TIM)發送信號,TIM 減1,同時 PSC 重新裝載 TDDR 的值。
  3. 當 TIM 減到0,觸發下溢,產生中斷信號(TINT0、TINT1 或 TINT2),通知中央政府(CPU),并重新裝載 PRD 的值,循環往復。

????????時鐘塔的“鐘聲”通過城市通信網絡(PIE 中斷系統)傳遞,Timer0 的中斷(TINT0)屬于第一組第七個小信號(PIEIER1.bit.INTx7)。中斷信號經過 PIE 模塊處理后到達中央政府,確保任務按時執行。

周期計算公式


定時周期 = (PRD + 1) × (TDDR + 1) × (1 / SYSCLKOUT)


例如,若 SYSCLKOUT=150 MHz(周期6.67 ns),PRD=14999999,TDDR=9,則定時周期為:
(14999999 + 1) × (9 + 1) × 6.67 ns = 15000000 × 10 × 6.67 ns = 1秒。

二、具體代碼

2.1?ConfigCpuTimer 函數

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{Uint32 temp;// Initialize timer period:Timer->CPUFreqInMHz = Freq;Timer->PeriodInUSec = Period;temp = (long)(Freq * Period);Timer->RegsAddr->PRD.all = temp;// Set pre-scale counter to divide by 1 (SYSCLKOUT):Timer->RegsAddr->TPR.all = 0;Timer->RegsAddr->TPRH.all = 0;// Initialize timer control register:Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart TimerTimer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timerTimer->RegsAddr->TCR.bit.SOFT = 0;Timer->RegsAddr->TCR.bit.FREE = 0;     // Timer Free Run DisabledTimer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt// Reset interrupt counter:Timer->InterruptCount = 0;
}
功能概述

ConfigCpuTimer 是城市提供的一套標準管理工具(庫函數),用于配置任意一座時鐘塔(Timer0、Timer1 或 Timer2)的運行參數。根據城市需求調整時鐘塔的節奏和計時周期,確保其“鐘聲”(中斷信號)按預期時間響起。該函數接受三個參數:

  • Timer:指向時鐘塔管理結構(CPUTIMER_VARS)的指針,包含時鐘塔的寄存器地址、頻率、周期等信息。
  • Freq:城市能源脈沖頻率(單位:MHz,例如 150 MHz)。
  • Period:期望的計時周期(單位:微秒,例如 500000 表示 500ms)。
詳細分析
  1. 參數存儲

Timer->CPUFreqInMHz = Freq;
Timer->PeriodInUSec = Period;
    • 將輸入的頻率和周期存儲到?Timer?結構中,便于后續管理和調試。
    • 例如,若 Freq=150,Period=500000,則記錄 CPU 頻率為 150 MHz,周期為 500ms。
  1. 計算周期藍圖(PRD 值)

temp = (long)(Freq * Period);
Timer->RegsAddr->PRD.all = temp;
  • 計算周期寄存器(PRD)的值,決定時鐘塔敲響“鐘聲”的時間間隔。
  • 公式:PRD = Freq * Period,其中 Freq(MHz)× Period(微秒)= 周期脈沖數。
  • 示例:若 Freq=150 MHz,Period=500000 微秒(500ms),則:
PRD = 150 * 500000 = 75000000
    • 表示時鐘塔需要計數 75000000 個脈沖(每個脈沖 6.67 ns,150 MHz 的倒數),對應 500ms。
    • 注意:實際硬件實現中,PRD 寄存器從 0 計數到 PRD 值(含 0,共 PRD+1 次),但此處代碼直接使用?Freq * Period,未減 1,可能導致周期略偏,實際周期為 (PRD+1) × (1/SYSCLKOUT)。開發者需根據硬件手冊驗證是否需要調整。
  1. 設置節奏調節站(TPR/TPRH)

Timer->RegsAddr->TPR.all = 0;
Timer->RegsAddr->TPRH.all = 0;
  • 將預定標寄存器(TPR/TPRH)清零,表示不使用分頻(TDDR=0,PSC=0)。
  • 此時,SYSCLKOUT 的每個脈沖直接驅動 TIM 計數器減 1,分頻系數為 1。
  • 公式:定時周期 = (PRD+1) × (TDDR+1) × (1/SYSCLKOUT),由于 TDDR=0,周期簡化為:

定時周期 = (PRD+1) × (1/SYSCLKOUT)
示例:PRD=75000000,SYSCLKOUT=150 MHz(周期 6.67 ns),則:

定時周期 = (75000000+1) × 6.67 ns ≈ 500000006.67 ns ≈ 500ms
4.配置時鐘塔控制面板(TCR)

Timer->RegsAddr->TCR.bit.TSS = 1;      // 停止時鐘塔
Timer->RegsAddr->TCR.bit.TRB = 1;      // 啟用重載
Timer->RegsAddr->TCR.bit.SOFT = 0;     // 非軟啟動
Timer->RegsAddr->TCR.bit.FREE = 0;     // 非自由運行
Timer->RegsAddr->TCR.bit.TIE = 1;      // 啟用中斷
  • TSS=1:停止時鐘塔(Timer Stop Status),確保在配置期間不運行。
  • TRB=1:啟用重載(Timer Reload Bit),當 TIM 計數器歸零時,自動從 PRD 重新裝載值。
  • SOFT=0, FREE=0:禁用軟啟動和自由運行模式,確保時鐘塔在調試時暫停,適合精確控制。
  • TIE=1:啟用中斷(Timer Interrupt Enable),允許時鐘塔在 TIM 歸零時產生“鐘聲”(中斷信號)。

5.重置中斷計數

Timer->InterruptCount = 0;
  • 清零中斷計數器,記錄時鐘塔觸發的中斷次數(用于調試或統計)。

2.2?TIM0_Init 函數

void TIM0_Init(float Freq, float Period)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0EDIS;EALLOW;PieVectTable.TINT0 = &TIM0_IRQn;EDIS;CpuTimer0.RegsAddr = &CpuTimer0Regs;CpuTimer0Regs.PRD.all = 0xFFFFFFFF;CpuTimer0Regs.TPR.all = 0;CpuTimer0Regs.TPRH.all = 0;CpuTimer0Regs.TCR.bit.TSS = 1;CpuTimer0Regs.TCR.bit.TRB = 1;CpuTimer0.InterruptCount = 0;ConfigCpuTimer(&CpuTimer0, Freq, Period);CpuTimer0Regs.TCR.bit.TSS = 0;IER |= M_INT1;PieCtrlRegs.PIEIER1.bit.INTx7 = 1;EINT;ERTM;
}
詳細分析
  1. 啟動能源供應

    EALLOW; SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; EDIS;
    • 打開 Timer0 的能源開關(PCLKCR3.bit.CPUTIMER0ENCLK=1),連接城市電力網絡(SYSCLKOUT)。
    • EALLOW 和 EDIS 用于解除和恢復寄存器寫保護,確保安全操作。
  2. 設置中斷通信地址

    EALLOW; PieVectTable.TINT0 = &TIM0_IRQn; EDIS;
    • 將 Timer0 的“鐘聲”(TINT0 中斷)映射到中斷服務函數?TIM0_IRQn?的地址(中斷向量表 INT1)。
    • 確保中央政府(CPU)在收到 TINT0 信號時調用正確的響應程序。
  3. 初始化 Timer0 寄存器

    CpuTimer0.RegsAddr = &CpuTimer0Regs; CpuTimer0Regs.PRD.all = 0xFFFFFFFF; CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TSS = 1; CpuTimer0Regs.TCR.bit.TRB = 1; CpuTimer0.InterruptCount = 0;
    • CpuTimer0.RegsAddr:指定 Timer0 的寄存器地址,綁定管理結構。
    • PRD.all = 0xFFFFFFFF:初始化周期藍圖為最大值(32位全1),為后續配置留空間。
    • TPR.all = 0, TPRH.all = 0:清零節奏調節站(TDDR 和 PSC),默認不分頻。
    • TCR.bit.TSS = 1:停止時鐘塔,確保配置期間不運行。
    • TCR.bit.TRB = 1:啟用重載功能。
    • InterruptCount = 0:清零中斷計數。
  4. 調用 ConfigCpuTimer

    ConfigCpuTimer(&CpuTimer0, Freq, Period);
    • 調用?ConfigCpuTimer?設置 Timer0 的周期(PRD = Freq × Period)和運行參數(TCR、TPR/TPRH)。
    • 示例:Freq=150 MHz,Period=500000 微秒,PRD=75000000,對應 500ms。
  5. 啟動時鐘塔并啟用中斷

    CpuTimer0Regs.TCR.bit.TSS = 0; IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; EINT; ERTM;
    • TCR.bit.TSS = 0:啟動 Timer0 時鐘塔,開始計數。
    • IER |= M_INT1:啟用 CPU 第一組中斷(INT1,包含 TINT0)。
    • PieCtrlRegs.PIEIER1.bit.INTx7 = 1:啟用 PIE 第一組第七小中斷(TINT0)。
    • EINT:啟用全局中斷。
    • ERTM:啟用實時中斷模式,確保中斷處理不被調試暫停。

3. TIM0_IRQn 中斷

interrupt void TIM0_IRQn(void)
{EALLOW;LED2_TOGGLE;PieCtrlRegs.PIEACK.bit.ACK1 = 1;EDIS;
}

TIM0_IRQn 是 Timer0 的中斷服務函數(ISR),相當于時鐘塔敲響“鐘聲”時中央政府的響應程序。它在 Timer0 計數器(TIM)歸零時觸發,負責翻轉 D2 信號燈狀態并清除中斷標志,確保下次“鐘聲”正常觸發。

詳細分析
  1. 解除寫保護

    EALLOW;
    • 解除寄存器寫保護,允許操作 PIE 寄存器。
  2. 翻轉 D2 信號燈

    LED2_TOGGLE;
    • 調用宏?LED2_TOGGLE,翻轉 D2 信號燈的電平(高變低,低變高)。
    • 實現效果:每次中斷觸發,D2 信號燈狀態切換,周期為 500ms(由?ConfigCpuTimer?設置),即每 500ms 點亮或熄滅。
  3. 清除中斷標志

    PieCtrlRegs.PIEACK.bit.ACK1 = 1;
    • 清除 PIE 第一組中斷的確認標志(ACK1),通知通信網絡(PIE)已處理本次中斷。
    • 若不清除,PIE 將阻止下一次 TINT0 中斷觸發,導致時鐘塔“鐘聲”失效。
  4. 恢復寫保護

    EDIS;
    • 恢復寄存器寫保護,確保系統安全。

TIM0_IRQn 是 Timer0 中斷的響應核心,簡潔高效地處理 D2 信號燈的閃爍任務,并通過清除標志位保證中斷系統的正常運行。其執行時間需盡量短,以避免影響其他任務。


綜合流程:

  1. 初始化(TIM0_Init)

    • 打開 Timer0 能源(PCLKCR3),設置中斷地址(TINT0 → TIM0_IRQn)。
    • 初始化寄存器(PRD=0xFFFFFFFF,TPR/TPRH=0,TSS=1,TRB=1)。
    • 調用?ConfigCpuTimer?設置 PRD=75000000(500ms),啟用中斷(TIE=1)。
    • 啟動 Timer0(TSS=0),啟用 PIE 中斷(INT1、INTx7)和全局中斷。
  2. 運行

    • Timer0 接收 SYSCLKOUT 脈沖(150 MHz),TIM 計數器從 75000000 減到 0。
    • 每 500ms(75000001 × 6.67 ns),TIM 歸零,觸發 TINT0 中斷。
  3. 中斷處理(TIM0_IRQn)

    • 翻轉 D2 信號燈狀態。
    • 清除 PIEACK 標志,準備下次中斷。

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

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

相關文章

用倒計時軟件為考研備考精準導航 復習 模擬考試 日期倒計時都可以用

考研,是一場與時間的博弈。從決定報名的那一刻起,日歷上的每一個數字都被賦予了特殊意義 —— 報名截止日、現場確認期、初試倒計時、成績查詢點…… 這些節點如同航標,指引著備考者的方向。而在這場漫長的征途里,一款精準、易用的…

React學習(七)

目錄:1.react-進階-antd-搜索2.react-進階-antd-依賴項說明 3.react-進階-antd-刪除1.react-進階-antd-搜索我們jsx代碼里只能返回一個最頂層的根元素下拉框簡化寫法:把這個對象結構賦值一下:清空定義個參數類型做修改事件需要定義三個…

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)進程間通信(IPC)的比較

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1 或 localhost)都是進程間通信(IPC)的方式,但它們在實現、性能和適用場景上有顯著區別。以下是兩者的對比:1. 通信機制Unix Domain…

SQL中對時間操作的函數

以下是SQL中常用時間操作函數的匯總,按功能分類整理,結合多個權威來源內容綜合而成: 一、獲取當前時間 函數名稱功能說明示例適用數據庫CURDATE()獲取當前日期(不含時間)SELECT CURDATE(); → 2024-08-21MySQL, Mari…

NUS PC5215 Lecture分析 Week1 Python基礎

NUS PC5215 Lecture分析 Week1 Python基礎前言Python基礎數據類型保留字表達式Import 相關庫IEEE浮點數前言 課程網站 作為一名計算機本科畢業的學生,該課程有點類似于本科期間學的數值分析的進化版,大抵是教會你如何實現各種方法,諸如蒙特卡…

模型私有化部署(Ollama vLLM LMDeploy)

一、魔塔社區平臺介紹 1.1 什么是魔塔社區? 魔塔(ModelScope)是由阿里巴巴達摩院推出的開源模型即服務(MaaS)共享平臺,匯聚了計算機視覺、自然語言處理、語音等多領域的數千個預訓練AI模型。其核心理念是…

C++編程實踐--資源管理、標準庫、并發與并行

文章目錄 資源管理 資源訪問 指向資源句柄或描述符的變量,在資源釋放后立即賦予新值 lambda函數 當lambda會逃逸出函數外面時,禁止按引用捕獲局部變量 避免lambda表達式使用默認捕獲模式 資源分配與回收 避免出現delete this操作 使用恰當的方式處理new操作符的內存分配錯誤 …

“R語言+遙感”的水環境綜合評價方法實踐技術應用

專題一、R語言概述1.1 R語言特點(R語言)1.2 安裝R(R語言)1.3 安裝RStudio(R語言)(1)下載地址(2)安裝步驟(3)軟件配置1.4 第一個程序He…

【項目復盤】【四軸飛行器設計】驅動開發部分

由于在參加面試時總需要花時間一點一點的回憶自己的項目內容,故我打算直接寫一系列的項目復盤博客,方便每次面試前的回憶。內容僅作分享交流,如有謬誤歡迎指正。 本項目系列的文章目錄如下: 【項目復盤】【四軸飛行器設計】驅動…

wpf之ComboBox

前言 wpf中ComboBox的應用非常廣泛&#xff0c;本文就來介紹ComboBox在wpf中的應用。 1、非MVVM模式下 1.1 xaml添加元素<ComboBox x:Name"cbx_test1" SelectedIndex" 0" ><ComboBoxItem >小明</ComboBoxItem ><ComboBoxItem &g…

從零開始學AI——13

前言 夏天快要過去&#xff0c;本書也快接近尾聲了。 第十三章 13.1 半監督學習 在此之前&#xff0c;我們討論的所有學習范式都具有非常明確的邊界條件&#xff1a; 監督學習&#xff1a;我們擁有大量帶標簽的數據樣本(xi,yi)(x_i, y_i)(xi?,yi?)&#xff0c;目標是學習從輸…

k8sday12數據存儲(1/2)

目錄 一、簡單基本存儲 1、EmptyDir 1.1概念 1.2作用 1.3配置文件 1.4測試 2、HostPath 2.1概念 2.2作用 2.3配置文件 2.4測試 ①、數據共享 ②、持久化存儲 3、NFS 3.1概念 3.2作用 3.3NFS服務安裝 ①、設置主節點為NFS服務器 ②、給副節點安裝NFS客戶端工…

Spring Framework 常用注解詳解(按所屬包分類整理)

在使用 Spring Framework 進行開發時&#xff0c;注解&#xff08;Annotation&#xff09;是實現 依賴注入&#xff08;DI&#xff09;、組件掃描、AOP 切面、事務管理 和 Web 請求映射 的核心手段。Spring 提供了豐富且結構清晰的注解體系&#xff0c;這些注解按照功能被組織在…

ROADS落地的架構藍圖

2 ROADS落地的架構藍圖 將ROADS體驗從理念轉化為現實&#xff0c;需要一套完整且自頂向下的架構藍圖作為支撐。華為的實踐表明&#xff0c;數字化轉型的成功依賴于多個架構層次的協同推進&#xff0c;而非單點技術的應用。該藍圖通常包含以下五個關鍵層次&#xff0c;每一層都承…

如何構建一個神經網絡?從零開始搭建你的第一個深度學習模型

在深度學習的海洋中&#xff0c;神經網絡就像一艘船&#xff0c;承載著數據的流動與特征的提取。而構建一個神經網絡&#xff0c;就像是在設計這艘船的結構。本文將帶你一步步了解如何使用 PyTorch 構建一個完整的神經網絡模型&#xff0c;涵蓋網絡層的組織、前向傳播與反向傳播…

自學嵌入式第二十三天:數據結構(3)-雙鏈表

一、strtokchar * strtok(char *s1,char *s2);截斷字符串&#xff0c;在s1字符串中找到s2截取前一段返回&#xff0c;如需要再次截取剩余段&#xff0c;再使用此函數s1輸入NULL即可&#xff1b;二、bzerobzero(char *p,size_t size);清零,從p地址開始&#xff0c;清零size個bit…

河南萌新聯賽2025第六場 - 鄭州大學

暑期集訓已經接近尾聲&#xff0c;一年六場的暑期萌新聯賽也已經結束了&#xff0c;進步是比較明顯的&#xff0c;從一開始的七八百名到三四百名&#xff0c;雖然拿不出手&#xff0c;但是這也算對兩個月的集訓的算法初學者的我一個交代。 比賽傳送門&#xff1a;河南萌新聯賽…

2-1.Python 編碼基礎 - 基礎運算符(算術運算符、賦值運算符、比較運算符、邏輯運算符)

一、算術運算符 1、基本介紹編號運算符說明示例輸出結果1兩數相加10 20302-兩數相減10 - 20-103*兩數相乘&#xff0c;或者返回一個被重復若干次的字符串10 * 202004/兩數相除10 / 200.55//兩數相除并返回商的整數部分9 // 246%兩數相除并返回余數10 % 507**冪運算10 ** 21002…

CMOS知識點 MOS管不同工作區域電容特性

知識點14&#xff1a;MOSFET的電容主要來源于其物理結構&#xff1a;柵氧層電容&#xff1a;柵極&#xff08;G&#xff09;與襯底&#xff08;B&#xff09;、溝道、源&#xff08;S&#xff09;、漏&#xff08;D&#xff09;之間隔著二氧化硅絕緣層&#xff0c;自然形成電容…

預測性維護+智能優化:RK3568+FPGA方案在儲能行業的應用

在儲能行業&#xff0c;RK3568FPGA方案通過預測性維護和智能優化技術&#xff0c;顯著提升系統可靠性和經濟性。該方案采用異構架構&#xff08;FPGA處理高速信號采集&#xff0c;RK3568負責策略計算與通信管理&#xff09;&#xff0c;實現微秒級響應和精準控制。?26一、預測…