0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用定時(shí)器中斷代替延時(shí)函數(shù)(包含例程+原理思想)

jf_58200326 ? 來源:jf_58200326 ? 作者:jf_58200326 ? 2023-04-03 14:11 ? 次閱讀

前言


本文主要基于stm32f103系列講解定時(shí)器中斷進(jìn)行計(jì)時(shí)代替延時(shí)函數(shù),其中思路和原理同時(shí)適用于其他系列的單片機(jī)

一、使用定時(shí)器中斷的優(yōu)缺點(diǎn)


相較于普通延時(shí)函數(shù)(delay),定時(shí)器中斷計(jì)時(shí)無論是從代碼的體量,還是使用,都要比延時(shí)函數(shù)更多更復(fù)雜,也更難理解。既然延時(shí)函數(shù)如此便捷,那我們又為什么不使用它呢?

首先在使用延時(shí)函數(shù)時(shí),程序會(huì)停止在延時(shí)函數(shù)的位置,直到延時(shí)結(jié)束,在一些簡單程序,使用延時(shí)函數(shù)的影響確實(shí)可以忽略不計(jì),但是過多的延時(shí)函數(shù)會(huì)使程序變得臃腫,編譯執(zhí)行時(shí)間大大增加,程序的精度會(huì)下降,例如利用按鍵控制led燈時(shí),led燈會(huì)不受按鍵控制,出現(xiàn)時(shí)靈時(shí)不靈的情況,這種情況就是延時(shí)函數(shù)使用過多造成的,更嚴(yán)重的甚至?xí)斐蓡纹瑱C(jī)宕機(jī)。

所以,為了避免這種情況的發(fā)生,我們可以使用定時(shí)器中斷來代替延時(shí)函數(shù),下面是我個(gè)人的一些理解和認(rèn)識(shí),如有不足,歡迎指正。

二、使用步驟


1.原理思路


首先,我們需要配置一個(gè)定時(shí)器,stm32一般選用通用定時(shí)器即可,我們可以利用定時(shí)器初始化函數(shù)設(shè)定定時(shí)器計(jì)時(shí)一次的時(shí)間,公式如下:

定時(shí)時(shí)間=(arr+1)(psc+1)/Tclk

其中arr為自動(dòng)重裝載值,psc為預(yù)分頻系數(shù),TCLK為時(shí)鐘頻率,例如:TCLK=72MHz,那么psc=71,所以可以理解為時(shí)間就是(arr+1)微妙,那么如果我想定時(shí)1ms,arr取999即可(arr,psc為定時(shí)器初始化函數(shù)形參)。

當(dāng)定時(shí)器的計(jì)數(shù)器計(jì)數(shù)到自動(dòng)重裝載值時(shí),進(jìn)入中斷服務(wù)函數(shù),這時(shí)我們需要設(shè)置一個(gè)標(biāo)志位(flag)和作為計(jì)數(shù)用的值(count),每次進(jìn)入中斷count執(zhí)行自加或自減,當(dāng)其自加或自減到設(shè)置的數(shù)值時(shí),標(biāo)志位反轉(zhuǎn)。

例如:定時(shí)200ms,已知1ms進(jìn)入一次中斷,標(biāo)志位flag初始值為0,那么讓count自加到200,因?yàn)槊看巫约邮?ms,自加兩百次就是200ms,這時(shí)flag置1表示到達(dá)200毫秒并可以執(zhí)行相關(guān)程序。

2.相關(guān)代碼


(1).定時(shí)器初始化

(這里我初始的是TIM2)

TIMER.H

#ifndef __TIMER_H
#define __TIMER_H

#include "sys.h"
#include "stm32f10x_tim.h"

void TIM2_Int_Init(u16 arr,u16 psc);//通用定時(shí)器的初始化函數(shù);arr:自動(dòng)重裝載值psc:預(yù)分頻系數(shù)

#endif


TIMER.C

#include "TIMER.h"


void TIM2_Int_Init(u16 arr,u16 psc)//通用定時(shí)器3的初始化函數(shù)
{
	//定義相關(guān)結(jié)構(gòu)體
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;//定義一個(gè)定時(shí)器初始化的結(jié)構(gòu)體
	NVIC_InitTypeDef NVIC_InitStrue;//定義中斷優(yōu)先級初始化的函數(shù)

	//使能定時(shí)器時(shí)鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能通用定時(shí)器3的時(shí)鐘

	//設(shè)置并初始化定時(shí)器TIM2
	TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;//計(jì)數(shù)模式設(shè)置為向上計(jì)數(shù)
	TIM_TimeBaseInitStrue.TIM_Period=arr;//計(jì)數(shù)器模式為向上計(jì)數(shù)時(shí),定時(shí)器從0開始計(jì)數(shù),超過arr    
                                        	//觸發(fā)定時(shí)中斷服務(wù)函數(shù)
	TIM_TimeBaseInitStrue.TIM_Prescaler=psc;//預(yù)分頻系數(shù),決定每一個(gè)計(jì)數(shù)的時(shí)長
	TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//一般不使用,默認(rèn)為TIM_CKD_DIV1
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStrue);//根據(jù)參數(shù)初始化定時(shí)器TIM3

	//使能定時(shí)器中斷
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能TIM3的中斷,中斷模式為更新中斷

	//初始化定時(shí)器中斷,定時(shí)器中斷優(yōu)先級設(shè)置
	NVIC_InitStrue.NVIC_IRQChannel=TIM2_IRQn;//中斷通道設(shè)置為TIM3
	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//使能中斷
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//搶占優(yōu)先級為1級
	NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//響應(yīng)優(yōu)先級為1級
	NVIC_Init(&NVIC_InitStrue);//根據(jù)參數(shù)初始化中斷寄存器

	//使能定時(shí)器
	TIM_Cmd(TIM2,ENABLE);//使能通用定時(shí)器TIM2
}

(2).stm32f10x_it.c(該文件專門用于存放中斷服務(wù)函數(shù))


#include "stm32f10x_it.h"


extern u8 flag;//標(biāo)志位

void TIM2_IRQHandler()
{
	static u8 count;


	 if(TIM_GetITStatus(TIM2, TIM_IT_Update)==1) //當(dāng)發(fā)生中斷時(shí)狀態(tài)寄存器(TIMx_SR)的bit0會(huì)被硬件 
                                             //置1
	{
 		if(count--==0)
 		{
  			count=20;
  			flag=1;
 		}

	
 		TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //狀態(tài)寄存器(TIMx_SR)的bit0置0
	}
}

(3).主函數(shù)main.c

#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "sys.h"

u8 flag=0;


int main(void)
{
	delay_init();     //初始化延時(shí)函數(shù)
	LED_Init();      //初始化led燈
	TIM2_Int_Init(9999,71);   //定時(shí)10ms進(jìn)入一次中斷

   	while(1)
  	{
        if(flag==1)    //標(biāo)志位置一代表一次定時(shí)完成
  		{
   			PAout(2)=~PAout(2);    //led2取反
   			flag=0;                //標(biāo)志位置0,再次計(jì)時(shí)(該程序設(shè)置一次定時(shí)為200ms)
  		}
  	 }
}

3.效果:


每隔200msLED燈閃爍。

總結(jié)

以上是本人對定時(shí)器中斷的一些認(rèn)識(shí)(本人小白),其中有些地方講解不到位,還望各位指正,歡迎評論區(qū)留言。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6040

    文章

    44594

    瀏覽量

    636924
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    900

    瀏覽量

    41593
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3254

    瀏覽量

    115074
  • STM32F103
    +關(guān)注

    關(guān)注

    33

    文章

    478

    瀏覽量

    63733
  • 延時(shí)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    10042
收藏 人收藏

    評論

    相關(guān)推薦

    STM32 SYSTICK定時(shí)器常見問題

    我們知道,STM32庫函數(shù)里通常使用來自內(nèi)核的系統(tǒng)定時(shí)器SYSTICK作為時(shí)基,實(shí)現(xiàn)計(jì)數(shù)延時(shí)。一般來講,ST公司提供的庫函數(shù)里將SYSTICK定時(shí)器
    發(fā)表于 09-13 16:20 ?3080次閱讀

    如何利用定時(shí)器編寫精確的延時(shí)函數(shù)?

    什么是定時(shí)器/計(jì)數(shù)??AT89C51的定時(shí)器/計(jì)數(shù)器具有哪些特性參數(shù)?如何利用定時(shí)器編寫精確的延時(shí)
    發(fā)表于 09-30 06:00

    SysTick定時(shí)器是如何利用中斷去實(shí)現(xiàn)延時(shí)函數(shù)

    SysTick定時(shí)器是什么?SysTick定時(shí)器是如何利用中斷去實(shí)現(xiàn)延時(shí)函數(shù)呢?
    發(fā)表于 11-24 06:13

    51單片機(jī)定時(shí)器中斷例程

    這個(gè)兩個(gè)rar文件是關(guān)于定時(shí)器0使用的例子, 也是我第一次使用定時(shí)器0做的實(shí)驗(yàn)程序: 1. T0_ASM.rar, (帶中文注釋的C51語言例程), 利用
    發(fā)表于 05-26 17:06 ?397次下載

    stm32定時(shí)器中斷程序

    STM32的定時(shí)器是個(gè)強(qiáng)大的模塊,定時(shí)器使用的頻率也是很高的,定時(shí)器可以做一些基本的定時(shí),還可以做PWM輸出或者輸入捕獲功能。 以下是進(jìn)行stm32
    發(fā)表于 10-12 16:59 ?1.3w次閱讀

    基于STM32定時(shí)器實(shí)現(xiàn)毫秒延時(shí)函數(shù)

    STM32定時(shí)器包含基本定時(shí)器、通用定時(shí)器和高級定時(shí)器,其中TIM6和TIM7是STM32當(dāng)中的基本定時(shí)
    發(fā)表于 10-12 15:54 ?2.5w次閱讀
    基于STM32<b class='flag-5'>定時(shí)器</b>實(shí)現(xiàn)毫秒<b class='flag-5'>延時(shí)</b><b class='flag-5'>函數(shù)</b>

    51單片機(jī)中斷嵌套,定時(shí)器延時(shí)

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔51單片機(jī)中斷嵌套,定時(shí)器延時(shí)前言一、如何做到定時(shí)器延時(shí)?二、如何做到外部
    發(fā)表于 11-20 17:06 ?17次下載
    51單片機(jī)<b class='flag-5'>中斷</b>嵌套,<b class='flag-5'>定時(shí)器</b><b class='flag-5'>延時(shí)</b>

    "外部中斷,定時(shí)器中斷的理解"

    外部中斷外部中斷一般是由計(jì)算機(jī)外設(shè)發(fā)出的中斷請指求,如:鍵盤中斷、打印機(jī)中斷、定時(shí)器
    發(fā)表于 11-22 13:21 ?16次下載
    "外部<b class='flag-5'>中斷</b>,<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>的理解"

    通用定時(shí)器實(shí)現(xiàn)STM32單片機(jī)微秒級延時(shí)函數(shù)

    一、前言在實(shí)際應(yīng)用中,經(jīng)常用到延時(shí)函數(shù),而HAL庫的延時(shí)函數(shù)是毫秒級的,雖然可以自行修改,但該函數(shù)使用的地方較多,修改不慎可能會(huì)引起其他問題
    發(fā)表于 11-24 18:51 ?20次下載
    通用<b class='flag-5'>定時(shí)器</b>實(shí)現(xiàn)STM32單片機(jī)微秒級<b class='flag-5'>延時(shí)</b><b class='flag-5'>函數(shù)</b>

    STM32F4: Systick滴答定時(shí)器-延時(shí)函數(shù)講解(五)

    Systick定時(shí)器基礎(chǔ)知識(shí)講解Systick相關(guān)寄存函數(shù)講解delay延時(shí)函數(shù)講解(Systick應(yīng)用)(借鑒正點(diǎn)原子網(wǎng)課)(一)Sy
    發(fā)表于 12-01 15:21 ?15次下載
    STM32F4: Systick滴答<b class='flag-5'>定時(shí)器</b>-<b class='flag-5'>延時(shí)</b><b class='flag-5'>函數(shù)</b>講解(五)

    SysTick 定時(shí)器

    的SysTick定時(shí)器來實(shí)現(xiàn)延時(shí),可以不占用系統(tǒng)定時(shí)器,節(jié)約資源。由于SysTick是在CPU核內(nèi)部實(shí)現(xiàn)的,跟MCU外設(shè)無關(guān),因此它的代碼可以在不同廠家之間移植。本 章 將 使用系統(tǒng)滴答定時(shí)器
    發(fā)表于 12-05 14:51 ?9次下載
    SysTick <b class='flag-5'>定時(shí)器</b>

    (指南者)(二)寄存定時(shí)器中斷

    (指南者)(二)寄存、定時(shí)器中斷寄存器定時(shí)器時(shí)鐘定時(shí)器寄存0110代碼
    發(fā)表于 12-23 19:19 ?0次下載
    (指南者)(二)寄存<b class='flag-5'>器</b>、<b class='flag-5'>定時(shí)器</b>和<b class='flag-5'>中斷</b>

    定時(shí)器中斷是什么意思,定時(shí)器中斷的工作原理

    定時(shí)器中斷是由單片機(jī)中的定時(shí)器溢出而申請的中斷。51單片機(jī)中有兩個(gè)定時(shí)器T0和T1。STM32中共有11個(gè)
    的頭像 發(fā)表于 07-23 09:45 ?6283次閱讀

    定時(shí)器中斷程序怎么寫

    達(dá)到預(yù)定的定時(shí)時(shí)間時(shí),它會(huì)產(chǎn)生一個(gè)中斷信號(hào),稱為定時(shí)器中斷。在本文中,我們將詳細(xì)了解如何編寫定時(shí)器中斷
    的頭像 發(fā)表于 09-01 10:17 ?1992次閱讀

    RA2E1定時(shí)器帶死區(qū)互補(bǔ)PWM中斷延時(shí)問題分析

    RA2E1定時(shí)器帶死區(qū)互補(bǔ)PWM中斷延時(shí)問題分析
    的頭像 發(fā)表于 10-27 10:56 ?774次閱讀
    RA2E1<b class='flag-5'>定時(shí)器</b>帶死區(qū)互補(bǔ)PWM<b class='flag-5'>中斷</b><b class='flag-5'>延時(shí)</b>問題分析