SysTick定時器和delay延遲函式

2021-09-23 20:39:44 字數 1769 閱讀 6972

1,systick_clksourceconfig()分析:

在fwlib-misc.c中找到systick_clksourceconfig()函式原始碼:

void systick_clksourceconfig(uint32_t systick_clksource)

else

}功能:配置systick->ctrl暫存器

在core_cm3.h中找到systick結構體定義:

#define systick_base  (scs_base +  0x0010)    /* systick base address */

#define systick   ((systick_type *) systick_base) /* systick configuration struct */

typedef struct

systick_type;

systick_clksourceconfig引數的兩種情況:

#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 內部時鐘 hclk=72m

2,systick_config(uint32_t ticks)分析  core_cm3.h中找到systick_config函式原始碼:

static __inline uint32_t systick_config(uint32_t ticks)

#endif

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

引數ticks:設定多少個systick時鐘週期產生一次中斷

systick實現延時函式:

1,延時函式初始化

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

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

void delay_init()

2,微秒延時函式

/* nus : 延時多少微秒 */

void delay_us(u32 nus)

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

systick->ctrl&=~systick_ctrl_enable_msk; // 關閉使能

systick->val =0x00;                      // 重置val

}3,毫秒延時函式

/*  nms : 延時多少毫秒 */

void delay_ms(u16 nms)

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

systick->ctrl&=~systick_ctrl_enable_msk;

systick->val =0x00;

}

SysTick 系統定時器

本章參考資料 arm cortex m4f 技術參考手冊 4.5 章節 systick timer stk 和 4.48 章節 shprx,其中 stk 這個章節有 systick 的簡介和暫存器的詳細描述。因為 systick 是屬於 cm4 核心的外設,有關暫存器的定義和部分庫函式都在 core...

systick(滴答定時器)

今天主要總結一下滴答定時器的相關操作 首先,他是乙個24位的倒數定時器,當計數到0的時候,會從lora暫存器中重新裝載值,只要不把ctrl暫存器中enable清零,他就不會停止。滴答的結構體如下 typedef struct systick type 通常使用前三個暫存器。控制盒狀態暫存器 ctrl...

SysTick 系統定時器

本章參考資料 arm cortex m4f 技術參考手冊 4.5 章節 systick timer stk 和 4.48 章節 shprx,其中 stk 這個章節有 systick 的簡介和暫存器的詳細描述。因為 systick 是屬於 cm4 核心的外設,有關暫存器的定義和部分庫函式都在 core...