這里主要是使用Systick 時(shí)鐘來(lái)實(shí)現(xiàn)精準(zhǔn)延遲,它本質(zhì)也是一個(gè)定時(shí)器,使用時(shí)只需復(fù)制粘貼使用,這里是使用72M的STM32F103ZET6,不同型號(hào)需要自行修改對(duì)應(yīng)參數(shù)。
#include "stm32f10x.h"
static uint8_t D_us=0; //微妙系數(shù)
static uint16_t D_ms=0; //毫秒系數(shù)
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; //關(guān)閉SysTick定時(shí)器
SysTick->LOAD = nus*D_us; //延時(shí)重裝載值
SysTick->VAL = 0x00; //清空計(jì)數(shù)器
SysTick->CTRL|= 0x01 ; //啟動(dòng)SysTick定時(shí)器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待延時(shí)結(jié)束
SysTick->CTRL = 0x00; //關(guān)閉SysTick定時(shí)器
SysTick->VAL = 0X00; //清空計(jì)數(shù)器
}
void Delay_ms(uint32_t nms)
{
uint32_t temp;
SysTick->CTRL = 0x00; //關(guān)閉SysTick定時(shí)器
SysTick->LOAD = nms*D_ms; //延時(shí)重裝載值
SysTick->VAL = 0x00; //清空計(jì)數(shù)器
SysTick->CTRL|= 0x01 ; //啟動(dòng)SysTick定時(shí)器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待延時(shí)結(jié)束
SysTick->CTRL = 0x00; //關(guān)閉SysTick定時(shí)器
SysTick->VAL = 0X00; //清空計(jì)數(shù)器
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//開(kāi)啟時(shí)鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //選擇你要設(shè)置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率
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個(gè)
上一篇STM32|外部中斷下一篇STM32|通用定時(shí)器
-
定時(shí)器
+關(guān)注
關(guān)注
23文章
3271瀏覽量
116472 -
Systick
+關(guān)注
關(guān)注
0文章
63瀏覽量
13409 -
STM32F103ZET6
+關(guān)注
關(guān)注
9文章
67瀏覽量
21503
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
請(qǐng)問(wèn)STM32G071如何通過(guò)DWT實(shí)現(xiàn)us精準(zhǔn)定時(shí)?
如何實(shí)現(xiàn)PTP協(xié)議的精準(zhǔn)同步時(shí)鐘?
請(qǐng)問(wèn)STM32 USB通信延遲有多大?
TMS570是否有延遲指令
用stm32單片機(jī)輸出精準(zhǔn)脈沖數(shù),來(lái)控制步進(jìn)電機(jī)——程序
stm32使用外部精準(zhǔn)時(shí)鐘
請(qǐng)問(wèn)STM32F3如何使用HRTIM與ADC實(shí)現(xiàn)精準(zhǔn)BOOST轉(zhuǎn)換?
請(qǐng)問(wèn)一下stm32的systick實(shí)現(xiàn)精準(zhǔn)延時(shí)的方法是什么?
怎樣使用stm32外部時(shí)鐘去實(shí)現(xiàn)滴答計(jì)時(shí)器精準(zhǔn)延時(shí)呢
STM32精準(zhǔn)延時(shí)是什么意思
最簡(jiǎn)單的延時(shí)到最精準(zhǔn)延時(shí)函數(shù)的各種寫(xiě)法及原理
STM32F4延遲計(jì)時(shí)器的源代碼程序詳細(xì)資料免費(fèi)下載
具突破性的 0.5ppm INL、1Msps、無(wú)延遲 SAR ADC實(shí)現(xiàn)了真正的 20 位精準(zhǔn)度

STM32 PWM輸出延遲問(wèn)題

評(píng)論