偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

STM32“隱藏的定時(shí)器”-DWT

開發(fā) 前端
在《如何測(cè)量代碼運(yùn)行時(shí)間》中提到使用定時(shí)器外設(shè)計(jì)算代碼運(yùn)行時(shí)間。文中提到這種方法的明顯缺點(diǎn)就是需要占用一個(gè)定時(shí)器,我就研究了一番。

[[419526]]

1 前言

在之前的文章在《STM32延時(shí)函數(shù)的四種方法》使用定時(shí)器延時(shí),在《如何測(cè)量代碼運(yùn)行時(shí)間》中提到使用定時(shí)器外設(shè)計(jì)算代碼運(yùn)行時(shí)間。文中提到這種方法的明顯缺點(diǎn)就是需要占用一個(gè)定時(shí)器,一些MCU在特定應(yīng)用場(chǎng)景下定時(shí)器外設(shè)資源是十分稀缺的。在留言區(qū)有位大佬提到可以使用DWT,我就研究了一番。

2 DWT

在Cortex-M里面有一個(gè)外設(shè)叫DWT(DataWatchpoint andTrace),是用于系統(tǒng)調(diào)試及跟蹤,DWT的中文名字應(yīng)該是:數(shù)據(jù)觀察點(diǎn)觸發(fā)。在STM32用戶手冊(cè)的第32章節(jié)Debugsupport (DBG)有如下框圖。

明顯DWT屬于DBG部分的功能,從上圖的標(biāo)題可以看出DWT屬于CortexM3內(nèi)核的,理論上M3內(nèi)核的MCU都支持的,這個(gè)下文會(huì)說明。在這里我將其稱之為“隱藏的定時(shí)器”,因?yàn)樗梢源娑〞r(shí)器外設(shè)實(shí)現(xiàn)上文提到延時(shí)功能和測(cè)量代碼運(yùn)行時(shí)間的功能,DWT不能代替定時(shí)器的其他功能。

之所以DWT可以實(shí)現(xiàn)延時(shí)功能,因?yàn)樗幸粋€(gè)32的計(jì)數(shù)器CYCCNT,這是一個(gè)向上計(jì)數(shù)的計(jì)數(shù)器,當(dāng)它溢出時(shí)會(huì)自動(dòng)清零并重新開始向上計(jì)數(shù),它的頻率就是內(nèi)核的主頻。簡(jiǎn)單點(diǎn)說,就是內(nèi)核時(shí)鐘跳動(dòng)一下,CYCCNT計(jì)數(shù)器就加1。

很明顯DWT計(jì)數(shù)器的精度和系統(tǒng)主頻有關(guān),我們常用的STM32F103主頻一般為72Mhz,STM32F207一般為120Mhz,STM32H7主頻一般為400Mhz。以為主頻最低為72Mhz的STM32F103為例,精度是1/72M= 14ns,這個(gè)精度足以滿足大部分延時(shí)函數(shù)的需求,同樣程序的運(yùn)行時(shí)間都是微秒級(jí)別的,遠(yuǎn)遠(yuǎn)滿足測(cè)量代碼運(yùn)行時(shí)間的要求。

3 DWT的配置

首選使用DWT前必須使能DBG的系統(tǒng)跟蹤,控制使能位在DEMCR寄存器的bit24。注意該寄存器詳細(xì)說明在STM32的用戶手冊(cè)上查不到,需要在CortexM3內(nèi)核手冊(cè)查到,在《Cortex-M3權(quán)威指南》書中也可以查到。

在使能CYCCNT計(jì)數(shù)器前,必須先將其清零。下圖是從ARM的官方手冊(cè)《Cortex-M3Technical Reference Manual》中查到的。

使能CYCCNT計(jì)數(shù)器,其控制位是DWT控制寄存器的第一位,寫1使能,則啟用CYCCNT計(jì)數(shù)器,否則CYCCNT計(jì)數(shù)器將不會(huì)工作。 

總結(jié)一下:

a.先使能DWT外設(shè),由內(nèi)核調(diào)試寄存器DEM_CR的位24控制,寫1使能。

b.使能CYCCNT寄存器之前,先清0。

c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,寫1使能。

代碼如下

  1. //寄存器基地址 
  2. #define    DWT_CR    *(uint32_t*)0xE0001000 
  3. #define    DWT_CYCCNT    *(uint32_t*)0xE0001004 
  4. #define    DEM_CR    *(uint32_t*)0xE000EDFC 
  5.  
  6. //定義需使能位 
  7. #define    DEM_CR_TRCENA    (1<<24) 
  8. #define    DWT_CR_CYCCNTENA    (1<<0) 
  9.  
  10. //DWT init 
  11. void DWT_init(void) 
  12.   DEM_CR |= (uint32_t)DEM_CR_TRCENA; 
  13.   DWT_CYCCNT = (uint32_t)0u; 
  14.   DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA; 
  15. //get DWT count 
  16. uint32_t DWT_TS_GET(void) 
  17.   return((uint32_t)DWT_CYCCNT); 

4 代碼

從上文我們得知,我們已經(jīng)獲得了一個(gè)32位向上累加的計(jì)數(shù)器,溢出會(huì)自動(dòng)清零并累加,頻率是系統(tǒng)主頻。那么我們簡(jiǎn)單封裝下,就可以實(shí)現(xiàn)延時(shí)函數(shù)。以下代碼在120Mhz的STM32F207測(cè)試。

  1. //使用DWT延時(shí)time_ms毫秒 
  2. void DWT_Delay_Ms(uint32_t time_ms) 
  3.   uint32_t old_counter,current_counter; 
  4.   uint32_t delay_ms; 
  5.    
  6.   old_counter = DWT_TS_GET(); 
  7.   current_counter = DWT_TS_GET(); 
  8.   delay_ms = 0; 
  9.   while(delay_ms<time_ms) 
  10.   { 
  11.     current_counter = DWT_TS_GET(); 
  12.     if(current_counter > old_counter) 
  13.       delay_ms = (current_counter - old_counter)/(SystemCoreClock/1000); 
  14.     else 
  15.       delay_ms = (current_counter + 0XFFFFFFFF - old_counter)/(SystemCoreClock/1000); 
  16.   } 

使用之前的文章《如何測(cè)量代碼運(yùn)行時(shí)間》測(cè)量延時(shí)函數(shù)是否準(zhǔn)確。

  1. DWT_Delay_Ms(100);//延時(shí)100ms 
  2. time_ms=Time_Difference_ms(); 

如下圖,延時(shí)函數(shù)精確延時(shí),沒有問題

實(shí)現(xiàn)測(cè)量代碼運(yùn)行時(shí)長(zhǎng)的函數(shù)接口

  1. //使用DWT測(cè)量函數(shù)運(yùn)行時(shí)間 
  2. float DTW_Time_Difference_ms(void) 
  3.   static uint32_t old_counter; 
  4.   uint32_t counter,couter_current; 
  5.   couter_current = DWT_TS_GET(); 
  6.   if(couter_current > old_counter) 
  7.     counter = couter_current - old_counter; 
  8.   else 
  9.     counter = couter_current + 0XFFFFFFFF - old_counter; 
  10.   old_counter = couter_current; 
  11.   return (counter / (SystemCoreClock/1000)); 

使用之前的文章《STM32延時(shí)函數(shù)的四種方法》精確延時(shí),然后使用DWT測(cè)量延時(shí)時(shí)間。

  1. delay_ms(300);//延時(shí)300ms 
  2. time_ms=DTW_Time_Difference_ms(); 

如下圖,可以精確測(cè)量代碼運(yùn)行時(shí)間,沒有問題。

5 后記

本文使用DWT代替了定時(shí)器部分功能,它的優(yōu)缺點(diǎn)如下:

1、優(yōu)點(diǎn)是:方便移植,經(jīng)過測(cè)試在M3、M4、M7內(nèi)核的MCU上都可以使用。

2、缺點(diǎn)是:和定時(shí)器一樣,都有一個(gè)延時(shí)的最大時(shí)間,測(cè)量代碼運(yùn)行時(shí)間的最大值。

如果項(xiàng)目使用MCU有空閑的定時(shí)器,且不考慮換MCU的話,我個(gè)人建議還是使用通用的定時(shí)器外設(shè),不要使用DWT,雖然DWT方便移植,但通用定時(shí)器外設(shè)簡(jiǎn)單易懂,對(duì)于沒有了解過這部分知識(shí)的小白,看到DWT的延時(shí)函數(shù),還需要學(xué)習(xí)下。

本文轉(zhuǎn)載自微信公眾號(hào)「知曉編程」

 

責(zé)任編輯:姜華 來(lái)源: 知曉編程
相關(guān)推薦

2010-07-28 15:56:22

FlexTimer定時(shí)

2009-11-11 10:14:10

linux定時(shí)器操作系統(tǒng)

2021-05-06 08:54:39

串口DMASTM32

2021-05-20 07:26:22

DMASTM32數(shù)據(jù)

2021-12-22 06:56:07

STM32C語(yǔ)言內(nèi)存

2022-10-10 08:24:15

編程數(shù)據(jù)邏輯語(yǔ)句

2021-02-03 13:04:24

STM32網(wǎng)絡(luò)控制器

2022-11-02 11:40:16

Flowable定時(shí)器流程

2021-02-05 08:41:44

STM32網(wǎng)絡(luò)中斷

2021-01-20 09:51:25

STM32網(wǎng)絡(luò)接口

2022-01-07 08:24:13

STM32枚舉結(jié)構(gòu)體

2021-06-28 06:00:11

systemd定時(shí)器系統(tǒng)運(yùn)維

2023-01-10 13:53:21

Linux定時(shí)器

2009-04-12 08:51:50

Symbian諾基亞移動(dòng)OS

2011-02-23 10:20:45

2013-07-29 10:10:40

TCP協(xié)議TCP定時(shí)器TCP

2021-03-31 08:33:17

SysTick定時(shí)器SysTick定時(shí)器

2021-07-27 16:01:29

高并發(fā)定時(shí)器高性能

2023-08-02 09:26:03

軟件定時(shí)器鴻蒙

2021-08-31 08:01:40

STM32DSP指令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)