2020-08-25 01:06:50 +08:00
|
|
|
#include "delay.hpp"
|
|
|
|
|
|
|
|
#include "stm.hpp"
|
|
|
|
|
2022-06-20 07:02:09 +08:00
|
|
|
static volatile uint64_t t_us = 0;
|
|
|
|
|
|
|
|
void Delay::Init() {
|
|
|
|
TIM1->CNT = 0;
|
|
|
|
|
|
|
|
// enable update interrupt
|
|
|
|
TIM1->DIER |= TIM_DIER_UIE;
|
2022-06-23 05:00:09 +08:00
|
|
|
HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 6, 0);
|
2022-06-20 07:02:09 +08:00
|
|
|
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
|
|
|
|
|
|
|
|
TIM1->CR1 |= TIM_CR1_CEN;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t Delay::get_us() {
|
|
|
|
HAL_NVIC_DisableIRQ(TIM1_UP_TIM16_IRQn);
|
|
|
|
uint32_t buf = TIM1->CNT;
|
|
|
|
uint16_t timer_value = buf & 0xFFFF;
|
|
|
|
uint64_t ret;
|
|
|
|
if(buf & 0x80000000) {
|
|
|
|
// UIF bit set, timer overflow not handled yet
|
|
|
|
ret = t_us + UINT16_MAX + timer_value;
|
|
|
|
} else {
|
|
|
|
ret = t_us + timer_value;
|
|
|
|
}
|
|
|
|
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2020-08-25 01:06:50 +08:00
|
|
|
void Delay::ms(uint32_t t) {
|
|
|
|
while(t--) {
|
|
|
|
us(1000);
|
|
|
|
}
|
|
|
|
}
|
2022-06-26 18:46:11 +08:00
|
|
|
void Delay::us(uint16_t t) {
|
|
|
|
uint16_t start = TIM1->CNT;
|
2022-06-23 05:00:09 +08:00
|
|
|
while(TIM1->CNT - start < t);
|
2022-06-20 07:02:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
|
|
void TIM1_UP_TIM16_IRQHandler() {
|
|
|
|
// clear bit
|
|
|
|
TIM1->SR &= ~TIM_SR_UIF;
|
|
|
|
// update count
|
|
|
|
t_us += UINT16_MAX;
|
|
|
|
}
|
|
|
|
|
2020-08-25 01:06:50 +08:00
|
|
|
}
|