這里主要是使用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);//開啟時(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文章
3237瀏覽量
114467 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13043 -
STM32F103ZET6
+關(guān)注
關(guān)注
9文章
67瀏覽量
21092
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論