85 lines
2.2 KiB
Markdown
85 lines
2.2 KiB
Markdown
|
|
# 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
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
/* 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:
|
|||
|
|
```c
|
|||
|
|
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:
|
|||
|
|
```c
|
|||
|
|
// 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
|
|||
|
|
- **2018-01-06**
|
|||
|
|
This lib emerged.
|
|||
|
|
|
|||
|
|
- **2019-02-19**
|
|||
|
|
Overflow check added.
|
|||
|
|
|
|||
|
|
- **2019-03-26**
|
|||
|
|
Typo in definition fixed. Got back to short and simpler function.
|
|||
|
|
|
|||
|
|
- **2023-11-21**
|
|||
|
|
Now it is MIT License. Added warning for Cortex-M0/0+/1 and notes regarding other Cortex-M cores.
|