83 lines
2.1 KiB
C++
Executable File
83 lines
2.1 KiB
C++
Executable File
// only support for max 26 second
|
|
#ifndef DCMI_DELAY_H
|
|
#define DCMI_DELAY_H
|
|
|
|
#ifdef __cplusplus
|
|
#include "stm32u5xx.h"
|
|
#include <cstdint>
|
|
|
|
#define DWT_CNT DWT->CYCCNT
|
|
#define DWT_CLEAN DWT->CYCCNT = 0
|
|
|
|
class Delay {
|
|
private:
|
|
// 4294967295/160000000 = 26.84s
|
|
uint32_t cnt_per_s = 0;
|
|
uint32_t cnt_per_ms = 0;
|
|
uint32_t cnt_per_us = 0;
|
|
uint32_t max_time_ms = 0;
|
|
uint32_t max_time_us = 0;
|
|
uint32_t max_time_s = 0;
|
|
uint32_t max_time_tick = UINT32_MAX;
|
|
|
|
public:
|
|
Delay() = default;
|
|
|
|
void setup();
|
|
|
|
void delay_us(uint32_t us, bool allow_irq = true) const;
|
|
|
|
void delay_ms(uint32_t ms, bool allow_irq = true) const;
|
|
|
|
void delay_s(uint32_t s, bool allow_irq = true) const;
|
|
|
|
void delay_tick(uint32_t tick, bool allow_irq = true);
|
|
};
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "stdint.h"
|
|
#include <stdbool.h>
|
|
|
|
void delay_init();
|
|
|
|
void delay_tick(uint32_t tick, bool allow_irq);
|
|
|
|
void delay_us(uint32_t microsecond, bool allow_irq);
|
|
|
|
void delay_ms(uint32_t millisecond, bool allow_irq);
|
|
|
|
void delay_s(uint32_t second, bool allow_irq);
|
|
|
|
void timeout_setup(uint32_t milliseconds);
|
|
|
|
bool timeout_test();
|
|
|
|
bool timeout_ok();
|
|
|
|
bool timeout_ms(uint32_t start, uint32_t timeout);
|
|
|
|
uint32_t dwt_get_current_cycle();
|
|
|
|
bool timeout_us(uint32_t start, uint32_t timeout);
|
|
|
|
extern uint32_t cnt_per_ms;
|
|
|
|
#define wait_for_true(value, timeout_ms) \
|
|
{ \
|
|
uint32_t _start = DWT->CYCCNT; \
|
|
uint32_t _timeout = (uint32_t)(cnt_per_ms * (double)(timeout_ms)); \
|
|
while ((value) == 0) { \
|
|
if ((timeout_ms) != 0 && _timeout < (DWT->CYCCNT - _start)) return HAL_TIMEOUT; \
|
|
} \
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // DCMI_DELAY_H
|