1. 程式人生 > >【stm32f407】SysTick實現延時

【stm32f407】SysTick實現延時

一.SysTick介紹:

CM4核心的處理和CM3一樣,內部都包含了一個SysTick定時器,SysTick 是一個24 位的倒計數定時器,當計到0 時 ,將 從RELOAD 暫存器中自動重灌載定時初值。只要不把它在SysTick 控制及狀態暫存器中的使能位清除,就永不停息。我們就是利用STM32的內部SysTick來實現延時的,這樣既不佔用中斷,也不佔用系統定時器

通常SysTick可以通過中斷的方式來實現,後續會增加,但是目前只是通過輪詢的方式去實現

二.暫存器介紹

SysTick4個暫存器

對應的程式碼在core_cm4.h

typedefstruct
{
  __IO uint32_t CTRL;                    /*!< Offset: 0x000(R/W)  SysTick Control and StatusRegister */
  __IO uint32_t LOAD;                    /*!< Offset: 0x004(R/W)  SysTick Reload Value Register       */
  __IO uint32_t VAL;                     /*!< Offset: 0x008(R/W)  SysTick Current ValueRegister      */
  __I uint32_t CALIB;                  /*!< Offset: 0x00C (R/ ) SysTick Calibration Register       */
} SysTick_Type;

1)CTR暫存器如圖:

0位:ENABLESystick 使能位0:關閉Systick功能;1:開啟Systick功能)1位:TICKINTSystick 中斷使能位0:關閉Systick中斷;1:開啟Systick中斷)

2位:CLKSOURCESystick時鐘源選擇0:使用HCLK/8 作為Systick時鐘;1:使用HCLK作為Systick時鐘)

16位:COUNTFLAGSystick計數比較標誌,如果在上次讀取本暫存器後,SysTick 已經數到了0,則該位為1。如果讀取該位,該位將自動清零.

2)LOAD暫存器如圖:

Systick是一個遞減的定時器,當定時器遞減至

0時,過載暫存器中的值就會被重灌載,繼續開始遞減。STK_LOAD 過載暫存器是個24位的暫存器最大計數0xFFFFFF

3)VAL暫存器如圖:

也是個24位的暫存器,讀取時返回當前倒計數的值,寫它則使之清零,同時還會清除在SysTick 控制及狀態暫存器中的COUNTFLAG 標誌。

4)CALIB暫存器如圖

一般不會用到

三.原始碼

delay.h

#ifndef _DELAY_H_H_H
#define _DELAY_H_H_H
#include "stm32f4xx.h"

void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif

delay.c

#include "delay.h"

static u8  fac_us=0;		   
static u16 fac_ms=0;
void delay_init(u8 SYSCLK)
{
  SysTick->CTRL&=~(1<<2);
  fac_us=SYSCLK/8;
  fac_ms=((u32)SYSCLK*1000)/8;
}
void delay_xms(u16 nms)
{	 		  	  
  u32 temp;		   
  SysTick->LOAD=(u32)nms*fac_ms;
  SysTick->VAL =0x00;
  SysTick->CTRL=0x01 ;
  do
  {
    temp=SysTick->CTRL;
  }while((temp&0x01)&&!(temp&(1<<16)));
  SysTick->CTRL=0x00;
  SysTick->VAL =0X00;	  	    
} 

void delay_ms(u16 nms)
{
  u8 repeat=nms/540;
  u16 remain=nms%540;
  while(repeat)
  {
    delay_xms(540);
    repeat--;
  }
  if(remain)delay_xms(remain);
  
}
void delay_us(u32 nus)
{
  u32 temp;	    	 
  SysTick->LOAD=nus*fac_us;  		 
  SysTick->VAL=0x00;
  SysTick->CTRL=0x01 ;	 
  do
  {
    temp=SysTick->CTRL;
  }while((temp&0x01)&&!(temp&(1<<16)));
  SysTick->CTRL=0x00;
  SysTick->VAL =0X00;  
}

相關推薦

stm32f407SysTick實現

一.SysTick介紹: CM4核心的處理和CM3一樣,內部都包含了一個SysTick定時器,SysTick 是一個24 位的倒計數定時器,當計到0 時 ,將 從RELOAD 暫存器中自動重灌載定時初

STM32SysTick滴答定時器(delay函式講解)

STM32F1xx官方資料:《Cortex-M3權威指南-中文》-第8章最後一個小節:Systick定時器SysTick定時器Systick定時器,是一個簡單的定時器,對於CM3、CM4核心晶片,都有Systick定時器。Systick定時器常用來做延時,或者實時系統的心跳時

PHPPHP實現簡單的setTimeOut來完成非同步

一、需求來源。 開發微信公眾號時,當用戶關注我們的微訊號,我們需要傳送兩條不同型別的訊息給關注使用者。注意是不同型別。這麼說吧,要傳送Type1,Type2兩種訊息回覆給關注者。 其中關注這個事件,處理這個事件的流程如果傳送了其中1個型別的訊息,就無法傳送另

stm32f407外部中斷實現按鍵中斷方式

一.外部中斷 STM32F4的每個IO都可以作為外部中斷的中斷輸入口,這點也是STM32F4的強大之處。STM32F407的中斷控制器支援22個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都

Spring@PostConstruct實現Spring啟動靜態注入

public class CommonParaUtil{ @Autowired private ParaPropMapper paraPropMapper; private static CommonParaUtil util; //這個屬性就

Java提取JSON數值遇到數組集合使用的K-V方式轉換

方法 eee 數組 comm subst arr port jsonarray mob 1.實體類轉換方法 參照文章:http://www.cnblogs.com/dflmg/p/6933811.html 2.K-V方法(此方法比較笨,但是沒有辦法,我現在不知道有沒有相關的

Linux使用xshell登陸密碼框為灰色,無法輸入密碼

inline round spl log 退出 灰色 ref linu .cn 使用xshell登陸時,出現以上情況,那麽這到底值咋回事呢?經過查詢以後發現是服務器端設置問題,解決辦法如下:vi /etc/ssh/sshd_config接著保存退出,然後重啟sshd服務se

opencvJava實現的opencv3.x版本後Highhui報錯

-a sun div fan let 版本 ava line 報錯 隨筆為博主原創,如需轉載,請註明出處。 opencv3.x以後Highgui不再使用,用Imgcodecs代替,引入import org.opencv.imgcodecs.Imgcode

前端javascript實現導航欄筋鬥雲效果特效

超時 out die ron 滑動 scrip mouseover none point 實現效果:   實現效果如下圖所示 實現原理: 什麽是筋鬥雲效果: 這個效果很簡單,就是鼠標移到其他導航目錄時會有背景圖片跟著鼠標滑動到當前的目錄。 實現思路: 鼠標經過的時候

前端javascript實現帶有子菜單和控件的輪播圖slider

style creat radius .get abs weight col 技術分享 city 實現效果: 實現原理: // 步驟 // 1. 獲取事件源以及相關元素 // 2. 復制第一張圖片所在的li,添加到ul的最後面 // 3. 給ol添加li,ul中的個數-

C#C#實現事務

identity title ini body pro 簡單例子 ear scalar 技術分享 1、創建事務的結構 SqlConnection sqlConnection = new SqlConnection(); ...初始化連

Android如何實現Android發送短信

ted param close ase find array 短信 red phone 第一種:調用系統短信接口直接發送短信;主要代碼如下: /** * 直接調用短信接口發短信 * @param phoneNumber * @

quickhybrid如何實現一個Hybrid框架

釘釘 都是 不足 快速 view 環境 視野 swe 開發 章節目錄 【quickhybrid】如何實現一個跨平臺Hybrid框架 【quick hybrid】架構一個Hybrid框架 【quick hybrid】H5和Native交互原理 【quick hybrid】J

$.each遍歷實現

延時 因此 一次 ... set () down load pre 今天做項目時需要一功能,如題..... $.each(json, function(idx, obj) { setTimeout(function () {downloadFile(obj.fil

BIEE05_啟動BIEE,無法啟動BI_SERVER

ini ora biee style server clas gin 無法啟動 onf 本地修改資料庫後,重新啟動BIEE,結果報錯: 點擊【查看日誌信息】後 從這裏是沒看出是什麽問題造成的,那麽我們就要去查詢啟動日誌了 問題解決 找到日誌路徑:D:\obiee\in

JAVA實現過期MAP 支持自定義過期觸發事件

keys 算法 public 寫入 hash pty static 實現 ssa 如題,直接上代碼: 1 import java.util.Iterator; 2 import java.util.concurrent.ConcurrentHashMap; 3

模板deque實現單調隊列

getch info 常數 單調隊列 har nbsp lse esp gin 雙端隊列deque容器: 關於deque最常用的有這幾個函數: 都是成員函數 雙端隊列模板題:【洛谷】P2952 [USACO09OPEN]牛線Cow Line 1 #in

Qt實現sleep函數功能

proc IV RoCE color event return eve 函數功能 turn /* 函數名:sleep() 參 數: msec - 單位為毫秒 描 述: 延時功能 */ bool Test::sleep(unsigned i

Nginx Nginx實現端口轉發

nbsp 都是 localhost ron tro ups server 搭建 div 什麽是端口轉發 當我們在服務器上搭建一個圖書以及一個電影的應用,其中圖書應用啟動了 8001 端口,電影應用啟動了 8002 端口。此時如果我們可以通過 localhost:80

原創獲取MySQL crash 的core file

發生 gdb ble 技術分享 場景 res 路徑 磁盤 情況下 最近有臺服務器的MySQL經常crash,為了進一步定位問題,開啟了mysql core file功能,開啟步驟如下,供參考 【開啟步驟】 1、 my.cnf文件中增加2個配置選項 [my