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...