1. 程式人生 > >CC2541之定時器1(轉)

CC2541之定時器1(轉)

建議讀者閱讀原文,確保獲得完整的資訊

CC2541定時器1有5個捕獲/比較通道,首先介紹什麼是捕獲和比較功能。

捕獲通道:

設定的捕獲開始的時候,CPU會將計數暫存器的值複製到捕獲比較暫存器中並開始計數,當再次捕捉到電平變化時,這時

計數暫存器中的值減去剛才複製的值就是這段電平的持續時間,你可以設定上升沿捕獲、下降沿捕獲、或者上升沿下降沿

都捕獲。捕獲通道可以用來測量訊號的頻率週期或者波形的寬度,捕獲通道類似於秒錶的功能。

比較通道:

這裡有兩個單元:一個計數器單元和一個比較單元,比較單元就是個雙緩衝暫存器,比較單元的值是可以根據不同的模式

設定的,與此同時,計數器在不停的計數,並不停的與比較暫存器中的值進行比較,當計數器的值與比較暫存器的值相等

的時候一個比較匹配就發生了,根據設定,可以產生不同的波形。對於定時器1,計數器單元就是2個8位的SFR:T1CNTH

和T1CNTL,比較單元就是2個8位的暫存器T1CCxH和T1CCxL(x:0~4)。而對於定時器3(4),計數器單元是暫存器

T3CNT(T4CNT),比較單元是暫存器T3CC0和T3CC1(T4CC0和T4CC1)。比較通道可以用來產生特定的波形,輸

PWM波,比較通道類似於鬧鐘的功能。

CC2541的輸入捕獲功能

輸入捕獲功能一般用的比較少,當定時器1的某一個通道被配置為輸入捕獲通道,那麼對應的I/O引腳則自動配置為輸入,

需要再通過配置暫存器PxDIR設定為輸入,在定時器開始計數後,在外部輸入訊號的上升沿、下降沿或者兩個沿到來時觸

發16位的計數器T1CNT的計數值裝入對應通道的捕獲/比較暫存器T1CCxH:T1CCxL。注意根據沿到來的時間間隔選擇合

理的定時器時鍾,假如外部訊號每隔幾us沿發生變化,但是定時器的時鐘週期是幾ms,顯然捕獲不到外部的沿變化。具體

應用時,可以在斷服務程式裡把通道的捕獲值T1CCxH:T1CCxL讀到一個變數裡,如果要測量一個訊號的頻率,可以將

第二次捕獲的變數減去第一次捕獲的變數,得到的是訊號的週期,倒數就是頻率。但是有一個問題,假如說兩次捕獲的上升

沿(或下降沿)的時間間隔大於時鐘的週期,定時器溢位又從0x0000開始計數,那麼這兩次的計數值之差肯定就不對了,

所以在應用之前還得估計一下外部訊號的週期以選擇合適的時鐘週期,太麻煩了!所以一般來說我們不用它來測量脈寬或者

訊號週期頻率。這個輸入捕獲功能當做觸發用特別合適,當檢測到外部訊號的沿變化時,在中斷服務程式裡完成相應的功能,

比如觸發採集。

另外注意:輸入捕獲功能,在讀取T1CCxH:T1CCxL時,必須先讀取T1CCxL,再讀取T1CCxH

下面重點講解定時器1的通道輸出比較功能。

CC2541的輸出比較功能:

在輸出比較模式時,I/O引腳被配置為輸出功能,需要再通過配置暫存器PxDIR設定為輸出引腳在定時器開始工作後,計數

值不斷和對應通道的捕獲/比較暫存器T1CCxH:T1CCxL比較,如果兩者相等,那麼輸出引腳就會根據T1CCTLn.CMP的配置發生

置1、清0、翻轉等變化。T1CCTLn.CMP的定義根據通道的不同也不一樣,比如通道1暫存器T1CCTL1定義如下:

T1CCTL1.MODE是選擇定時器1通道的模式,1:輸出比較模式,0:輸入捕獲模式

T1CCTL1.IM是通道的中斷使能標誌,1:開通道中斷,0:關通道中斷

T1CCTL1.CAP用來選擇輸入捕獲沿的選擇, 當通道處於輸出比較模式時,T1CCTL1.CAP配置為00

  • 01:上升沿捕獲
  • 10:下降沿捕獲
  •  11:上升沿和下降沿都捕獲

T1CCTL1.CMP是輸出比較模式的選擇,對於通道1來說有7種模式,分別為

  • 000:當計數值等於T1CCxH:T1CCxL時,輸出引腳置1
  • 001:當計數值等於T1CCxH:T1CCxL時,輸出引腳清0
  • 010:當計數值等於T1CCxH:T1CCxL時,輸出引腳電平翻轉
  • 011:在正計數/倒計數模式下,在計數增加階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳置1,在計數遞減階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳清0
  •         在其他模式下,當計數值等於T1CCxH:T1CCxL時,輸出引腳置1,當計數值等於0x0000時,輸出引腳清0
  • 100:在正計數/倒計數模式下,在計數增加階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳清0,在計數遞減階段,當計數值等於T1CCxH:T1CCxL時,輸出引腳置1
  •         在其他模式下,當計數值等於T1CCxH:T1CCxL時,輸出引腳清0,當計數值等於0x0000時,輸出引腳置1
  • 101:當計數值等於T1CCxH:T1CCxL時,輸出引腳置1;當計數值等於T1CC0H:T1CC0L時,輸出引腳清0
  • 110:當計數值等於T1CCxH:T1CCxL時,輸出引腳清0;當計數值等於T1CC0H:T1CC0L時,輸出引腳置1
  • 111:初始化輸出比較引腳的電平

通道0的輸出比較功能比較少,如下圖所示,這是因為T1CC0H:T1CC0L在模式6和模式7下有特殊的功能,這就意味著這兩種模式對於通道0不可用

所以要生成較複雜的波形,一般都不用通道0。

比較輸出引腳會在下面兩種情況下被初始化

  • 往定時器1的計數器低位元組T1CNTL 寫入任何值,並且會導致計數器被清除為0x0000
  • T1CCTLn.CMP設定為111

初始化值如下表,在不同模式下,初始值不同

接下來看下,定時器1在自由執行模式、模模式、正計數/倒計數模式下的輸出波形

自由執行模式

我們可出,除了模式000、001、010,其他的模式輸出的波形週期都是0xffff個計數時間,所以週期和定時器1的計時頻率有關,也就是和T1CTL.DIV及CLKONCMD暫存器有關。

週期:0xffff

佔空比:T1CCn/T1CC0或者1-T1CCn/T1CC0

模模式

我們可出,除了模式000、001、010,在定時器時鐘頻率一定的情況下,其他的模式輸出的波形週期和暫存器T1CC0有關

週期:T1CC0

佔空比:T1CCn/T1CC0或者1-T1CCn/T1CC0

正計數/倒計數模式

週期:2*T1CC0

佔空比:010和100——T1CCn/T1CC0;011——1-T1CCn/T1CC0;101和110——(T1CC0-T1CCn)/2*T1CC0

程式編寫

埠引腳初始化:配置引腳功能為外設I/O,外設位置選擇,位置優先順序選擇,注:無需配置引腳方向PxDIR

例子中用到引腳P1.0,定時器1的位置2時引腳P1.0為通道2

/******************************************************************************
*函 數 名:InitPWM
*功    能:PWM輸出口P1.0初始化
*入口引數:無
*出口引數:無
******************************************************************************/
void InitPWM(void)
{
  P1SEL |=  0x01;      //P1.0設定為外設I/O口:定時器1通道2
  PERCFG |= (1<<6);    //定時器1為外設位置2
  P2SEL &= ~(1<<4);    //優先順序控制:定時器1優先
}

定時器初始化配置:

  • 定時器1分頻值,工作模式配置,暫存器T1CTL
  • 定時器1通道n輸入捕獲/輸出比較模式選擇,如果用到中斷,開通道n中斷,暫存器T1CCTLn
  • 通道1捕獲/比較暫存器值配置,先低位後高位,T1CC0L和T1CC0H
  • 通道n捕獲/比較暫存器值配置,先低位後高位,T1CCnL和T1CCnH
  • 開定時器1溢位中斷,TIMIF
  • 定時器1中斷使能,IEN1
  • 開總中斷,EA
/******************************************************************************
*函 數 名:InitT1
*功    能:定時器1初始化,使用通道2
*入口引數:無
*出口引數:無
******************************************************************************/
void InitT1(void)
{
  T1CTL  = 0x0f;     //定時器1設定為128分頻,正計數/倒計數模式
  T1CCTL2 = 0x6c;    //定時器1通道2配置為比較輸出,模式101,開通道2中斷
  T1CC0L = 0x00;     //定時器1通道0捕獲/比較值低位
  T1CC0H = 0x88;     //定時器1通道0捕獲/比較值高位
  T1CC2L = 0x00;     //定時器1通道2捕獲/比較值低位
  T1CC2H = 0x44;     //定時器1通道2捕獲/比較值高位
  TIMIF &= ~(1<<6);  //定時器1溢位中斷使能
  IEN1  |= (1<<1);   //定時器1中斷使能
  EA = 1;            //開總中斷
}

這樣就可以輸出PWM波形了,對於只輸出PWM波,中斷是可以不用管的,不開中斷什麼的都可以

本例使用的定時器主時鐘是32MHz,128分頻,週期是2*T1CC0H:T1CC0L(2*0x8800)計時時間,為278.528ms,頻率為3.59Hz,佔空比為

1-(T1CC0-T1CCn)/2*T1CC0=75%

波形用示波器看得

另外,通過實驗發現,當輸出頻率較高的波形時,波形失真較明顯,下圖是輸出8MHz的波形,所以cc2541不適合輸出高頻率的波形。


相關推薦

CC2541定時1

建議讀者閱讀原文,確保獲得完整的資訊CC2541定時器1有5個捕獲/比較通道,首先介紹什麼是捕獲和比較功能。捕獲通道:設定的捕獲開始的時候,CPU會將計數暫存器的值複製到捕獲比較暫存器中並開始計數,當再次捕捉到電平變化時,這時計數暫存器中的值減去剛才複製的值就是這段電平的持續

基於連結串列的軟體定時實現

軟體定時器在實際應用比較重要,本文旨在實現一種便於移植,易擴充套件功能,效率高的軟體定時器。本定時器是基於排序連結串列,將最近將觸發的定時器置於連結串列頭,後續新增定時器將計算出其合適位置插入。 主要資料結構及資料   typedef struct m_tm_tcb_struct { uint

JAVA設計模式單例模式

單例對象 日誌 locking anti 常見 基本上 title 加載 懶漢式 本文繼續介紹23種設計模式系列之單例模式。 概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裏主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特

硬件工程師必會電路模塊MOS管應用

增強 aliyun vgs conn www oot 信號 .com desc **本文你可以獲得什麽? 實際工程應用中常用的MOS管電路(以筆記本主板經典電路為例); 學到實際系統中用到的開關電路模塊以及MOS管非常重要的隔離電路(結合IIC的數據手冊和筆記本主板應

不用寫Windows服務實現定時功能FluentScheduler

ace 簡單 要去 job macbook sharp 管理 dia 做到 MacBook Pro 只有四個 USB Type-C 接口是否錯了? 一項新技術的誕生總會對已存在的事物造成沖擊或影響,如果大家都害怕沖擊與影響,那這個世界永遠像現在不變就行了,大家都好好的,待

IOS推送PHP代碼

推送消息 獲取 option code bsp 包含 connect 手機 pan 準備工作 1.獲取手機註冊應用的deviceToken(iphone手機註冊應用時返回唯一值deviceToken) 2.獲取ck.pem文件(做手機端的給) 3.獲取pass phrase

window下如何使用Git上傳代碼到github遠程服務

輸入密碼 msysgit 9.png users erl create 建立 OS 要求 註冊賬戶以及創建倉庫 首先你得有一個github賬號,沒有自行註冊,登錄成功後應該是這樣 在頁面上方用戶菜單上選擇 “+”->New repository 創建一個新的倉庫

zookeeper 學習筆記1

html path zookeepe 事件 需要 客戶端 記錄 getc child 本文轉自https://www.cnblogs.com/fanguangdexiaoyuer/p/7077520.html 感謝作者 可以設置觀察的操作:exists,getChildr

設計模式---對象創建模式構建模式Builder

out ++ 生成 構造器 build 創建過程 隱藏 spa col 一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23種設計模式中的一種。Builder模式是一種對象創建型模式之一,用來隱藏復合對象的創建過程,它把復合對象的創建過程加以

設計模式---領域規則模式解析模式Interpreter

語法規則 規則 urn air 業務 變化 img bsp span 前提:領域規則模式 在特定領域內,某些變化雖然頻繁,但可以抽象為某種規則。這時候,結合特定領域,將問題抽象為語法規則,從而給出該領域下的一般性解決方案。 典型模式 解析器模式:Inter

mysql狀態分析show global status

http 運行 global 系統性能 數據量 -- ror 必須 request mysql> show global status;可以列出MySQL服務器運行各種狀態值,我個人較喜歡的用法是show status like ‘查詢值%‘;一、慢查詢mysql&g

php字符編碼轉換gb2312轉為utf8

The 執行效率 val 默認 odin net request nor 原因 在php中字符編碼轉換我們一般會用到iconv與mb_convert_encoding進行操作,但是mb_convert_encoding在轉換性能上比iconv要差很多哦。string ico

大型網站架構系列:電商網站架構案例(1)

大型網站架構是一個系列文件,歡迎大家關注。本次分享主題:電商網站架構案例。從電商網站的需求,到單機架構,逐步演變為常用的,可供參考的分散式架構的原型。除具備功能需求外,還具備一定的高效能,高可用,可伸縮,可擴充套件等非功能質量需求(架構目標)。 根據實際需要,進行改造,擴充套件,支援千萬PV,是沒問題的。

Spring AOPIntroduction(@DeclareParents)簡介

Spring的文件上對Introduction這個概念和相關的註解@DeclareParents作了如下介紹:Introductions (known as inter-type declarations in AspectJ) enable an aspect to declare that advised

代理服務原理

開始 也有 代理服 分析 .com gateway 網絡服務 inux 有用 本文轉自:https://www.cnblogs.com/Aiapple/p/5955882.html 以類似代理人的身份去取得用戶所需要的數據就是了! 但是由於它的『代理』能力,使得我們

FTP服務原理

使用 原理 轉換 磁盤容量 bubuko 啟動 不同等級 註意 進行 本文轉自https://www.cnblogs.com/Aiapple/p/5955736.html 感謝作者 21.1 FTP服務器原理 使用明碼傳輸方式,且有相當多的安全危機歷史。

Python學習16--裝飾1簡單

迭代器功能:       不更改操作函式名的前提下,修改原函式功能!       例如: import time def show_time(func): def wrapper(): start_ti

《JAVA與模式》抽象工廠模式

場景問題   舉個生活中常見的例子——組裝電腦,我們在組裝電腦的時候,通常需要選擇一系列的配件,比如CPU、硬碟、記憶體、主機板、電源、機箱等。為討論使用簡單點,只考慮選擇CPU和主機板的問題。   事實上,在選擇CPU的時候,面臨一系列的問題,比如品牌、型號、針腳數目、

Linux網路程式設計高階併發伺服器

1. 介紹 在上一節,我們介紹了Linux簡單的併發伺服器,通過在伺服器端建立多個子程序,來接收客戶端的請求,實現併發處理,但這種方式明顯有缺陷,伺服器並不知道客戶端請求的數量,所以事先建立的程序數不好確定。所以,這裡介紹三種高階併發伺服器模式。第一種是伺服器端統一

設計模式構造模式Builder

本文介紹Java中23個設計模式中的構造器模式。 一 概念 Java 23種設計模式之一,英文叫Builder Pattern。其核心思想是將一個“複雜物件的構建演算法”與它的“部件及組裝方式”分