1. 程式人生 > >DSP:C54x定時器及使用定時器產生led的1s週期閃爍

DSP:C54x定時器及使用定時器產生led的1s週期閃爍

一、C54x的片內定時器是一個可程式設計的定時器,同時可以用於週期性地產生中斷,為16位計數器。定時器主要由定時器暫存器TIM、定時週期暫存器PRD、定時控制暫存器TCR(包括分頻係數TDDR、預標定計數器PSC、控制位TRB和TSS等)及相應的邏輯控制電路組成。TIM是一個減1計數器,PRD用來存放定時時間常數(TIM暫存器的初值)。

TCR中包括定時器的控制位和狀態位,具體如下:

                                                 

對於上圖中的各控制位的功能描述如下:

TDDR:定時器的分頻係數,最大預標定值為16,最小為1。用此分頻係數對CLKOUT進行分頻,以改變定時週期。當PSC(該計數器存放的初值等於TDDR的值)減到0時,用TDDR的值載入到PSC。

TSS:定時器停止狀態位,用於啟動和停止定時器。TSS為0時定時器啟動,TSS為1時定時器停止。

TRB:定時器重新載入位,用於復位片內定時器。TRB為1時,用PRD中的值載入TIM,以及TDDR中的值載入PSC。

PSC:定時器預標定計數器,其標定值為0到16(TDDR的值的範圍),當PSC的值減為0時,TDDR的值載入到PSC,TIM減1。

FREE和SOFT:SOFT和FREE為00時定時器立即停止工作;SOFT和FREE為10時,定時器當減為0時停止工作;SOFT為任意值而FREE為1時,定時器繼續工作。

二、PLL乘數(鎖相環)

鎖相環PLL具有頻率放大和時鐘訊號的提純作用,利用PLL可以為晶片提供高穩定頻率的時鐘訊號,同時還可以對外部時鐘頻率進行倍頻,例如外部時鐘為10Mhz,DSP時鐘頻率為25Mhz,則PLL=25/10 = 2.5。PLL的設定受時鐘方式暫存器CLKMD控制,其暫存器內容如下:


對於上面的暫存器設定,下面舉幾個例子:

若設定為PLL X 1方式,則CLKMD設定為0X03EFH,若設定為PLL X 4方式,則CLKMD設定為0X43EFH,也就是說若設定為PLL X a方式(a為整數),則LCKMD設定為0X(a - 1)3EFH;若設定的PLL乘數為小數,如PLL X 2.5方式(一位小數),則CLKMD設定為0X4BEFH(將十六進位制形式的最高位設定為2.5*2 - 1即4,次高位為B則可設定為小數形式的乘數;若設定為PLL X 1.25(兩位小數),將CLKMD設定為0X5BEFH(將十六進位制的最高位設定為1.25*4即5,次高位設定為B),其他同理。

三、定時器的工作工程

定時器的工作過程是將定時分頻係數TDDR和週期PRD分別載入到TCR和PRD暫存器中(TDDR和PRD由計算得出),定時器的基準工作脈衝由CLKOUT(DSP時鐘<CPU時鐘>)提供,定時器的基本定時時間公式為

定時週期 = CLKOUT * ( TDDR +1 ) * ( PRD + 1 )

通過對定時週期的確定,再代入公式即可計算出TDDR和PRD(均為整數,其中TDDR取值為0到15,PRD取值為0到65535)。

四、C54X型DSP晶片定時器使用舉例(彙編實現)

DSP的XF端外接LED,利用定時器中斷實現LED以每1s的頻率閃爍。(DSP的時鐘頻率為10Mhz,PLL X 1方式)。

關於上述的問題,具體流程是先對堆疊進行設定(堆疊指標SP的設定),接著是PLL設定(CLKMD),再接著是中斷向量表指標的設定(IPTR,PMST的高9位),還有就是定時器的設定(TCR、PRD)和定時中斷的設定(IFR、IMR),最後是等待中斷進入中斷服務函式。

對於TDDR和PRD的計算,首先確定了定時週期為0.5s,代入公式發現(PRD + 1) * (TDDR + 1)最大為65536*16,此時該值並不滿足T定時/TCLKOUT的值5*10的6次方。這是通過一次中斷嘗試去實現XF的值的翻轉,但無法實現目的。為了實現目的,可通過更多次中斷如10次來實現XF的值的翻轉,從而定時週期就縮短到了0.05s,這時可以設TDDR為9,則PRD為4999.

主程式:

          .mmregs              //宣告暫存器
          .global     start    //宣告全域性
          .global     TINT_ISR
          .bss        XF_Flag,1 //XF為設定
          .bss        count,1   //計數變數設定
stack     .uset      "STACK",10H
          .text
start:     STM        #stack+10H,SP
           STM        #0,CLKMD
           STM        #9,AR1
status:LDM            CLKMD,A
            AND       #01H,A
            BC        status,ANEQ
            STM       #03EFH,CLKMD //PLL * 1

中斷向量表指標:
    LDM    PMST,A
    AND    #7FH,A //清零高九位
    OR      #0080H,A //高九位放入累加器A
    STLM   A,PMST
    STM    #10H,TCR
    STM    #4999,PRD //分頻係數設定
    STM    #29H,TCR  //週期數設定
    STM    #0008H,IFR
    STM    #0008H,IMR
    RSBX   INTM
end: B,    end //相當while(1),等待中斷

中斷服務函式:
TINT_ISR:
             PSHM,ST0
             BANZ  NEXT,*AR1-    //AR1不為0時跳轉到NEXT
             STM    #9,AR1       //計數10次
             STM    #XF_Flag,AR2 
             BITF   *AR2,#01H    
             BC      S01,NTC
             RSBX  XF           //XF端置為0
             ST      #0,*AR2    //XF狀態設為0
             B        NEXT
S01:         SSBX   XF          //XF端置為1
             ST       #1,*AR2   //XF狀態設為1
NEXT:        POPM  ST0
             RETE


相關推薦

DSPC54x定時使用定時產生led的1s週期閃爍

一、C54x的片內定時器是一個可程式設計的定時器,同時可以用於週期性地產生中斷,為16位計數器。定時器主要由定時器暫存器TIM、定時週期暫存器PRD、定時控制暫存器TCR(包括分頻係數TDDR、預標定

類的學習筆記(3)——自定義裝飾裝飾的理解

例一: 實現多加100 def fun1(x):      def fun2(y):           return x(y)+100       return fun2              #裝飾器 def ff(y):       return y*y   

CSS選擇選擇優先順序

CSS選擇器:    css選擇器有四種,標籤名選擇器,id選擇器,class選擇器,屬性選擇器,其中屬性選擇器權重最低且不常用    兩個選擇器A和B使用,連寫時,表示選擇滿足A或滿足B的元素#p2,#p3{     color: blue; }    兩個選擇器A和B使用

JavaEE--SSH--structs2-自定義多個攔截攔截鏈(棧)的使用演示

之前我已經介紹過了自定義攔截器的使用方法.通常我們使用攔截器來對action請求進行功能增強.但是在使用自定義攔截器後會導致struts2內建的攔截器失效.這樣就會影響action的正常存取引數.下面我來演示一下如何避免這種情況的發生.1.首先建立專案2.匯入struts2的

struts2之自定義攔截攔截生命週期分析

一,概述 本文主要是關於怎樣自定義攔截器及通過自定義的攔截器來了解攔截器的生命週期. 二,自定義攔截器 1)寫一個攔截器類HelloInterceptor,它實現了Interceptor介面. pac

第34天日期函數、定時、倒計時

spl inner function nth 設置 gin dem 案例 支持 一、日期函數(Date())設置本地日期:年月日時分秒1、聲明日期var date=new Date();//創建一個新的日期函數2、使用函數date.getTime();//提倡使用,date

Go語言中時間函數定時的使用

Go語言時間函數 Go語言定時器 Go語言中時間函數及定時器、休眠等功能的實現和使用,代碼如下,有需要的小夥伴直接拿去 package main import ( "time" "fmt" ) func main() { // 設置時區,如果name是""或"UTC",返回

spring定時時間寫法

1.秒(0–59) 2.分鐘(0–59) 3.小時(0–23) 4.月份中的日期(1–31) 5.月份(1–12或JAN–DEC) 6.星期中的日期(1–7或SUN–SAT) 7.年份(1970–2099) 秒 0-59 , - * /

JS學習筆記 Date物件定時操作

1.Date物件基本使用 <script> // 1. 宣告日期物件 var date = new Date(); // console.log(date); console.log(date.getDate()); // 日 console

Quartz擴茲初級實驗定時--任務排程

pom.xml:依賴  <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200

5.STM32F407ZG時鐘系統定時SYSTICK的使用

1.系統時鐘樹: LSI:低速內部時鐘(RC震盪器),32kHz,提供低功耗時鐘,用於看門狗和自動喚醒單元。 LSE:低速外部時鐘,外接32.768kHz的石英晶體。 HSI:高速內部時鐘16MHz,RC振盪器,精度不高,可用作系統時鐘或PLL輸入。 HSE:高速

Executor 之 執行緒池定時

1. Executor系列介面 Executor用於解耦任務(Runnable)提交者和執行者,它只有一個方法void execute(Runnable command),通過呼叫它向執行者提交任務,但無法知道執行的結果/進度,也無法拿到任務返回值。 Executor

51微控制器的延時定時

2.軟體延時:軟體延時有時候不能夠做到非常精確地延時,主要靠迴圈體或是一些無意義的指令來完成。 微控制器都有一個屬於自己的晶振頻率:11.0592Mhz(主要是為了設定波特率的方便),12Mhz,6Mhz等(後面的例子全都用12M晶振)。對於12Mhz的晶振頻率,一個機器週期為1us,對於51微控制器的庫

Java多種方式實現倒計時定時

多種方式實現倒計時定時器 1、簡易方式實現 /** * @see * @author Al_assad [email protected] * @date 2016年10月18日 上

spring定時cron表示式

在Spring中有兩種流行配置:Java的Timer類和OpenSymphony的Quartz。  1.Java Timer定時  首先繼承java.util.TimerTask類實現run方法  import java.util.TimerTask;  public class EmailReport

JavaScript 的定時內建物件

定時器 (1)setInterval();迴圈定時器:固定時間間隔指定一次,像鬧鐘 一樣,不關閉繼續執行。 (2)setTimeout();炸彈定時器:只執行一次,不能執行下一次了。 1. SetInterval() 語法結構: setInterval(code,millisec,lan

Java定時 spring定時cron表示式(quartz中時間表達式)

 spring定時器及cron表示式(quartz中時間表達式) 在Spring中有兩種流行配置:Java的Timer類和OpenSymphony的Quartz。 1.Java Timer定時 首先繼承java.util.TimerTask類實現run方法 i

STM32學習筆記(3)系統時鐘和SysTick定時

2011年3月21日 系統時鐘和SysTick定時器 1.  STM32的時鐘系統 在STM32中,一共有5個時鐘源,分別是HSI、HSE、LSI、LSE、PLL (1)HSI是高速內部時鐘,RC振盪器,頻率為8MHz; (2) HSE是高速外部時鐘,可接石英/陶

微控制器中斷原理定時詳解

一、中斷系統1.1.中斷的概念什麼是中斷:CPU在處理某一事件A時,發生的另外某一事件B請求CPU去處理(產生了中斷),隨後CPU暫時中斷當前正在執行的任務,去對事件B進行處理,CPU處理完事件B後再返回之前中斷的位置繼續執行原來的事件A,這一過程總稱為中斷。1.2.中斷流程

AJAX教程系列五非同步資料獲取與定時

window.onload = function() { var oBtn = document.getElementById('btn'); oBtn.onclick = function() { /*ajax({ url : 'getN