娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月16日(星期日)

正在發生

2020年02月16日 | STM8S_002_TIM精確延時(阻塞式)

發布者:快樂的天使 來源: eefocus關鍵字:STM8S  TIM  精確延時  阻塞式 手機看文章 掃描二維碼
隨時隨地手機看文章

Ⅰ、寫在前面

在某些特定場合,需要精確的延時(us級),特別是底層驅動。如果使用軟件延時,延時會隨系統時鐘改變及各種因素影響而改變。因此,就需要使用TIM精確延時。


阻塞式延時:從延時開始至結束,程序一直阻塞在那里,不會跳轉到其他地方(除中斷)執行程序。不理解的朋友可以自己網上搜索答案。


TIM的種類和功能很多,本文是基礎的知識,講的比較簡單,關于定時器更加強大和實用的功能可以關注我后面的文章。


為方便大家閱讀,本文內容已經整理成PDF文件:


http://pan.baidu.com/s/1i5uWhJR


Ⅱ、TIM基礎知識

STM8S的定時器(TIMER)類型有三類:基本定時器、通用定時器和高級定時器。基本定時器是8位計數的定時器,通用和高級定時器是16位計數的定時器。


定時器因類型不同,其功能和復雜程度不同,適用的場合也不同。本文以最基礎、最簡單的8位基礎定時器來講述TIM的延時。


強調一點:8位計數定時器,最大計數值為256。

TIM4基礎定時器功能:


? 8位向上計數(UP-COUNTER)的自動重載計數器


? 3位可編程的預分配器Prescaler(可在運行中修改),提供1, 2, 4, 8, 16, 32, 64 和128這8種分頻比例。


? 中斷產生:若使能了中斷,在計數器更新時(計數器溢出)產生中斷,本文未開啟中斷。


Ⅲ、軟件工程源代碼

1、關于工程

本文提供的工程代碼是基于前面“STM8S_Demo”增加TIM定時器修改而來。初學的朋友可以參看我前面對應的基礎文章,那些文章講的比較詳細。


軟件工程源代碼實現功能:通過阻塞式延時(500ms)改變LED亮滅狀態來觀察延時的大小。若要測量延時的精確性,可以將TIMDelay_Nms(500)改為其他TIMDelay_N10us(10)(延時100us),通過示波器測量LED引腳的頻率為5KHz(周期為200us)。


2.軟件概要說明

本文提供軟件工程中包含的內容比較簡單:


系統初始化:System_Initializes


v BSP_Initializes:時鐘初始化CLK_Configuration和GPIO_Configuration初始化;


v TIMER_Initializes:定時器初始化,本文重點內容。


功能實現:while(1)


3.代碼分析說明

關于BSP_Initializes中的內容這里不再詳細說明,請見上一篇文章:STM8S_001_GPIO基礎知識


本文重點講述bsp_timer.c文件的內容:


A.TIMER_Initializes定時器初始化


void TIMER_Initializes(void)


{


  TIM4_TimeBaseInit(TIM4_PRESCALER_2, 79);


  TIM4_ClearFlag(TIM4_FLAG_UPDATE);


}


我們提供的軟件工程是實現10us的延時,實現的公式為:16MHz / 2 / (79+1) = 0.1MHz(100KHz)。


第一個參數TIM4_PRESCALER_2:即2分頻,這個參數具體為如下:


typedef enum


{


  TIM4_PRESCALER_1   = ((uint8_t)0x00),


  TIM4_PRESCALER_2   = ((uint8_t)0x01),


  TIM4_PRESCALER_4   = ((uint8_t)0x02),


  TIM4_PRESCALER_8   = ((uint8_t)0x03),


  TIM4_PRESCALER_16  = ((uint8_t)0x04),


  TIM4_PRESCALER_32    = ((uint8_t)0x05),


  TIM4_PRESCALER_64    = ((uint8_t)0x06),


  TIM4_PRESCALER_128   = ((uint8_t)0x07)


} TIM4_Prescaler_TypeDef;


第二個參數79:這個參數的值,實際上的自動重載寄存器(Auto-reload register)的值。從公式中可以看出,它是得出10us延時的來源。


很多人不理解為什么不是80,而是79呢?


原因是計數是從0開始的,0至79就是計數80個,因此這里是79。


語句TIM4_ClearFlag(TIM4_FLAG_UPDATE):


這條語句的意思很簡單,清除UPDATE更新標志位。


B.延時N個10us:void TIMDelay_N10us(uint16_t Times)


void TIMDelay_N10us(uint16_t Times)


{


  TIM4_SetCounter(0);                             //計數值歸零


  TIM4_Cmd(ENABLE);                            //啟動定時器


  while(Times--)


  {


    while(RESET == TIM4_GetFlagStatus(TIM4_FLAG_UPDATE));


    TIM4_ClearFlag(TIM4_FLAG_UPDATE);


  }


  TIM4_Cmd(ENABLE);                             //關閉定時器


}


為什么是N個10us?


從上面定時器初始化可以知道,一個計數的過程(延時)是10us,參數Times代表要執行延時10us的次數。


TIM4_SetCounter(0);


每次啟動定時器之前,將計數值歸零,這樣才能保證第一次計數(延時)準確。


while(RESET == TIM4_GetFlagStatus(TIM4_FLAG_UPDATE));


這一條語句代表程序在這里不停地讀取更新標志位TIM4_FLAG_UPDATE(阻塞),直到讀取標志位有效(計數滿),則跳出這個while循環。


TIM4_ClearFlag(TIM4_FLAG_UPDATE);


清除更新標志位TIM4_FLAG_UPDATE。在上面標志位有效之后,需要清除,清除之后有進行下一個計數過程。


這里的啟動和關閉定時器相信都能理解,從執行TIMDelay_N10us這一個函數開始到結束操作過程的開關。這里提醒一點:計數的過程的一個循環的過程,過程中盡量避免重復開關定時器(會有一定的耗時),我提供的TIMDelay_Nms其實嚴格來說不是很準確,該函數就是重復了開關。


C.具體實現功能


在main函數中的while里面就是本文源代碼實現的具體功能,將一個LED燈(IO)高低交替輸出,中間使用定時器比較精確的延時500ms,達到LED亮滅的效果。


代碼:


while(1)


{


  LED_ON;                                      //LED亮


  TIMDelay_Nms(500);


  LED_OFF;                                     //LED滅


  TIMDelay_Nms(500);


}


這里TIMDelay_Nms函數嚴格來說存在一定的偏差,從上面的講述,相信都知道如何修改來避免這樣的誤差。


Ⅳ、下載

STM8S資料:


http://pan.baidu.com/s/1o7Tb9Yq


軟件源代碼工程(STM8S-A02_TIM精確延時(阻塞式)):


http://pan.baidu.com/s/1c2EcRo0

關鍵字:STM8S  TIM  精確延時  阻塞式 引用地址:STM8S_002_TIM精確延時(阻塞式)

上一篇:IAR調試stm8單片機時延時函數被優化的問題
下一篇:STM8L101F3P6關于毫秒級延時函數不同寫法的波形

推薦閱讀

半導體設備業的春天即將到來。隨著我國半導體產業持續快速發展,國內半導體設備業呈現出較快發展的勢頭。在國家政府大力支持下,國產半導體設備銷售快速穩步增長。國產半導體設備規模十年翻了五倍根據國際半導體產業協會的數據看,2017年全球半導體設備商出貨金額達到了560億美元,年增40%。中國大陸的晶圓廠產能持續開出,2018年半導體設備需求將持續增加...
最近,突破30億票房的《流浪地球》想必很多人已經看過,其實總結起來,《流浪地球》就是保護人類的一個計劃。當人們開始面臨無法忍受的酷熱、寒冷以及消失殆盡的大氣和淡水、地殼擠壓形成頻繁地震、地幔撕裂造成巖漿亂涌等等地獄式的災難時,人們只能進行星際移民。星際移民與我們普通的航空、航海不同,其航行過程可能要花上百年、千年或萬年,《流浪地球...
#include <msp430f149.h>#define uint unsigned int void delay(int x){ int i,j; for(i=x;i>0;i--) for(j=112;j>0;j--);}int main( void ){// uint a; P2DIR = 0XFF; WDTCTL = WDTPW + WDTHOLD;/* BCSCTL1 &= ~XT2OFF; do { IFG1 &= ~OFIFG; for(a=0xff;a>0;a--); } while(IFG1 & OFIF...

史海拾趣

問答坊 | AI 解惑

動態麗彩LED解析

當我們把目光聚焦在有BRAVIA史上“最高畫質”稱號的新旗艦X4500時,“TRILUMINOSRGB-LEDDynamicLED”背光源這個名詞就會頻繁出現在我們眼前。那么TRILUMINOSRGB-LEDDynamicLED“動態麗彩LED”背光源到底有什么優勢呢? 眾所周知,液晶面板本身 ...…

查看全部問答∨

關于Vcc和Vdd的區別

一、解釋  VCC:C=circuit 表示電路的意思, 即接入電路的電壓;  VDD:D=device 表示器件的意思, 即器件內部的工作電壓;  VSS:S=series 表示公共連接的意思,通常指電路公共接地端電壓。  二、說明  1、對于數字電路來說,VCC是電路的 ...…

查看全部問答∨

關于NK燒到FLASH中運行的問題

問題是這樣的,原來將NK.BIN燒到FLASH的首地址中 0x60000000 (FLASH的物理地址)可以正常啟動鏡像. 現在需要把NK往后一段,以保證不把原來燒在FLASH里EBOOT覆蓋掉,比如0x60080000 現在我修改了CONFIG.BIB,下載后通過超級終端看到了確實是燒在了0x6008 ...…

查看全部問答∨

IO驅動的使用

想問一下, 我的系統是LINUX系統,內核為2.6 板上的按鍵驅動已經寫好, 板上有四個鍵,當我按下相應該的鍵的時候,終端就在鍵值出起,這些鍵是接到中斷接口的,也就是說,按鍵按下就觸發了外部中斷 現在我想寫個小程序,希望能夠觸發相應該的中斷,從而終 ...…

查看全部問答∨

HPI通信問題

我用的arm-s3c2410和dsp-c64x利用HPI進行通信,目前已經可以利用ARM的數據和地址總線對dsp進行讀寫了,但是當進行大量數據的讀寫時會出現錯誤, 嚴重的會造成ARM死機,而此時DSP的HPIC寄存器的HRDY位變成0,不變,接下去的傳 ...…

查看全部問答∨

rabbit2000嵌入式開發

請教各位大俠:   有用過rabbit2000的嗎???求教如何編程串口為奇偶效驗,數據位5-9…

查看全部問答∨

菜鳥提問:注入轉換(injectedconversion)是指什么?

                                 這幾天看STM32手冊,看到了injected&nbsp;conversion這個概念,不知道它的具體功能是什么,而injected&nbsp;co ...…

查看全部問答∨

投票--你怎樣做電路試驗?

了解一下大家怎樣學電路…

查看全部問答∨

stm32數據手冊

stm32f103,stm32f407數據手冊…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 贵德县| 济阳县| 襄城县| 东方市| 高陵县| 五指山市| 青田县| 綦江县| 阿克苏市| 乌兰察布市| 枝江市| 奉节县| 花垣县| 江安县| 江口县| 东方市| 文登市| 六安市| 新昌县| 东宁县| 阳原县| 新营市| 阿克陶县| 湄潭县| 龙岩市| 张家港市| 新沂市| 博客| 玛沁县| 黄梅县| 龙岩市| 曲麻莱县| 横山县| 平远县| 黄浦区| 买车| 甘孜县| 滕州市| 巨鹿县| 罗甸县| 松原市|