SysTick定時器應用之一 用於延時函式

2021-08-26 17:41:32 字數 1995 閱讀 5152

systick為簡單的向下計數的24位計時器,可以使用處理器時鐘或外部參考時鐘(通常是片上時鐘源)。當不使用os時,systick定時器可以用作簡單的定時器外設,用以產生週期性中斷、延時或者時間測量。

用於延時函式的話比較簡單,systick定時器操作存在4個暫存器

systick->ctrl

systick->load

systick->val

其中systick->calib  校準值暫存器,為軟體提供了校準資訊。cmsis1.2後就不用這個暫存器了。於是查了一下cmsis的版本號,位於core_cm4.h中。

因此主要就關注3個暫存器

systick->ctrl

systick->load

systick->val

首先看delay_init函式

void delay_init(u8 sysclk)

第乙個函式systick_clksourceconfig

void systick_clksourceconfig(uint32_t systick_clksource)

else

}

就是配置systick->ctrl暫存器

可見systick->ctrl暫存器第2位置0,即使用外部參考時鐘。

delay_init(168);  //初始化延時函式

則fac_us == 168 / 8== 21,即1us內要有21個節拍,

fac_ms ==168 / 8 * 1000 ==21000,即1ms內要有21000個節拍

再看delay_us函式

//延時nus

//nus為要延時的us數.

//注意:nus的值,不要大於798915us(最大值即2^24/fac_us@fac_us=21)

void delay_us(u32 nus)

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

systick->ctrl&=~systick_ctrl_enable_msk; //關閉計數器

systick->val =0x00; //清空計數器

}

delay_xms函式

//延時nms

//注意nms的範圍

//systick->load為24位暫存器,所以,最大延時為:

//nms<=0xffffff*8*1000/sysclk

//sysclk單位為hz,nms單位為ms

//對168m條件下,nms<=798ms

void delay_xms(u16 nms)

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

systick->ctrl&=~systick_ctrl_enable_msk; //關閉計數器

systick->val =0x00; //清空計數器

}

delay_ms函式

//延時nms 

//nms:0~65535

void delay_ms(u16 nms)

if(remain)delay_xms(remain);

}

還是比較簡單的(結合昨天看的位操作)。

這幾個函式也就構成了正點原子寫的delay.c的內容~再次感謝正點原子的**和書~

quartz應用之一 建立 關閉定時任務

專案需求 資料遷移程序開始執行後,啟動定時任務每隔30秒計算遷移進度,並將進度入庫,當遷移完成後,關閉任務。遷移時根據任務單來執行,任務單中由多種基本業務資料組成。實現思路 1.遷移開始前,啟動監視進度的執行緒,每30秒重新執行,如果資料遷移完畢,則呼叫關閉執行緒介面。2.基本業務資料遷移完成後,遷...

msp430微控制器應用之定時器 PWM 比較器

1。定時器使用查詢和中斷兩種方式。大多數邏輯晶元輸出0的能力大於輸出1的能力。1 查詢方式 tmsel決定看門狗的工作模式,置一,看門狗工作在定時模式。ssel選擇看門狗定時器的時鐘源。ssel置一。is0is1決定了看門狗定時器的輸出頻率。注意 使用查詢方式時候要清除中斷標誌 main while...

一 通用定時器的相關介紹

stm32的定時器是個強大的模組,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做pwm輸出或者輸入捕獲功能。時鐘源問題 名為timx的有八個,其中tim1和tim8掛在apb2匯流排上,而tim2 tim7則掛在 apb1匯流排上。其中tim1 tim8稱為高階控制定時器 adva...