blob: 084bdb6ebdfe032ff96e9ffae7d54f163b2b0eb5 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*
2 * (C) Copyright 2016 ZXIC Inc.
3 *
4 */
5
6#include <common.h>
7#include "../../drivers/config.h"
8
9
10// ϵͳʱÖÓ
11typedef struct
12{
13 u32 ctrl; // ϵͳʱÖÓ¿ØÖÆ
14 u32 reload; // ÖØÔØÖµ
15 u32 count; // µ±Ç°Öµ
16 u32 calibration; // У׼ֵ
17
18} t_tick;
19
20
21volatile t_tick g_tick;
22
23
24// ʱÖÓ³õʼ»¯
25void timer_init(void)
26{
27 volatile t_tick *tick = (t_tick*)(&g_tick);
28 tick->ctrl = 0;
29 tick->count = 0;
30 tick->reload = (u32)-1;
31 tick->ctrl = 0x05;
32}
33
34// ×¢Òâ×î´ó¼ÆÊ± 24λ
35void usdelay(u32 us)
36{
37 int t0, t1, t2, t3;
38
39 volatile t_tick *tick = (t_tick*)(&g_tick);
40
41 t0 = tick->count;
42 t1 = us * (SYS_CPU_FREQ / 1000000);
43
44 if(t1 <= t0)
45 {
46 t2 = t0 - t1;
47 while((t3 = tick->count) > t2)
48 {
49 if(t3 > 0xFFFF00) break;
50 }
51 }
52 else
53 {
54 t2 = 0x00FFFFFF + t0 - t1;
55 while(1)
56 {
57 t1 = tick->count;
58 if((t1 >= t0) && (t1 <= t2)) break;
59 }
60 }
61}
62