当前位置: 首页 > article >正文

STM32裸机系统采用滴答定时器延时

这里写自定义目录标题


delay.h文件

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

//#define configTICK_RATE_HZ 1000		//时钟节拍频率,这里设置为1000,周期就是1ms

//void SysTick_Init(void);
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);


#endif

delay.c文件

static u8  fac_us=0;                            //us延时倍乘数               
static u16 fac_ms=0;                            //ms延时倍乘数  
 
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8,即SYSTICK=SYSCLK/8
//SYSCLK:系统时钟
void delay_init()
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    //选择外部时钟  HCLK/8

    fac_us=SystemCoreClock/8000000;                          //SYSTICK时钟为9M(即8分频)时,fac_us=9,即SysTick倒数9个数,耗时1us
    fac_ms=(u16)fac_us*1000;                                 //非OS下,代表每个ms需要的systick时钟数   
}    

//查询SysTick->CTRL寄存器bit0是否为1,当为1时,说明倒计时时间到;
//整个延时方法中,不进入SysTick中断;
//延时nus
//nus为要延时的us数.                                               
void delay_us(u32 nus)
{        
    u32 temp;             
    SysTick->LOAD=nus*fac_us;                       //延时时间加载               
    SysTick->VAL=0x00;                              //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数      
 
    //do while 判断就是 systick 使能(bit0)位为 1 且(bit16)为1的时候等待结束
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));           //等待时间到达
 
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
    SysTick->VAL =0X00;                             //清空计数器     
}

//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{                     
    u32 temp;           
    SysTick->LOAD=(u32)nms*fac_ms;                //时间加载(SysTick->LOAD为24bit)
    SysTick->VAL =0x00;                            //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;    //开始倒数  
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;    //关闭计数器
    SysTick->VAL =0X00;                           //清空计数器              
}



http://www.kler.cn/a/447056.html

相关文章:

  • Windows中运行Linux(WSL)
  • MacOS安装MySQL
  • 【C++11】可变模板参数
  • uni-app商品搜索页面
  • C盘下的文件夹
  • Linux文件:动静态库制作 动态库链接原理解析
  • Ubuntu安装及删除httpd(Apache)
  • 初识面向对象晨考day09
  • ISP算法之黑电平BLC校正
  • 重拾设计模式--备忘录模式
  • 半连接转内连接 | OceanBase SQL 查询改写
  • Ps:屏幕模式
  • Python3.9的安装和配置
  • C# OpenCV机器视觉:尺寸测量
  • leecode474.一和零
  • 社会工程-交流模型
  • python如何获取excel单元格文字是否加粗
  • ParrotOS,一个与kali类似的渗透测试操作系统
  • 你的第一个博客-第一弹
  • 开源轮子 - Hutool
  • 解析大模型常用微调方法:P-Tuning、Prefix Tuning、Adapter、LoRA
  • 融合机器学习算法:用VotingClassifier实现分类多模型的投票集成
  • ResNext-50模型进行图像识别
  • 越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高
  • 如何在Pycharm中添加环境
  • (自用)配置文件优先级、SpringBoot原理、Maven私服