1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2017-01-01     Urey      first version
9  */
10 #include <rthw.h>
11 #include <rtthread.h>
12 
13 #include "board.h"
14 #include "board_coretimer.h"
15 
16 #include <stdint.h>
17 
readreg32(volatile unsigned int * addr)18 static inline unsigned int readreg32(volatile unsigned int *addr)
19 {
20     return *(volatile unsigned int *)addr;
21 }
22 
writereg32(unsigned int b,volatile unsigned int * addr)23 static inline void writereg32(unsigned int b, volatile unsigned int *addr)
24 {
25     *(volatile unsigned int *)addr = b;
26 }
27 
CKTimerInit(uint32_t timer_id,uint32_t freq)28 void CKTimerInit(uint32_t timer_id, uint32_t freq)
29 {
30     uint32_t reg;
31 
32     writereg32(APB_DEFAULT_FREQ / freq, CORET_RVR);
33     writereg32(0, CORET_CVR);
34 
35     reg = readreg32(CORET_CSR);
36     reg |= CORETIM_TXCONTROL_ENABLE;
37     reg |= CORETIM_TXCONTROL_INTMASK;
38     writereg32(reg, CORET_CSR);
39 
40     return;
41 }
42 
CKTimerClear(uint32_t timer_id)43 void CKTimerClear(uint32_t timer_id)
44 {
45     uint32_t reg;
46 
47     reg = readreg32(CORET_CSR);
48     reg |= ~CORETIM_TXCONTROL_MODE;
49     writereg32(reg, CORET_CSR);
50 }
51 
CKTimer_CurrentValue(void)52 uint32_t CKTimer_CurrentValue(void)
53 {
54     return readreg32(CORET_CVR);
55 }
56 
SysTick_Handler(void)57 void __attribute__((isr)) SysTick_Handler(void)
58 {
59     CKTimerClear(0x1);
60     /* enter interrupt */
61     rt_interrupt_enter();
62 
63     rt_tick_increase();
64 
65     /* leave interrupt */
66     rt_interrupt_leave();
67 }
68