|
|
@@ -2,11 +2,53 @@
|
|
|
#include "gd32f3x0.h"
|
|
|
|
|
|
extern uint32_t SystemCoreClock;
|
|
|
+static u8 delay_ticks_enable = 0;
|
|
|
void delay_us(uint32_t us){
|
|
|
+ if (delay_ticks_enable) {
|
|
|
+ task_udelay(us);
|
|
|
+ return;
|
|
|
+ }
|
|
|
uint32_t insr_num = (SystemCoreClock /1000000) * us * 4;// 1000000;
|
|
|
while(insr_num-->0); //have 4 instr
|
|
|
}
|
|
|
|
|
|
+void task_ticks_enable(void)
|
|
|
+{
|
|
|
+ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
|
|
+ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
|
|
|
+ delay_ticks_enable = 1;
|
|
|
+}
|
|
|
+
|
|
|
+u32 task_ticks_abs(void)
|
|
|
+{
|
|
|
+ return DWT->CYCCNT;
|
|
|
+}
|
|
|
+
|
|
|
+u32 task_ticks_rel(u32 start)
|
|
|
+{
|
|
|
+ u32 ticks = DWT->CYCCNT;
|
|
|
+
|
|
|
+ if (ticks >= start) {
|
|
|
+ return ticks - start;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0xFFFFFFFF - start + ticks + 1;
|
|
|
+}
|
|
|
+
|
|
|
+void task_ticks_delay(u32 ticks)
|
|
|
+{
|
|
|
+ u32 start;
|
|
|
+
|
|
|
+ start = task_ticks_abs();
|
|
|
+ while (task_ticks_rel(start) < ticks);
|
|
|
+}
|
|
|
+
|
|
|
+void task_udelay(u32 delay)
|
|
|
+{
|
|
|
+ task_ticks_delay(delay * (SystemCoreClock / 1000000));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
uint32_t get_sys_clock(void){
|
|
|
return SystemCoreClock;
|
|
|
}
|