25
25
* with interrupt fired counter reaches 0.
26
26
*
27
27
* So 2 Timers are used to construct mbed OS HAL ticker.
28
+ *
28
29
* TIMER1 is for counting, and returns inverted binary when read from it
29
- * TIMER2 is for generate interrupts
30
+ * TIMER1 will be kept in free-running mode (default, and not generate interrupts)
31
+ *
32
+ * TIMER2 is for generating interrupts
33
+ * So TIMER2 is set to periodic mode, which start decrement counting form LOADVALUE generates interrupts at 0
34
+ * and TIMER2 also set into one-shot mode, which counter halts when is reaches 0
30
35
*/
36
+
31
37
static int us_ticker_inited = 0 ;
32
38
33
39
void us_ticker_init (void )
@@ -50,11 +56,9 @@ void us_ticker_init(void)
50
56
US_TICKER_TIMER2 -> TimerControl |= 0x1 << CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos ; // set TIMER2 with 4 stages prescale
51
57
52
58
US_TICKER_TIMER2 -> TimerControl |= CMSDK_DUALTIMER2_CTRL_MODE_Msk ; // set TIMER2 periodic mode
53
-
54
59
US_TICKER_TIMER2 -> TimerControl |= CMSDK_DUALTIMER2_CTRL_ONESHOOT_Msk ; // set TIMER2 one-shot mode
55
60
56
61
US_TICKER_TIMER1 -> TimerControl |= CMSDK_DUALTIMER1_CTRL_EN_Msk ; // enable TIMER1 counter
57
- US_TICKER_TIMER2 -> TimerControl |= CMSDK_DUALTIMER2_CTRL_EN_Msk ; // enable TIMER2 counter
58
62
59
63
NVIC_SetVector (US_TICKER_TIMER_IRQn , (uint32_t )us_ticker_irq_handler );
60
64
us_ticker_inited = 1 ;
@@ -76,7 +80,7 @@ uint32_t us_ticker_read()
76
80
void us_ticker_set_interrupt (timestamp_t timestamp )
77
81
{
78
82
uint32_t delta = timestamp - us_ticker_read ();
79
- US_TICKER_TIMER2 -> TimerControl &= ~CMSDK_DUALTIMER2_CTRL_EN_Msk ; // disable TIMER2
83
+ US_TICKER_TIMER2 -> TimerControl &= ~CMSDK_DUALTIMER2_CTRL_EN_Msk ; // disable TIMER2
80
84
US_TICKER_TIMER2 -> TimerLoad = delta ; // Set TIMER2 load value
81
85
US_TICKER_TIMER2 -> TimerControl |= CMSDK_DUALTIMER2_CTRL_INTEN_Msk ; // enable TIMER2 interrupt
82
86
US_TICKER_TIMER2 -> TimerControl |= CMSDK_DUALTIMER2_CTRL_EN_Msk ; // enable TIMER2 counter
@@ -93,6 +97,7 @@ void us_ticker_fire_interrupt(void)
93
97
void us_ticker_disable_interrupt (void )
94
98
{
95
99
US_TICKER_TIMER2 -> TimerControl &= ~CMSDK_DUALTIMER2_CTRL_INTEN_Msk ;
100
+ US_TICKER_TIMER2 -> TimerControl &= ~CMSDK_DUALTIMER2_CTRL_EN_Msk ; // disable TIMER2
96
101
NVIC_DisableIRQ (US_TICKER_TIMER_IRQn );
97
102
}
98
103
@@ -104,7 +109,7 @@ void us_ticker_clear_interrupt(void)
104
109
const ticker_info_t * us_ticker_get_info (void )
105
110
{
106
111
static const ticker_info_t info = {
107
- 1562500 , // 4 stages prescale from 25MHz (dived by 16)
112
+ 1562500 , // 4 stages prescaled from 25MHz (dived by 16)
108
113
32 // 32 bit counter
109
114
};
110
115
return & info ;
0 commit comments