Skip to content

Commit e514c2c

Browse files
Edmund Hsubulislaw
authored andcommitted
Fix us_ticker.c to support "USTICKER"
- Disable microsecond ticker interrupt on reinitialization - Skip us_ticker_set_interrupt() if timestamp is already past - Eliminate tmr2Config since tmrConfig is adequate for all timer config
1 parent 774de11 commit e514c2c

File tree

2 files changed

+44
-38
lines changed
  • targets/TARGET_Analog_Devices

2 files changed

+44
-38
lines changed

targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/us_ticker.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void us_ticker_irq_handler(void);
5656

5757
static int us_ticker_inited = 0;
5858

59-
static ADI_TMR_CONFIG tmrConfig, tmr2Config;
59+
static ADI_TMR_CONFIG tmrConfig;
6060

6161
static volatile uint32_t Upper_count = 0, largecnt = 0;
6262

@@ -201,14 +201,14 @@ static void event_timer()
201201
cnt = 65536u - cnt;
202202
}
203203

204-
tmr2Config.nLoad = cnt;
205-
tmr2Config.nAsyncLoad = cnt;
206-
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, &tmr2Config);
204+
tmrConfig.nLoad = cnt;
205+
tmrConfig.nAsyncLoad = cnt;
206+
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, &tmrConfig);
207207
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, true);
208208
} else {
209-
tmr2Config.nLoad = 65535u;
210-
tmr2Config.nAsyncLoad = 65535u;
211-
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, &tmr2Config);
209+
tmrConfig.nLoad = 65535u;
210+
tmrConfig.nAsyncLoad = 65535u;
211+
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, &tmrConfig);
212212
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, true);
213213
}
214214
}
@@ -249,6 +249,8 @@ static void GP2CallbackFunction(void *pCBParam, uint32_t Event, void * pArg)
249249
void us_ticker_init(void)
250250
{
251251
if (us_ticker_inited) {
252+
// Disable ticker interrupt on reinitialization
253+
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, false);
252254
return;
253255
}
254256

@@ -283,15 +285,15 @@ void us_ticker_init(void)
283285
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP1, &tmrConfig);
284286

285287
/* Configure GP2 for doing event counts */
286-
tmr2Config.bCountingUp = true;
287-
tmr2Config.bPeriodic = true;
288-
tmr2Config.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
289-
tmr2Config.eClockSource = ADI_TMR_CLOCK_PCLK; // TMR source is PCLK (most examples use HFOSC)
290-
tmr2Config.nLoad = 0;
291-
tmr2Config.nAsyncLoad = 0;
292-
tmr2Config.bReloading = false;
293-
tmr2Config.bSyncBypass = true; // Allow x1 prescale
294-
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, &tmr2Config);
288+
tmrConfig.bCountingUp = true;
289+
tmrConfig.bPeriodic = true;
290+
tmrConfig.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
291+
tmrConfig.eClockSource = ADI_TMR_CLOCK_PCLK; // TMR source is PCLK (most examples use HFOSC)
292+
tmrConfig.nLoad = 0;
293+
tmrConfig.nAsyncLoad = 0;
294+
tmrConfig.bReloading = false;
295+
tmrConfig.bSyncBypass = true; // Allow x1 prescale
296+
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, &tmrConfig);
295297

296298

297299
/*------------------------- GP TIMER ENABLE ------------------------------*/
@@ -328,14 +330,15 @@ void us_ticker_clear_interrupt(void)
328330

329331
void us_ticker_set_interrupt(timestamp_t timestamp)
330332
{
331-
333+
// if timestamp is already past, do not set interrupt
334+
if ((timestamp + 10) <= us_ticker_read()) return;
332335
/* timestamp is when interrupt should fire.
333336
*
334337
* This MUST not be called if another timer event is currently enabled.
335338
*
336339
*/
337340
calc_event_counts(timestamp); // use timestamp to calculate largecnt to control number of timer interrupts
338-
tmr2Config.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
341+
tmrConfig.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
339342
event_timer(); // uses largecnt to initiate timer interrupts
340343
}
341344

@@ -348,7 +351,7 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
348351
void us_ticker_fire_interrupt(void)
349352
{
350353
largecnt = 1; // set a minimal interval so interrupt fire immediately
351-
tmr2Config.ePrescaler = ADI_TMR_PRESCALER_1; // TMR2 at 26MHz/1
354+
tmrConfig.ePrescaler = ADI_TMR_PRESCALER_1; // TMR2 at 26MHz/1
352355
event_timer(); // enable the timer and interrupt
353356
}
354357

targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void us_ticker_irq_handler(void);
5656

5757
static int us_ticker_inited = 0;
5858

59-
static ADI_TMR_CONFIG tmrConfig, tmr2Config;
59+
static ADI_TMR_CONFIG tmrConfig;
6060

6161
static volatile uint32_t Upper_count = 0, largecnt = 0;
6262

@@ -200,14 +200,14 @@ static void event_timer()
200200
} else
201201
cnt = 65536u - cnt;
202202

203-
tmr2Config.nLoad = cnt;
204-
tmr2Config.nAsyncLoad = cnt;
205-
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmr2Config);
203+
tmrConfig.nLoad = cnt;
204+
tmrConfig.nAsyncLoad = cnt;
205+
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmrConfig);
206206
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, true);
207207
} else {
208-
tmr2Config.nLoad = 65535u;
209-
tmr2Config.nAsyncLoad = 65535u;
210-
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmr2Config);
208+
tmrConfig.nLoad = 65535u;
209+
tmrConfig.nAsyncLoad = 65535u;
210+
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmrConfig);
211211
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, true);
212212
}
213213
}
@@ -247,6 +247,8 @@ static void GP2CallbackFunction(void *pCBParam, uint32_t Event, void * pArg)
247247
void us_ticker_init(void)
248248
{
249249
if (us_ticker_inited) {
250+
// Disable ticker interrupt on reinitialization
251+
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, false);
250252
return;
251253
}
252254

@@ -281,15 +283,15 @@ void us_ticker_init(void)
281283
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP1, tmrConfig);
282284

283285
/* Configure GP2 for doing event counts */
284-
tmr2Config.bCountingUp = true;
285-
tmr2Config.bPeriodic = true;
286-
tmr2Config.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
287-
tmr2Config.eClockSource = ADI_TMR_CLOCK_PCLK; // TMR source is PCLK (most examples use HFOSC)
288-
tmr2Config.nLoad = 0;
289-
tmr2Config.nAsyncLoad = 0;
290-
tmr2Config.bReloading = false;
291-
tmr2Config.bSyncBypass = true; // Allow x1 prescale
292-
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmr2Config);
286+
tmrConfig.bCountingUp = true;
287+
tmrConfig.bPeriodic = true;
288+
tmrConfig.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
289+
tmrConfig.eClockSource = ADI_TMR_CLOCK_PCLK; // TMR source is PCLK (most examples use HFOSC)
290+
tmrConfig.nLoad = 0;
291+
tmrConfig.nAsyncLoad = 0;
292+
tmrConfig.bReloading = false;
293+
tmrConfig.bSyncBypass = true; // Allow x1 prescale
294+
adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmrConfig);
293295

294296

295297
/*------------------------- GP TIMER ENABLE ------------------------------*/
@@ -326,14 +328,15 @@ void us_ticker_clear_interrupt(void)
326328

327329
void us_ticker_set_interrupt(timestamp_t timestamp)
328330
{
329-
331+
// if timestamp is already past, do not set interrupt
332+
if ((timestamp + 10) <= us_ticker_read()) return;
330333
/* timestamp is when interrupt should fire.
331334
*
332335
* This MUST not be called if another timer event is currently enabled.
333336
*
334337
*/
335338
calc_event_counts(timestamp); // use timestamp to calculate largecnt to control number of timer interrupts
336-
tmr2Config.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
339+
tmrConfig.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256
337340
event_timer(); // uses largecnt to initiate timer interrupts
338341
}
339342

@@ -346,7 +349,7 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
346349
void us_ticker_fire_interrupt(void)
347350
{
348351
largecnt = 1; // set a minimal interval so interrupt fire immediately
349-
tmr2Config.ePrescaler = ADI_TMR_PRESCALER_1; // TMR2 at 26MHz/1
352+
tmrConfig.ePrescaler = ADI_TMR_PRESCALER_1; // TMR2 at 26MHz/1
350353
event_timer(); // enable the timer and interrupt
351354
}
352355

0 commit comments

Comments
 (0)