keatis / dwt_delay

Microseconds delay lib for STM32 (or whatever ARM) based on DWT
MIT License
80 stars 28 forks source link

dwt_delay

Microseconds delay lib based on DWT for STM32 or whatever ARM supporting it. Just include dwt_delay.h in your project, call DWT_Init() and then use delays as needed.

Depending on MCU used, you may need to include another header file (with MCU peripherals defines) in dwt_delay.h. The stm32f1xx.h is included by default, allowing STM32F1xx to start out of the box. If you don't use STM32 MCU or CubeMX, read a section at the end.

Functions are named as DWT_* to be HAL-alike. Feel free to do whatever you like with this lib, change names, indents, coding style, use it in LHC firmware.

Example

/* main.c */

#include "dwt_delay.h"

void main (void)
{
    // Init section of your code
    DWT_Init();

    while(1) {
        // Delay for 42us
        DWT_Delay(42);
    }

}

Notes on Cortex-M0/0+/1

Unfortunately, these are not supported, since cores have no access to DWT. CMSIS library states:

Cortex-M0/0+/1 Core Debug Registers are only accessible over DAP and not via processor

You may want a delay function based on hardware timer instead.

What about Cortex-M35/55/85?

I don't have any of these to check, but in theory they are supported. Anyway you have to change CoreDebug to DCB, because CoreDebug is deprecated in these cores.

Hence, init sequence should be something like:

DCB->DEMCR |= ‎DCB_DEMCR_TRCENA_Msk;

I'm not with STM but need microsec delays

There's an option to try! Also suits those, who use STM32, but dont use HAL/LL libs.

Include a CMSIS header file according to your core in dwt_delay.c and change SystemCoreClock variable to whatever you probably have in the project representing clock frequency (in Hz).

Something like this:

// In dwt_delay.c

#include "dwt_delay.h"
#include "core_cm4.h"                   // CMSIS header

#define SystemCoreClock   NameOfTheGlobalVariableInYourProject_or_AnotherDefine
// or at least
#define SystemCoreClock   48000000UL    // Clock is 48Mhz
...

Changelog