這里主要是使用Systick 時鐘來實現精準延遲,它本質也是一個定時器,使用時只需復制粘貼使用,這里是使用72M的STM32F103ZET6,不同型號需要自行修改對應參數。
#include "stm32f10x.h"
static uint8_t D_us=0; //微妙系數
static uint16_t D_ms=0; //毫秒系數
void Delay_Init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
D_us = SystemCoreClock/8000000;
D_ms = (uint16_t)D_us * 1000;
}
void Delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->CTRL = 0x00; //關閉SysTick定時器
SysTick->LOAD = nus*D_us; //延時重裝載值
SysTick->VAL = 0x00; //清空計數器
SysTick->CTRL|= 0x01 ; //啟動SysTick定時器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待延時結束
SysTick->CTRL = 0x00; //關閉SysTick定時器
SysTick->VAL = 0X00; //清空計數器
}
void Delay_ms(uint32_t nms)
{
uint32_t temp;
SysTick->CTRL = 0x00; //關閉SysTick定時器
SysTick->LOAD = nms*D_ms; //延時重裝載值
SysTick->VAL = 0x00; //清空計數器
SysTick->CTRL|= 0x01 ; //啟動SysTick定時器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待延時結束
SysTick->CTRL = 0x00; //關閉SysTick定時器
SysTick->VAL = 0X00; //清空計數器
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//開啟時鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //選擇你要設置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設置推挽輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設置傳輸速率
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOC,GPIO_Pin_0); //將LED端口拉高,熄滅所有LED
}
int main( void )
{
Delay_Init();
LED_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
Delay_ms(500);
}
}
--END--
收錄于合集 **#**STM32
14個
上一篇STM32|外部中斷下一篇STM32|通用定時器
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
定時器
+關注
關注
23文章
3246瀏覽量
114721 -
Systick
+關注
關注
0文章
62瀏覽量
13073 -
STM32F103ZET6
+關注
關注
9文章
67瀏覽量
21121
發布評論請先 登錄
相關推薦
如何實現PTP協議的精準同步時鐘?
尊敬的技術大牛們,你們好!
現有一項目需要用到貴公司的STM32F4系列產品,由于業務場景對時鐘同步精度要求很高。所以需尋求你們的技術支撐,提供關于STM32F4系列的PTP協議或IEEE1588協議的參考代碼!以便實現PTP的時間精準
發表于 03-26 07:57
請問STM32 USB通信延遲有多大?
STM32作為從機,接收來自PC的實時IO信號,大約每秒100次,那每次信號只有20ms的間隔我用串口做,主機發送到從機接收到,延遲很不穩定,大約從10ms-40ms,從機執行的IO信號的時候很不均勻。。
不知道USB通信能做到多低的延
發表于 04-18 08:26
TMS570是否有延遲指令
Hello Ken,
請問一下,我有一個指令需要延遲0.1s 才執行,但使用for 又無法精準的控制。
TMS570除了使用中斷以外,有更方便的延遲指令可以用嗎?
謝謝您
Shunfan
發表于 06-21 10:23
stm32使用外部精準時鐘
使用外部精準時鐘#include "rcc_driver.h"http://1.硬件初始化:72MHzvoid rcc_init(void){//0.將RCC設置為缺省狀態
發表于 08-19 06:30
STM32精準延時是什么意思
延時,就是停在那,啥都不干,發呆。精準延時,就是發呆多長時間,是精確的。比如,要求某個IO口維持低電平1毫秒后,再維持高電平3毫秒,就需要把IO口拉高,然后延時1毫秒,再拉低,再維持3毫秒。類似這種
發表于 12-07 09:08
最簡單的延時到最精準延時函數的各種寫法及原理
對于STM32系列的延時函數有著不同的寫法,本章將給大家帶來最簡單的延時到最精準延時函數的各種寫法及原理。在STM32系列中要學會用好systick定時器,這很重要一.普通延時函數原理:用C中累加
發表于 01-14 06:43
具突破性的 0.5ppm INL、1Msps、無延遲 SAR ADC實現了真正的 20 位精準度
具突破性的 0.5ppm INL、1Msps、無延遲 SAR ADC實現了真正的 20 位精準度
發表于 03-21 12:00
?11次下載
STM32 PWM輸出延遲問題
事件原因:PWM正常初始化,監聽串口數據,根據上位機通訊協議,更改PWM的頻率和占空比,達到控制外圍輸出效果。調試效果:PWM在更改后,大概延遲5-10s才能正常輸出波形。解決方法:在更改完PWM
發表于 12-24 18:57
?12次下載
評論