stm32微秒延迟终于找到了解决方法使用定时器 cubeMX hal us

本文将花费你3分钟时间,如果你懒,请直接拉到代码处拷贝关键代码。

定时器配置cubeMX

在这里插入图片描述
在这里插入图片描述

定时器输入时钟

TIM14时钟挂载于AHB1,其实不用看那么多,直接看cube 软件timer clock ,84Mhz

定时器计数配置

在这里插入图片描述
在这里插入图片描述

定时器微秒实现原理

84Mhz时钟输入定时器,分频后1Mhz = 1us,也就是count CNT每加一次就是1us。

开始计数
到达CNT值
设置CNT为0
比较CNT值
停止计数

代码实现

__weak void HAL_Delay_us(uint32_t Delay_us)
{
    uint16_t wait = Delay_us;
    
    if (wait < UINT16_MAX)                       //设定定时器计数器阈值,也可注释掉
        wait++;
    
    __HAL_TIM_SET_COUNTER(&htim14,0);            //将CNT值设置为0

    HAL_TIM_Base_Start(&htim14);                 //启动定时器

    while(__HAL_TIM_GET_COUNTER(&htim14) < wait) //查询计数器的计数值判断
    {
    }

    HAL_TIM_Base_Stop(&htim14);//频繁开启时,可以注释掉这句
}

微秒实验结果

1us
1us
在这里插入图片描述
2us
在这里插入图片描述
50us
在这里插入图片描述
100us

注意

  • 计数模式选择向上模式,其他模式实现步骤和上文类似
  • 自动重载值建议调到最大
  • 更正计数值建议从1开始

DWT 实现方法

野火有对此方法的具体解释,如果不是M0的话可以使用。

#ifndef __DWT_H_
#define __DWT_H_
#include "stm32f4xx.h"

#define  DWT_CR      *(volatile uint32_t *)0xE0001000

#define  DWT_CYCCNT  *(volatile uint32_t *)0xE0001004

#define  DEM_CR      *(volatile uint32_t *)0xE000EDFC

#define  DEM_CR_TRCENA                   (1 << 24)

#define  DWT_CR_CYCCNTENA                (1 <<  0)

#define delayms(msec)         delayus(msec*1000)

void dwt_delay_init(uint32_t clk);
void delay_us(uint32_t usec);
void delay_ms(__IO uint32_t nTime);
#endif

#include "dwt.h"

static uint32_t cpuclkfeq;

void dwt_delay_init(uint32_t clk)
{
    cpuclkfeq = clk;
    DEM_CR         |=  DEM_CR_TRCENA;
    DWT_CYCCNT      = 0u;
    DWT_CR         |= DWT_CR_CYCCNTENA;
}

void delay_us(uint32_t usec)

{
    uint32_t startts, endts, ts;
	
    startts = DWT_CYCCNT;

    ts =  usec * (cpuclkfeq / (1000 * 1000));
    endts = startts + ts;
    if(endts > startts)
    {
        while(DWT_CYCCNT < endts);
    }
    else
    {
        while(DWT_CYCCNT > endts);
        while(DWT_CYCCNT < endts);
    }
}

void delay_ms(__IO uint32_t nTime)
{
    delay_us(1000 * nTime);
}

重在直接用

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值