Systick滴答定時器寄存器、delay()延時函數、SysTick_Config函數

SysTick定時器
SysTick定時器,是一個簡單的定時器,對于CM3、CM4內核的芯片都有SysTick定時器。SysTick 是一個 24 位的倒計數定時器,當計數到 0 時,將從RELOAD 寄存器中自動重裝載定時初值,開始新一輪計數。只要不把它在 SysTick 控制及狀態寄存器中的使能位清除(不把Systick定時器關掉),就永不停息。SysTick定時器被捆綁在NVIC中,用于產生SYSTICK異常(異常號:15)。在以前,大多操作系統需要一個硬件定時器來產生操作系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務許以不同數目的時間片,確保沒有一個任務能霸占系統;或者把每個定時器周期的某個時間范圍賜予特定的任務等,還有操作系統提供的各種定時功能,都與這個滴答定時器有關。因此,需要一個定時器來產生周期性的中斷,而且最好還讓用戶程序不能隨意訪問它的寄存器,以維持操作系統“心跳”的節律。

作用:

Systick定時器常用來做延時,或者實時系統的心跳時鐘。這樣可以節省MCU資源,不用浪費一個定時器。比如:UCOS中,分時復用,需要一個最小的時間戳,一般在STM32+UCOS系統中,都采用Systick做UCOS的心跳時鐘。

Systick寄存器:

  • CLRL寄存器:Systick控制和狀態寄存器
  • LOAD寄存器:Systick自動重裝載寄存器
  • VAL寄存器:Systick當前值寄存器
  • CALIB寄存器:Systick校準值寄存器

Systick控制和狀態寄存器-CTRL
在這里插入圖片描述對于STM32,外部時鐘源是HCLK(AHB總線時鐘的1/8)內核時鐘是HCLK時鐘。
配置函數:Systick_CLKSourceConfig();

Systick重裝載數值寄存器-LOAD(24位)
在這里插入圖片描述
Systick當前值定時器-VAL
在這里插入圖片描述
Systick校準寄存器-CAL
在這里插入圖片描述
固件庫中的Systick相關函數:
SysTick_CLCSourConfig()//Systick時鐘源選擇,在misc.c文件中。
SysTick_config(uint32_t ticks)//初始化systick時鐘為HCLK,并開啟中斷,在core_cm3/core_cm4文件中。

Systick中斷服務函數:
void SysTick_Handler(void);

用中斷的方式實現delay延時:(比較耗費資源)

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{ TimingDelay = nTime;while(TimingDelay != 0);
}
void SysTick_Handler(void)
{if (TimingDelay != 0x00) { TimingDelay--;}
}int main(void){if (SysTick_Config(SystemCoreClock / 1000)) //systick時鐘為HCLK(系統時鐘),中斷時間間隔1ms,SysTick_Config()這個函數是設置兩次中斷之間的時間。{while (1);}while(1){ Delay(200);//200ms}
}

SysTick_Config函數:

SysTick_Config的參數,其實就是一個時鐘次數,叫systick重裝定時器的值。意思就是我要多少個1/fosc 時間后中斷一下。根據學過的物理中的時間與頻率的公式:fosc=1/T T=1/fosc ,fosc為Systick的頻率。如果STSystick時鐘頻率為:72MHz,每次的時間為:T=1/72MHz。1秒鐘為:1/(每次的時間)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。反過來講。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定時為1ms。如果需要1S則可以通一設置一個全局變量,然后定初值得為1000,這樣每個systick中斷一次,這個全局變量減1,減到0,即systick中斷1000次,時間為:1ms1000=1S。從而實現1S的定時。 因為SysTick定時器是:24位的,最大定時時間為:2的24次方(1/72MHz)的時間,這里Systick頻率為:72MHz的情況下。

delay_init()函數:

static u8  fac_us=0;//us延時倍乘數			   
static u16 fac_ms=0;//ms延時倍乘數,在ucos下,代表每個節拍的ms數
void delay_init()
{
#if SYSTEM_SUPPORT_OS  							//如果需要支持OS.u32 reload;
#endifSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//選擇外部時鐘  HCLK/8fac_us=SystemCoreClock/8000000;//為系統時鐘的1/8  相當于72000000/8000000等于九//一次是1/systick的時鐘頻率就是1/9 us,fac_us相當于1us,這里的將9賦值給他是給寄存器LOAD計數用的,從9到1就是1us
#if SYSTEM_SUPPORT_OS  //如果需要支持OS.reload=SystemCoreClock/8000000;//每秒鐘的計數次數 單位為M  reload*=1000000/delay_ostickspersec;//根據delay_ostickspersec設定溢出時間//reload為24位寄存器,最大值:16777216,在72M下,約合1.86s左右	fac_ms=1000/delay_ostickspersec;//代表OS可以延時的最少單位	   SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//開啟SYSTICK中斷SysTick->LOAD=reload; //每1/delay_ostickspersec秒中斷一次	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;	//開啟SYSTICK    #elsefac_ms=(u16)fac_us*1000;//非OS下,代表每個ms需要的systick時鐘數   
#endif
}								    

void delay_us()函數:

void delay_us(u32 nus)
{		u32 temp;	    	 SysTick->LOAD=nus*fac_us; 					//時間加載	  		 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;      					 //清空計數器	 
}

void delay_ms()函數:

void delay_ms(u16 nms)
{	 		  	  u32 temp;		   SysTick->LOAD=(u32)nms*fac_ms;				//時間加載(SysTick->LOAD為24bit)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;       					//清空計數器	  	    
} 
  • T=1/1KHZ=1ms=1微秒=1/1000秒
  • T=1/1MHZ=1us=1微秒=1/1000000秒
  • 10MHz=1/10us=0.1us
  • 20MHz=1/20us=0.05us
  • 50MHz=1/50us=0.02us
  • 1GHz=1ns=1納秒=1/1000000000秒
  • 1MHZ=1000KHZ=1000000HZ
  • 1GHZ=1000MHZ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272338.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

查看docker容器日志

1&#xff1a;實時查看docker容器id為 02c5ac132ee5 的最后10行日志 docker logs -f -t --tail 10 02c5ac132ee5 2:查看指定時間后的日志&#xff0c;只顯示最后100行&#xff1a; docker logs -f -t --since"2020-02-14" --tail100 d7db22166a0a 3:查看最近20分鐘的…

Web UI 自動化測試環境搭建 (轉載自51測試天地第三十九期上)

1. 安裝 Python 2.7 并設置系統環境變量 2. 下載并安裝 python setuptools Easily download, build, install, upgrade, and uninstall Python packages https://pypi.python.org/pypi/setuptools#installation-instructions 2.1 找到ez_setup.py&#xff0c;點擊右鍵--目標另存…

STM32F1 端口復用、端口(部分和完全)重映射

端口復用功能 STM32 有很多的內置外設&#xff08;比如&#xff1a;串口、ADC、DAC等是獨立的模塊和內核連接在一起&#xff09;&#xff0c;這些外設的外部引腳都是與 GPIO 復用的。也就是說&#xff0c;一個 GPIO如果可以復用為內置外設的功能引腳&#xff0c;那么當…

docker啟動容器后容器狀態為Exited (137) 5 seconds ago

1&#xff1a;因為容器里的運行的代碼報錯了&#xff0c;然后容器 Exited (1) 3 seconds ago 了&#xff0c;通過 docker logs -f container_id 能看到哪里錯了 容器樁體為exited&#xff0c;說明容器已經退出停止 先查看查看鏡像id ps images 在后臺運行一個容器 為了保證提…

ReflectionClass與Closure

<?php /*** Class A*/ class A{}$obj new ReflectionClass(A); var_export($obj.PHP_EOL); 類后面加上PHP_EOL會把當前類的詳細接口文檔打印出來。 ReflectionClass 可以利用這個動態創建類&#xff0c;動態使用類方法參數。 try{ //如果存在控制器名字的類 if(class_exis…

STM32中斷優先級的管理(NVIC)

STM32 NVIC 中斷優先級管理 CM3 內核支持 256 個中斷&#xff0c;其中包含了 16 個內核中斷和 240 個外部中斷&#xff0c;并且具有 256級的可編程中斷設置。STM32 并沒有使用 CM3 內核的全部東西&#xff0c;而是只用了它的一部分。STM32 有 84 個中斷&#xff0c;包括 16 個…

docker修改容器名字

查看一下容器的名字 這個laughing_elion是下載es時候默認的名字 修改容器名字 docker rename 容器原來名 要改為的名字 最后可以看到容器名已經修改成功

STM32 串行通信原理

處理器與外部設備通信的兩種方式&#xff1a; 并行通信 傳輸原理&#xff1a;數據各個位同時傳輸。優點&#xff1a;速度快缺點&#xff1a;占用引腳資源多 串行通信 傳輸原理&#xff1a;數據按位順序傳輸。優點&#xff1a;占用引腳資源少缺點&#xff1a;速度相對較慢 …

linus下centos7防火墻設置

CentOS7 默認使用firewalld防火墻&#xff0c;如果想換回iptables防火墻&#xff0c;可關閉firewalld并安裝iptables。 1:安裝firewalld服務 yum install firewalld 2、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld &#xff08;關閉后顯示notrunning&a…

串口通信寄存器/庫函數配置、實例編寫

常用的串口相關寄存器 USART_SR狀態寄存器USART_DR數據寄存器USART_BRR波特率寄存器 串口操作相關庫函數&#xff08;省略入口參數&#xff09;&#xff1a; void USART_Init(); //串口初始化&#xff1a;波特率&#xff0c;數據字長&#xff0c;奇偶校驗&#xff0c;硬件流…

使用docker安裝Mongodb

下載mongo3.2的docker鏡像&#xff1a; docker pull mongo:3.2 使用docker命令啟動&#xff1a; docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:3.2 查看已經成功啟動

移動端meta標簽

現在的手機或平板電腦等移動設備上的瀏覽器默認都有雙擊放大的設置&#xff0c;如何阻止雙擊放大&#xff1f;user-scalableno <!-- 禁止縮放 --> <meta name”viewport” content”widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno”> <!…

正點原子stm32--串口通信實驗講解里關于USART_RX_STA的問題與思考

這篇博文講的挺詳細的可以參考以下&#xff1a; USART_RX_STA詳解

什么是真正的程序員?

什么是真正的程序員 這篇文章的原文來自&#xff1a;A Little Printf Story作者仿照《小王子》中的情節&#xff0c;通過小printf遇見的不同類型的程序員&#xff0c;最后悟出什么才是真正的程序員&#xff01;第一次翻譯有很多不妥&#xff0c;歡迎留言指正。 文章略長&#x…

為什么會出現docker

docker鏡像&#xff0c;一次構建&#xff0c;到處運行

docker和虛擬機的區別

虛擬機缺點&#xff1a; docker和虛擬機的不同之處&#xff1a;

獨立看門狗實驗

為什么要看門狗 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff0c;而陷入死循環&#xff0c;程序的正常運行被打斷&#xff0c;由單片機控制的系統無法繼續工作&#xff0c;會造成整個系統…

Manthan, Codefest 16

暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void main(String[] args) {Scanner cin new Scanner (new BufferedInputStream (System.in));int a cin.nextInt ();int b cin.nextInt ();int c cin.nextInt ();for…

docker資源

Docker資源 Docker官方英文資源&#xff1a; docker官網&#xff1a;http://www.docker.com Docker windows入門&#xff1a;https://docs.docker.com/windows/ Docker Linux 入門&#xff1a;https://docs.docker.com/linux/ Docker mac 入門&#xff1a;https://docs.do…

ios apple pay 證書配置

一 環境配置 需要開發者賬號 開發者中心https://developer.apple.com/membercenter/index.action 添加一個APP IDs二&#xff0e;配置Merchant IDs商業ID 下面進行appids和商業id的綁定 之后在回到appids中查看id中的apple pay&#xff0c;發現已經變為可使用狀態了 接下來是為…