敏矽微電子Cortex-M0學習筆記08-基本定時器詳解

2020-09-06 老馬識途單片機


學習筆記


1、ME32F030基本定時器簡介

ME32F030內置 4 個基本功能的 16 位定時器/計數器。 定時器/計數器工作時鐘由 SYSAHBCLKDIV 寄存器控制。關閉 SYSAHBCLKDIV 寄存器中定時器/計數器的時鐘供給可節省系統功耗。主要功能如下:

• 可預置分頻的 16 位定時器/計數器

• 1 個 16 位匹配寄存器:

–可產生中斷

–停止定時器

–對定時器復位

16 位基本型定時器/計數器模塊框圖如下圖所示:

圖1 基本定時器結構圖


為了便於理解,可以將基本定時器框圖分為4個功能單元。

①:預分頻計數單元,由PRESCALE COUNTER (PC) 和 PRESCALE REGISTER (PR)組成,預分頻計數器(PC)會在每個 PCLK 時鐘上遞增計數。達到設定的預分頻值後,定時器計數器就會加1,而預分頻值就是由PR寄存器決定的。

②:定時器計數單元,由TIMER COUNTER (TC) 和 TIMER CONTROL REGISTER (TCR)組成,定時器控制寄存器TCR決定計數器TC是否啟用。預分頻計數器(PC)溢出後,定時器計數器(TC)加1,達到設定的匹配值MR0之後可以根據設置產生中斷等行為。

③:定時器匹配單元:該單元只有一個MATCH REGISTER0(MR0),它決定著定時器計數器TC的匹配值。

④:定時器控制單元,由MATCH CONTROL REGISTER (MCR) 和 INTERRUPT REGISTER (IR)組成,二者共同作用,控制著定時器的主要功能和參數。

2、ME32F030基本定時器寄存器

在簡介中,我們介紹了基本定時器的模塊框圖,其實每個功能模塊都有對應的寄存器來實現其功能。基本定時器的寄存器列表如圖所示:

圖2 基本定時器寄存器列表


2-1 中斷寄存器

中斷寄存器包含用於匹配中斷的位。如果有中斷產生, IR 中的相應位為高電平。否則,該位為低電平。向對應的 IR 位寫邏 輯 1 會使中斷復位。寫 0 無效。

2-2 定時器控制寄存器

定時器控制寄存器用於控制計數器/定時器的操作。它主要控制著計數器的使能和復位,具體的操作如圖所示:

圖3 控制寄存器


2-4 定時器計數寄存器

當預分頻器計數器達到其 PC 數值時, 16 位定時器計數器會遞增計數。如果 TC 在到達計數器上限之前沒有復位,它將一直 計數到 0x0000 FFFF 然後翻轉到 0x0000 0000。該事件不會產生中斷,如果需要,可使用匹配寄存器檢測溢出。

2-4 預分頻寄存器

16 位預分頻寄存器指定預分頻計數器的最大值。當預分頻計數器計數到此值後,會從0開始重新計數。

2-5 預分頻計數寄存器

16 位預分頻計數器用某個常量來控制 PCLK 的分頻,再使其輸入到定時器計數器。它所控制的是定時器解析度與最大時間之間的關係,從而能防止定時器溢流。預分頻計數器會在每個 PCLK 時鐘上遞增計數。當預分頻計數器的計數達到預分頻寄存器中存儲的值時,定時器計數器將遞增計數,並且在下一個 PCLK 時鐘上對預分頻計數器復位。這將使得 TC 當 PR = 0 時在每個 PCLK 上遞增計數,當 PR = 1 時,在每 2 個 PCLK 上遞增計數,依次類推。.

2-6 匹配控制寄存器

匹配控制寄存器用於控制當其中一個匹配寄存器的值與定時器計數器的值匹配時應執行的操作。功能如下所示。

位0:決定著計數器TC與匹配值相等後,中斷是否使能。

位1:MR0與TC匹配時,決定TC是否復位。如果選擇復位,TC則會清0重新計數,這樣就會形成一個固定時間的計數周期。

位2:MR0與TC匹配時,決定TC是否停止。如果置1選擇使能,TC則不再會計數。這樣就是個單次周期的計數了。如果想要周期性循環計數,那麼就需要置0(默認)禁止。

圖4 匹配控制寄存器


2-7 匹配寄存器

匹配寄存器的值會不斷地與定時器計數器值進行比較。當兩個值相等時,自動觸發相應操作。這些操作包括產生中斷、復位定時器計數器或停止定時器。所有操作均由 MCR 寄存器中的設置控制。

3、基本定時器驅動函數

在例程LIB->common->Drivers->Source文件夾內有timer.c文件,這個就是提供的定時器庫程序,裡面除了基本定時器的驅動函數,還包括高級定時器、PWM輸出等功能函數,本章節先對基本定時器的函數進行講解。

3-1 基本定時器初始化

ct:要初始化的定時器模塊,可選TIM0、TIM1、TIM2、TIM3。

tickpersecond:預分頻係數。

void TIM0_Init(TIM0_Type *ct, uint32_t tickpersecond){if (ct == TIM0){SYSCON->SYSAHBCLKCTRL_b.TIM0_CLK=1;//使能定時器時鐘SYSCON->PRESETCTRL_b.TIM0_RST_N=0; //復位定時器SYSCON->PRESETCTRL_b.TIM0_RST_N=1;}else if (ct == TIM1){SYSCON->SYSAHBCLKCTRL_b.TIM1_CLK=1;SYSCON->PRESETCTRL_b.TIM1_RST_N=0;SYSCON->PRESETCTRL_b.TIM1_RST_N=1;}else if (ct == TIM2){SYSCON->SYSAHBCLKCTRL_b.TIM2_CLK=1;SYSCON->PRESETCTRL_b.TIM2_RST_N=0;SYSCON->PRESETCTRL_b.TIM2_RST_N=1;}else if (ct == TIM3){SYSCON->SYSAHBCLKCTRL_b.TIM3_CLK=1;SYSCON->PRESETCTRL_b.TIM3_RST_N=0;SYSCON->PRESETCTRL_b.TIM3_RST_N=1;} else return;//設置預分頻係數if (tickpersecond>SystemCoreClock)tickpersecond=SystemCoreClock;ct->PR_b.PRVAL=SystemCoreClock/tickpersecond-1;return;} 

3-2 設置匹配寄存器

這個函數用於設置定時器的匹配值,以及達到匹配值之後的行為。

Ct:要設置的定時器模塊,可選TIM0、TIM1、TIM2、TIM3。

Ticks:要寫入的計數器匹配值。

Action: 觸發中斷 TIM_MATCH_TRIGGER_INT

復位計數器 TIM_MATCH_RESET_COUNTER

停止計數器 TIM_MATCH_STOP_COUNTER

void TIM0_ConfigMatch(TIM0_Type *ct, uint16_t ticks, uint8_t action){ct->MR0_b.MATCH=ticks-1;ct->MCR=action;return;}

3-3 設置預分頻計數器值

void TIM0_SetTimerCounter(TIM0_Type *ct, uint16_t tick){ct->PC_b.PCVAL=tick;return;}

3-4 復位預分頻計數器值

void TIM0_ResetTimerCounter(TIM0_Type *ct){ct->PC_b.PCVAL=0;return;}



3-5 獲取計數器當前值

uint16_t TIM0_GetTimerCounter(TIM0_Type *ct){return ct->TC_b.TC;}

3-6 清除定時器中斷標誌

void TIM0_ClearIntFlag(TIM0_Type *ct){ct->IR_b.MR0INT=1;return;}

4、ME32F030基本定時器例程

最早在講解GPIO的時候,我們用的是系統延時的方法來閃爍LED小燈。但是這樣有個問題,那就是調用系統延時的方法,程序是在這裡無意義的空等。這在今後的開發中是十分不可取的,因為這樣極大的降低程序的運行效率,尤其是面對多個任務需要執行的時候。這時候我們就可以通過硬體定時器中斷的方式,來解決這個問題。下面就舉例通過硬體中斷來閃爍LED的方法,測試代碼如下:

程序首先會設置定時器的預分頻值,例程中將分頻值設為1000Hz,即1ms溢出一次,這樣計數器TC 就會加1。

接下來對基本定時器的觸發條件和觸發行為進行設置,這裡我們將觸發的匹配值設置為500,和預分頻值共同作用產生一個500ms的計數周期。當達到匹配值之後,啟動定時中斷並且復位清0計數值,繼續循環。

接下來就是使能中斷服務程序和LED小燈埠初始化。

在最後用了個宏定義 TIM0_START 來讓定時器開始工作。

int main(){TIM0_Init(TIM0,1000); //TIM0 設置預分頻值 //基本定時器0, 500個計數觸發一次中斷(500ms),觸發中斷後復位清0計數值TIM0_ConfigMatch(TIM0,500,TIM_MATCH_TRIGGER_INT|TIM_MATCH_RESET_COUNTER); NVIC_EnableIRQ(TIM0_IRQn);//使能中斷服務子程序 GPIO_ConfigPinsAsOutput(PB, IO_PIN9);//PB9設置為輸出口 TIM0_START;//定時器0開始工作 while(1);}//基本定時器0 中斷服務子程序void TIM0_IRQHandler(void)  {  GPIO_InvertOutPin(PB, IO_PIN9);//埠輸出反轉TIM0_ClearIntFlag(TIM0);//清除中斷標誌} 

程序編譯沒有報錯之後,便可以下載仿真調試,我們在中斷服務子程序內打上一個斷點,然後全速運行程序。這時候發現程序會運行到斷點處,這說明定時器的中斷已經成功觸發。取消掉斷點,繼續全速運行,觀察LED小燈。這時候就看到LED小燈開始不停閃爍。


圖5 程序仿真


相比較之前的GPIO 系統延時方法,點燈完全由中斷子程序控制。這樣main函數裡的主程序就可以去做其他事情,這樣程序效率就更高了。

相關焦點

  • 敏矽微電子Cortex-M0學習筆記01-晶片簡介
    敏矽微電子Cortex-M0學習手記01-晶片簡介1.1. 概述ME32F030R8T6 的出現為嵌入式的開發帶來了極大地便利,ME32F030R8T6 是一款內嵌 ARM Cortex™ M0 核的 32 位微控制器。
  • 敏矽微電子Cortex-M0學習筆記04-GPIO詳解及應用實例
    前面我們已經對敏矽微電子的基於cortex m0內核的ME32F030R8T6的基本功能做了介紹,然後詳細講解了開發環境MDK的安裝,pack包的安裝,工程的建立及程序的仿真,緊接著講解了ME32F030R8T6的時鐘系統。
  • 敏矽微電子Cortex-M0學習筆記07-串口通信詳解
    越早學習越好1、UART例如在我們學習敏矽微電子的cortex m0時,可以將開發板與電腦相連,通過串口調試助手來調試程序、觀察程序運行結果。還有很多其他的串口模塊,比如藍牙、 NBIOT、GPRS、4G 等模組,都是使用的串口來進行驅動的,因此掌握串口是嵌入式工程師必備的技能。接下來我們就來學習如何驅動ME32F030上的串口。在正式學習之前,我們先對UART串口的通信格式做一個了解。
  • 敏矽微電子Cortex-M0學習筆記02-開發環境的建立及調試
    本篇先簡單介紹MDK的安裝流程,然後重點說明如何把敏矽微電的Cortex-M0的PACK包添加到mdk中,這樣才能順利的在MDK環境下開發敏矽微電子Cortex-M0新片。最後用了很大篇幅介紹如何建立工程,工程中各種文件的添加等等。
  • 敏矽微電子Cortex-M0學習筆記14-看門狗復位實例
    學習筆記1、看門狗簡介 看門狗定時器用於在用戶程序出錯並無法餵狗後對系統進行中斷和復位處理。使用可編程的看門狗定時器,用戶可改變定時器時間去應對不同的應用程式。 WDTV 寄存器用於讀取看門狗定時器的當前值。
  • 敏矽微電子Cortex-M0學習筆記15-看門狗定時中斷實例
    學習筆記1、看門狗時鐘在上一章節的學習中,我們使用了看門狗的系統復位功能,通過觸摸按鍵觸發餵狗的方式,演示了看門狗的復位功能。看門狗定時器模塊使用兩個時鐘:PCLK和WDCLK。PCLK由系統時鐘生成,供APB 訪問看門狗寄存器使用。WDCLK由看門狗時鐘振蕩器中的wdt_clk生成,供看門狗定時器計數使用。wdt_clk時鐘可以從IRC和看門狗振蕩器中選擇一個作為時鐘源。這兩個時鐘源之間存在一些同步邏輯。當MOD和TC寄存器通過APB操作更新時,新的值將由WDCLK時鐘設定並生效。
  • 敏矽微電子Cortex-M0學習筆記13-硬體CRC實例
    學習筆記學習記錄uint16_t crc_16_std, crc_16_modbus;uint16_t crc_ccitt_std, crc_ccitt_xmodem, crc_ccitt_0x1d0f;uint32_t crc_32;int main(void){uint8_t datastr[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  • 敏矽微電子Cortex-M0學習筆記11-FLASH存儲器
    學習筆記1、FLASH
  • 敏矽微電子Cortex-M0學習筆記10-SPI通信詳解
     TX FIFO 空while(SPI_TX_FIFO_Not_Empty);//清空 RX FIFOSPI->CR1_b.RSFR=1;SPI->CR1_b.RSFR=0;return;}3-4 SPI讀寫函數該函數集合SPI的讀和寫功能,是實現和SPI外設通信的基本函數
  • 敏矽微電子Cortex-M0學習筆記12-電容觸摸按鍵實例
    學習筆記1、電容觸摸簡介其中的RC在晶片內部有4擋可以通過軟體選擇,從而實現從350K / 600K / 1.4M / 3.6M 的一個基本頻率。在ME32F030封裝下面,RC也可以使用外部電阻,用戶可以任意調節基本頻率。
  • 敏矽微電子Cortex-M0學習筆記17-I2C從機通信實例
    學習筆記向CONCLR 寫入0x08 來清除SI 標誌。2. 初始化從機數據接收緩衝區。3. 初始化從機數據接收緩衝區指針。4. 退出。 狀態代碼: 0x13前一次尋址使用自身從機地址;已接收數據字節;已返回 ACK。 即將接收更多數據。1.
  • 敏矽微電子Cortex-M0學習筆記16-串行通信I2C實例
    學習筆記NVIC_EnableIRQ(I2C_IRQn);}繼續學習I2C從機模式的應用可以參考i2c_slave.c文件,在後面的學習中會遇到。1、從STA 中讀出I2C 的狀態。2、使用狀態值跳轉到13個可能狀態服務程序中的一個。
  • 敏矽微電子Cortex-M0學習筆記05-埠外部中斷實例
    1、目的本篇學習筆記我們主要來了解ME32F030的中斷系統,首先通過對ME32F030終端系統和中斷控制存器進行學習,最後通過實際的GPIO埠中斷實例掌握中斷函數的編程實現來加深掌握ME32F030中斷系統的編程方法
  • 敏矽微電子Cortex-M0學習筆記06-段式LCD液晶實例
    1、LCD顯示驅動概述在上一章節GPIO中斷的學習中在以後的學習和開發中,LCD作為顯示單元,會愈發顯示出它的重要性。那麼接下來就開始介紹ME32F030的LCD驅動。學習前先對其做個簡單的概述。ME32F030的LCD 顯示驅動通過自動地創建交流段和公共電壓信號來直接驅動 LCD。它可以支持靜態,1/2,1/3,1/4,1/5 和 1/6 佔空比 的 LCD 面板。.
  • 上海申矽凌微電子科技有限公司宣布近期已完成新一輪融資
    上海申矽凌微電子科技有限公司宣布近期已完成新一輪融資,融資金額數千萬人民幣,由創維投資和湖杉資本共同投資。本輪融資一方面用來擴充產品線,在現有產品的基礎上,進一步豐富產品,滿足客戶的需求。其次進一步擴大團隊,具備同時服務多家一線客戶的能力。
  • 基於Cortex-M0的USB密碼鍵盤的設計與實現
    、PWM定時器、GPIO、USB 2.0 FS設備、12位ADC、模擬比較器、低電壓檢測和欠壓檢測功能。每一大類都用一個類型號標識,如音頻設備為01,人機界面設備為03,海量存儲設備為08。USB的數據傳輸共有4種類型:控制傳輸、中斷傳輸、批量傳輸、同步傳輸。在USB標準子類中,本文主要討論兩類子集——HID類和CDC類。
  • 晟矽微進入華為供應鏈,MC9934單片機被降噪頸掛耳機採用
    近日,我愛音頻網在拆解時,發現其採用了晟矽微 MC9934 單片機,用於藍牙耳機在連接發生故障時,觸發復位再次發射藍牙信號,保障藍牙不死機。配置上,採用了SINOMUC晟矽微 MC9934 8位單片機,用於藍牙耳機在連接發生故障時,觸發復位再次發射藍牙信號
  • STM32定時器應用筆記AN4776之推薦閱讀
    眾所周知,STM32的定時器功能非常龐大複雜,應用也非常普遍。
  • [訴訟]敏芯股份:蘇州敏芯微電子技術股份有限公司關於訴訟事項進展...
    [訴訟]敏芯股份:蘇州敏芯微電子技術股份有限公司關於訴訟事項進展暨收到撤訴裁定 時間:2020年11月11日 17:41:17&nbsp中財網 原標題:敏芯股份:蘇州敏芯微電子技術股份有限公司關於訴訟事項進展暨收到撤訴裁定的公告
  • 晟矽微進入華為供應鏈,MC9934單片機被FreeLace Pro採用
    近日,我愛音頻網在拆解華為 FreeLace Pro 降噪脖掛藍牙耳機時,發現其採用了晟矽微 MC9934 單片機,用於藍牙耳機在連接發生故障時