BLE5.2 1.0
开发文档说明
xc_drv_timer.c
浏览该文件的文档.
1
25/*-----------------------------------------------------------------------------------
26 INCLUDE HEADE FILES
27 ------------------------------------------------------------------------------------*/
28#include "xc_drv_timer.h"
29
30/*------------------------------------------------------------------------------------
31 Local Variables
32 -------------------------------------------------------------------------------------*/
33
34/*------------------------------------------------------------------------------------
35 Func Prototype
36 -------------------------------------------------------------------------------------*/
39
40/*------------------------------------------------------------------------------------
41 Functions
42 -------------------------------------------------------------------------------------*/
43void xc_timer_init(uint8_t reg_idx, Timer_InitCfg_t *init_cfg)
44{
45 if (TIMER0_IDX == reg_idx) {
46 cpr_ctlapbclken_grctl__timer_pclk_en__setf(ENABLE);
47 cpr_timer0_clk_ctl__timer_clksel__setf(
48 (uint8_t)init_cfg->timer_src_clk);
49 cpr_timer0_clk_ctl__timer_clk0_div__setf(
50 (uint8_t)init_cfg->timer_div_clk);
51 cpr_timer0_clk_ctl__timer_clk1_div__setf(
52 (uint8_t)init_cfg->timer_div_clk);
53 } else if (TIMER1_IDX == reg_idx) {
54 cpr_ctlapbclken_grctl__timer_pclk_en__setf(ENABLE);
55 cpr_timer1_clk_ctl__timer_clksel__setf(
56 (uint8_t)init_cfg->timer_src_clk);
57 cpr_timer1_clk_ctl__timer_clk0_div__setf(
58 (uint8_t)init_cfg->timer_div_clk);
59 cpr_timer1_clk_ctl__timer_clk1_div__setf(
60 (uint8_t)init_cfg->timer_div_clk);
61 } else if (TIMER2_IDX == reg_idx) {
62 cpr_ctlapbclken_grctl__timer_pclk_en__setf(ENABLE);
63 cpr_timer2_clk_ctl__timer_clksel__setf(
64 (uint8_t)init_cfg->timer_src_clk);
65 cpr_timer2_clk_ctl__timer_clk0_div__setf(
66 (uint8_t)init_cfg->timer_div_clk);
67 cpr_timer2_clk_ctl__timer_clk1_div__setf(
68 (uint8_t)init_cfg->timer_div_clk);
69 } else if (TIMER3_IDX == reg_idx) {
70 cpr_ctlapbclken_grctl__timer_pclk_en__setf(ENABLE);
71 cpr_timer3_clk_ctl__timer_clksel__setf(
72 (uint8_t)init_cfg->timer_src_clk);
73 cpr_timer3_clk_ctl__timer_clk0_div__setf(
74 (uint8_t)init_cfg->timer_div_clk);
75 cpr_timer3_clk_ctl__timer_clk1_div__setf(
76 (uint8_t)init_cfg->timer_div_clk);
77 }
78 cpr_lp_ctl__timer_sysclk_sel__setf(ENABLE);
79
80 timer_tcr__tes__setf(reg_idx, TIMER_TCR_TES_DISABLE);
81 timer_tcr__tms__setf(reg_idx, (uint8_t)init_cfg->timer_mode);
82}
83
84static uint32_t xc_timer_us_to_ticks(uint8_t reg_idx, uint32_t us)
85{
86 uint32_t ticks;
87 uint8_t src_clk;
88
89 if (TIMER0_IDX == reg_idx) {
90 src_clk = cpr_timer0_clk_ctl__timer_clksel__getf();
91
92 if (src_clk == TIMER_CLK_SRC_32M_DIV) {
93 ticks = TIMER_CLKSRC_32M_DIV_CAL(
94 us, cpr_timer0_clk_ctl__timer_clk0_div__getf());
95 } else if (src_clk == TIMER_CLK_SRC_32K_DIV) {
96 ticks = TIMER_CLKSRC_32K_DIV_CAL(
97 us, cpr_timer0_clk_ctl__timer_clk1_div__getf());
98 } else if (src_clk == TIMER_CLK_SRC_32K) {
99 ticks = TIMER_CLKSRC_32K_CAL(us);
100 }
101 } else if (TIMER1_IDX == reg_idx) {
102 src_clk = cpr_timer1_clk_ctl__timer_clksel__getf();
103
104 if (src_clk == TIMER_CLK_SRC_32M_DIV) {
105 ticks = TIMER_CLKSRC_32M_DIV_CAL(
106 us, cpr_timer1_clk_ctl__timer_clk0_div__getf());
107 } else if (src_clk == TIMER_CLK_SRC_32K_DIV) {
108 ticks = TIMER_CLKSRC_32K_DIV_CAL(
109 us, cpr_timer1_clk_ctl__timer_clk1_div__getf());
110 } else if (src_clk == TIMER_CLK_SRC_32K) {
111 ticks = TIMER_CLKSRC_32K_CAL(us);
112 }
113 } else if (TIMER2_IDX == reg_idx) {
114 src_clk = cpr_timer2_clk_ctl__timer_clksel__getf();
115
116 if (src_clk == TIMER_CLK_SRC_32M_DIV) {
117 ticks = TIMER_CLKSRC_32M_DIV_CAL(
118 us, cpr_timer2_clk_ctl__timer_clk0_div__getf());
119 } else if (src_clk == TIMER_CLK_SRC_32K_DIV) {
120 ticks = TIMER_CLKSRC_32K_DIV_CAL(
121 us, cpr_timer2_clk_ctl__timer_clk1_div__getf());
122 } else if (src_clk == TIMER_CLK_SRC_32K) {
123 ticks = TIMER_CLKSRC_32K_CAL(us);
124 }
125 } else if (TIMER3_IDX == reg_idx) {
126 src_clk = cpr_timer3_clk_ctl__timer_clksel__getf();
127
128 if (src_clk == TIMER_CLK_SRC_32M_DIV) {
129 ticks = TIMER_CLKSRC_32M_DIV_CAL(
130 us, cpr_timer3_clk_ctl__timer_clk0_div__getf());
131 } else if (src_clk == TIMER_CLK_SRC_32K_DIV) {
132 ticks = TIMER_CLKSRC_32K_DIV_CAL(
133 us, cpr_timer3_clk_ctl__timer_clk1_div__getf());
134 } else if (src_clk == TIMER_CLK_SRC_32K) {
135 ticks = TIMER_CLKSRC_32K_CAL(us);
136 }
137 }
138
139 if (ticks < TIMER_MIN_TLC_VAL)
140 ticks = TIMER_MIN_TLC_VAL;
141
142 return ticks;
143}
144
145void xc_timer_set_value(uint8_t reg_idx, uint32_t us)
146{
147 uint32_t ticks = xc_timer_us_to_ticks(reg_idx, us);
148
149 timer_tcr__tes__setf(reg_idx, TIMER_TCR_TES_DISABLE);
150
151 timer_tlc_set(reg_idx, ticks);
152}
153
154void xc_timer_start(uint8_t reg_idx)
155{
156 NVIC_EnableIRQ((IRQn_Type)(TIMER0_IRQn + reg_idx));
157 timer_tcr__tim__setf(reg_idx, TIMER_TCR_TIM_DISABLE);
158 timer_tcr__tes__setf(reg_idx, TIMER_TCR_TES_ENABLE);
159}
160
161void xc_timer_stop(uint8_t reg_idx)
162{
163 timer_tcr__tes__setf(reg_idx, TIMER_TCR_TES_DISABLE);
164}
165
167{
168 (void)timer_tic_get(TIMER0_IDX);
169 if (timer_n_callback[0] != NULL)
170 timer_n_callback[0](NULL);
171}
172
174{
175 (void)timer_tic_get(TIMER1_IDX);
176 if (timer_n_callback[1] != NULL)
177 timer_n_callback[1](NULL);
178}
179
181{
182 (void)timer_tic_get(TIMER2_IDX);
183 if (timer_n_callback[2] != NULL)
184 timer_n_callback[2](NULL);
185}
186
188{
189 (void)timer_tic_get(TIMER3_IDX);
190 if (timer_n_callback[3] != NULL)
191 timer_n_callback[3](NULL);
192}
193
194__WEAK void timer0_callback(void *context) {}
195
196__WEAK void timer1_callback(void *context) {}
197
198__WEAK void timer2_callback(void *context) {}
199
200__WEAK void timer3_callback(void *context) {}
Timer_ModeTypeDef timer_mode
TIMER_SrcClkTypeDef timer_src_clk
Timer_DivClkTypeDef timer_div_clk
void(* timer_handler_callback)(void *context)
Definition xc_drv_spi.h:144
void xc_timer_init(uint8_t reg_idx, Timer_InitCfg_t *init_cfg)
void xc_timer_start(uint8_t reg_idx)
void TIMER0_Handler(void)
void TIMER2_Handler(void)
__WEAK void timer0_callback(void *context)
void TIMER1_Handler(void)
void TIMER3_Handler(void)
void xc_timer_set_value(uint8_t reg_idx, uint32_t us)
__WEAK void timer3_callback(void *context)
__WEAK void timer1_callback(void *context)
void xc_timer_stop(uint8_t reg_idx)
static uint32_t xc_timer_us_to_ticks(uint8_t reg_idx, uint32_t us)
timer_handler_callback timer_n_callback[4]
__WEAK void timer2_callback(void *context)
The header of xc_drv_aotimer.c
@ TIMER_CLK_SRC_32K
@ TIMER_CLK_SRC_32M_DIV
@ TIMER_CLK_SRC_32K_DIV