0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的精准延迟

汽车电子技术 来源:玩转单片机 作者:Julian 2023-02-10 14:45 次阅读

这里主要是使用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

    文章

    3148

    浏览量

    112060
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12952
  • STM32F103ZET6
    +关注

    关注

    9

    文章

    67

    浏览量

    20774
收藏 人收藏

    评论

    相关推荐

    请问STM32G071如何通过DWT实现us精准定时?

    STM32G071怎样通过DWT实现us精准定时?,各位大佬有实现的吗?
    发表于 03-20 06:59

    如何实现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单片机输出精准脉冲数,来控制步进电机——程序

    自己写了一个简单的程序来让stm32f103单片机输出精准的脉冲个数,分享给初学者们,希望有所帮助
    发表于 07-11 15:22

    stm32使用外部精准时钟

    使用外部精准时钟#include "rcc_driver.h"//1.硬件初始化:72MHzvoid rcc_init(void){//0.将RCC设置为缺省状态
    发表于 08-19 06:30

    请问STM32F3如何使用HRTIM与ADC实现精准BOOST转换?

    请问STM32F3如何使用HRTIM与ADC实现精准BOOST转换?
    发表于 11-03 06:09

    请问一下stm32的systick实现精准延时的方法是什么?

    请问一下stm32的systick实现精准延时的方法是什么?
    发表于 11-24 06:21

    怎样使用stm32外部时钟去实现滴答计时器精准延时呢

    怎样使用stm32外部时钟去实现滴答计时器精准延时呢?其代码该怎样去实现呢?
    发表于 11-24 07:52

    STM32精准延时是什么意思

    延时,就是停在那,啥都不干,发呆。精准延时,就是发呆多长时间,是精确的。比如,要求某个IO口维持低电平1毫秒后,再维持高电平3毫秒,就需要把IO口拉高,然后延时1毫秒,再拉低,再维持3毫秒。类似这种
    发表于 12-07 09:08

    最简单的延时到最精准延时函数的各种写法及原理

    对于STM32系列的延时函数有着不同的写法,本章将给大家带来最简单的延时到最精准延时函数的各种写法及原理。在STM32系列中要学会用好systick定时器,这很重要一.普通延时函数原理:用C中累加
    发表于 01-14 06:43

    怎样去解决STM32 PWM输出的延迟问题呢

    造成STM32 PWM输出延迟的原因是什么?怎样去解决STM32 PWM输出的延迟问题呢?
    发表于 02-18 06:26

    延迟线,延迟线是什么意思

    延迟线,延迟线是什么意思  延迟线  delay line  用于将电信号延迟一段时间的元件或器件称为延迟线。
    发表于 03-09 11:33 7869次阅读

    STM32F4延迟计时器的源代码程序详细资料免费下载

    本文档的主要内容详细介绍的是STM32F4延迟计时器的源代码程序详细资料免费下载。
    发表于 08-31 16:28 13次下载

    具突破性的 0.5ppm INL、1Msps、无延迟 SAR ADC实现了真正的 20 位精准

    具突破性的 0.5ppm INL、1Msps、无延迟 SAR ADC实现了真正的 20 位精准
    发表于 03-21 12:00 11次下载
    具突破性的 0.5ppm INL、1Msps、无<b class='flag-5'>延迟</b> SAR ADC实现了真正的 20 位<b class='flag-5'>精准</b>度