2023版 STM32实战4 滴答定时器精准延时

SysTick简介与特性


-1- SysTick属于系统时钟。

-2- SysTick定时器被捆绑在NVIC中。

-3- SysTick可以产生中断,且中断不可屏蔽。

 

SysTick的时钟源查看

 


通过时钟树可以看出滴答的时钟最大为72MHZ/8=9MHZ

 

 

 

代码编写(已经验证,可直接拷贝使用)


SysTick源文件

 

复制代码
#include "Systick.h"

static u8  fac_us=0;                                           
static u16 fac_ms=0;                            

void Sys_Tick_Init(void)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    fac_ms=SystemCoreClock/8000;
    fac_us=SystemCoreClock/8000000;
}


void Delay_Ms(u16 nms)
{
    u32 temp;
    //倒数值,fac_ms代表一毫秒所需节拍数,与形参乘法运行得到所需的全部节拍数
    SysTick->LOAD=(u32)nms*fac_ms;
    //清空计数器
    SysTick->VAL =0x00;        
    //对控制寄存器第0位写1代表始能
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
    //这句话的意思控制寄存器是使能的且时间还未到达,就会一直卡在此处
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));    
    //对控制寄存器第0位写1代表示除能
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;    
    //清空计数器
    SysTick->VAL =0x00;    
    
}

void Delay_Us(u32 nms)
{
    u32 temp;
    //倒数值,fac_ms代表一毫秒所需节拍数,与形参乘法运行得到所需的全部节拍数
    SysTick->LOAD=(u32)nms*fac_us;
    //清空计数器
    SysTick->VAL =0x00;        
    //对控制寄存器第0位写1代表始能
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
    //这句话的意思控制寄存器是使能的且时间还未到达,就会一直卡在此处
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));    
    //对控制寄存器第0位写1代表示除能
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;    
    //清空计数器
    SysTick->VAL =0x00;    
    
}
复制代码

 

主函数

复制代码
#include "stm32f10x.h"
#include "Systick.h"

void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Init(GPIOE, &GPIO_InitStructure);

}



int main(void)
{    
    Sys_Tick_Init();
    LED_Init();
    while(1)
    {
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);
        Delay_Ms(500);
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
        GPIO_SetBits(GPIOE,GPIO_Pin_5);    
        Delay_Ms(500);        
    }    
}
复制代码

工程获取

三连后私信获取

 

posted @   日落悬崖  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示