国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年07月17日(星期四)

2018年07月17日 | SysTick定時器和delay延遲函數(shù)

發(fā)布者:chi32 來源: eefocus關(guān)鍵字:SysTick  定時器  delay  延遲函數(shù) 手機看文章 掃描二維碼
隨時隨地手機看文章

一,什么是Systick定時器


  Systick定時器也叫滴答定時器,是內(nèi)核級別的24位倒計數(shù)簡單定時器,常用做延遲和系統(tǒng)心跳時鐘(如:UCOS) 

  優(yōu)點:節(jié)省MCU資源,不需要浪費一個定時器,只要不清除Systick使能位,就不會停止,即使在睡眠模式下也能工作 

  捆綁在NVIC中斷優(yōu)先級管理,能產(chǎn)生Systick異常(中斷),可設(shè)置中斷優(yōu)先級


二,Systick相關(guān)寄存器


  CTRL: Systick控制和狀態(tài)寄存器 

  LOAD: Systick重裝載寄存器 

  VAL: Systick當前值寄存器 

  CALIB: Systick校準值寄存器 

  定時器工作方式: 

  每經(jīng)過一個Systick時鐘周期,VAL寄存器值-1,當VAL=0,LOAD寄存器中的重裝載值賦值給VAL寄存器作為初值….


 1,CTRL-控制和狀態(tài)寄存器


  這里寫圖片描述 

  CLKCOURCE-時鐘源 

   0:外部時鐘源HCLK(AHB總線時鐘)/8 72M/8 = 9M 

   1:內(nèi)核時鐘(HCLK) 72M 

  配置函數(shù):


    SysTick_CLKSourceConfig();

1

 2,LOAD-Systick重裝載寄存器


  這里寫圖片描述


 3,VAL-Systick當前值寄存器


  這里寫圖片描述 

  每經(jīng)過一個Systick時鐘周期,VAL寄存器值-1 

  讀取寄存器:返回當前VAL值 

  寫寄存器:清零VAL值,還會使CTRL中COUNTFLAG位清零


 4,CALIB-Systick校準值寄存器


  這里寫圖片描述


三,SysTick函數(shù)


 固件庫SysTick相關(guān)函數(shù)


SysTick_CLKSourceConfig()          //Systick選擇時鐘源(FWLIB-misc.c文件中)

SysTick_Config(uint32_t ticks)     //初始化Systick(CORE-core_cm3.h文件中)

1

2

 Systick中斷服務(wù)函數(shù):


void SysTick_Handler(void);

1

1,SysTick_CLKSourceConfig()分析:


在FWLIB-misc.c中找到SysTick_CLKSourceConfig()函數(shù)源碼:

/**

  * @brief  Configures the SysTick clock source.

  * @param  SysTick_CLKSource: specifies the SysTick clock source.

  *   This parameter can be one of the following values:

  *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.

  *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.

  * @retval None

  */

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)

{

  /* Check the parameters */

  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));

  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)

  {

    SysTick->CTRL |= SysTick_CLKSource_HCLK;          //內(nèi)部時鐘72M

  }

  else

  {

    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;     //外部時鐘 72/8=9M

  }

}


 功能:配置SysTick->CTRL寄存器


 在core_cm3.h中找到SysTick結(jié)構(gòu)體定義:


#define SysTick_BASE  (SCS_BASE +  0x0010)    /* SysTick Base Address */


#define SysTick   ((SysTick_Type *) SysTick_BASE) /* SysTick configuration struct */


/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick

  memory mapped structure for SysTick

  @{

 */

typedef struct

{

  __IO uint32_t CTRL;         /*!< Offset: 0x00  SysTick Control and Status Register */

  __IO uint32_t LOAD;         /*!< Offset: 0x04  SysTick Reload Value Register       */

  __IO uint32_t VAL;          /*!< Offset: 0x08  SysTick Current Value Register      */

  __I  uint32_t CALIB;        /*!< Offset: 0x0C  SysTick Calibration Register        */

} SysTick_Type;


 SysTick_CLKSourceConfig參數(shù)的兩種情況:


/** @defgroup SysTick_clock_source

  * @{

  */


#define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)

#define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)

#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \

                                       ((SOURCE) == SysTick_CLKSource_HCLK_Div8))


兩種時鐘源 : 

  SysTick_CLKSource_HCLK_Div8 外部時鐘 72/8=9M 

  SysTick_CLKSource_HCLK 內(nèi)部時鐘 HCLK=72M


2,SysTick_Config(uint32_t ticks)分析


core_cm3.h中找到SysTick_Config函數(shù)源碼:


/**

 * @brief  Initialize and start the SysTick counter and its interrupt.

 *

 * @param   ticks   number of ticks between two interrupts

 * @return  1 = failed, 0 = successful

 *

 * Initialise the system tick timer and its interrupt and start the

 * system tick timer / counter in free running mode to generate

 * periodical interrupts.

 */

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

{

  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);       //ticks參數(shù)有效性檢查


  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //設(shè)置重裝載值

                                                    //-1:裝載時消耗掉一個Systick時鐘周期


  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //配置NVIC


  SysTick->VAL   = 0;    //初始化VAL=0,使能Systick后立刻進入重裝載

  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |      //選擇時鐘源

                   SysTick_CTRL_TICKINT_Msk   |      //開啟Systick中斷

                   SysTick_CTRL_ENABLE_Msk;          //使能Systick定時器

  return (0);      /* Function successful */

}


#endif


作用:使能Systick定時器,開啟SysTick中斷,配置中斷時間間隔 

參數(shù)ticks:設(shè)置多少個Systick時鐘周期產(chǎn)生一次中斷


四,SysTick實現(xiàn)延時函數(shù)


1,延時函數(shù)初始化


static u8  fac_us=0;           //延時微秒的頻率

static u16 fac_ms=0;           //延時毫秒的頻率


void delay_init()

{

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇時鐘源-外部時鐘-HCLK/8

    fac_us=SystemCoreClock/8000000; // 72/8 延時1微秒9個時鐘周期

    fac_ms=(u16)fac_us*1000;   // 延時1毫秒9000個Cystic時鐘周期

}


2,微秒延時函數(shù)


/**

 * nus : 延時多少微秒

 **/

void delay_us(u32 nus)

{

    u32 temp;

    //nus*fac_us值最大不能超過SysTick->LOAD(24位)-1

    SysTick->LOAD=nus*fac_us;    // 設(shè)置重載值:n(us)*延時1us需要多少個SysTick時鐘周期

    SysTick->VAL=0x00;                       // VAL初始化為0

    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; // 使能SysTick定時器

    do

    {

        temp=SysTick->CTRL;

    }while((temp&0x01)&&!(temp&(1<<16)));    // 等待計數(shù)時間到達(位16)

    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; // 關(guān)閉使能

    SysTick->VAL =0X00;                      // 重置VAL

}


3,毫秒延時函數(shù)


/**

 * nms : 延時多少毫秒

 **/

void delay_ms(u16 nms)

{

    u32 temp;

    SysTick->LOAD=(u32)nms*fac_ms;

    SysTick->VAL =0x00;

    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;

    do

    {

        temp=SysTick->CTRL;

    }while((temp&0x01)&&!(temp&(1<<16)));

    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;

    SysTick->VAL =0X00;

}


關(guān)鍵字:SysTick  定時器  delay  延遲函數(shù) 引用地址:SysTick定時器和delay延遲函數(shù)

上一篇:STM32之Systick定時器解析
下一篇:stm32f103 FreeRTOS 滴答時鐘配置

推薦閱讀

當前,全球集成電路產(chǎn)業(yè)已進入重大調(diào)整變革期。從世界集成電路產(chǎn)業(yè)版圖演進的趨勢來看,市場在向我國集中,產(chǎn)業(yè)的未來也必將向我國集中,為我國集成電路產(chǎn)業(yè)實現(xiàn)趕超提供了千載難逢的機遇。?隨著全球半導體產(chǎn)業(yè)進入成熟期,企業(yè)間整合并購成為大勢所趨。根據(jù)我國集成電路產(chǎn)業(yè)發(fā)展現(xiàn)狀,積極實施企業(yè)兼并重組,可以解決我國集成電路產(chǎn)業(yè)結(jié)構(gòu)不合理、集中度...
中國儲能網(wǎng)訊:“泛在電力物聯(lián)網(wǎng)(以下簡稱“泛在”)創(chuàng)造了新的市場機會,特變電工未來將圍繞整個電網(wǎng)企業(yè)進行變革和創(chuàng)新。”新特能源股份有限公司董事長、特變電工新疆新能源股份有限公司總經(jīng)理張建新談及企業(yè)未來發(fā)展時如此告訴《能源》記者。 泛在肇始于2019年3月,由國家電網(wǎng)提出,甫一面世便震動了整個能源行業(yè)。特變電工的核心業(yè)務(wù)與電網(wǎng)緊密相...
英國于7月14日宣布限制華為參加其5G建設(shè)。對此,據(jù)央視新聞消息,商務(wù)部發(fā)言人高峰在今天(16日)商務(wù)部舉行的例行發(fā)布會回應(yīng)稱,英國政府作出在5G網(wǎng)絡(luò)建設(shè)中排除中國企業(yè)的決定,中方對此堅決反對。英方的歧視性做法,與英國一貫主張的自由貿(mào)易原則背道而馳,嚴重違反世貿(mào)組織規(guī)則,嚴重削弱中方在英投資信心,嚴重影響中英經(jīng)貿(mào)合作氛圍,嚴重損害英國在...
近日,半導體行業(yè)權(quán)威機構(gòu)IC Insights發(fā)布了2020年底全球各個國家及地區(qū)的芯片產(chǎn)能數(shù)據(jù)圖。  下圖顯示了截至2020年12月份全球區(qū)域晶圓產(chǎn)能情況:需要注意的是,IC Insights的統(tǒng)計標準是根據(jù)工廠歸屬地來劃分的。例如三星在美國設(shè)立的工廠會算到美國的總產(chǎn)能中,臺積電在我國大陸設(shè)立的工廠算在大陸的總產(chǎn)能中。  通過圖片可以看出,截至2020年12月,...

史海拾趣

小廣播
設(shè)計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved