I don't know
Fork of mbed-src by
Diff: targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c
- Revision:
- 597:47bdd20c4d41
- Parent:
- 576:99a3d3d9c43f
- Child:
- 619:034e698bc035
--- a/targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c Mon Jul 27 09:30:09 2015 +0100 +++ b/targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c Mon Jul 27 09:45:08 2015 +0100 @@ -33,9 +33,12 @@ #include "PeripheralNames.h" #include "system_W7500x.h" +#define TIMER_0 DUALTIMER0_0 +#define TIMER_1 PWM_CH1 +#define TIMER_IRQn DUALTIMER0_IRQn -static PWM_TimerModeInitTypeDef TimMasterHandle_CH3; -static PWM_TimerModeInitTypeDef TimMasterHandle_CH2; +static PWM_TimerModeInitTypeDef TimerInitType; +static DUALTIMER_InitTypDef TimerHandler; static int us_ticker_inited = 0; @@ -43,17 +46,12 @@ #ifdef __cplusplus extern "C"{ #endif -void PWM2_Handler(void) + +void DUALTIMER0_Handler(void) { - uint32_t IntFlag = 0; - - IntFlag = PWM_CHn_GetIntFlagStatus(PWM_CH2); - - /* If overflow interrupt is occurred */ - if( (IntFlag & PWM_CHn_IER_OI_Msk) != 0 ) + if(DUALTIMER_GetIntStatus(DUALTIMER0_0)) { - /* Clear overflow interrupt */ - PWM_CH2_ClearOverflowInt(); + DUALTIMER_IntClear(DUALTIMER0_0); us_ticker_irq_handler(); } } @@ -68,66 +66,69 @@ us_ticker_inited = 1; SystemCoreClockUpdate(); - TimMasterHandle_CH3.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; - TimMasterHandle_CH3.PWM_CHn_LR = 0xFFFFFFFF; - TimMasterHandle_CH3.PWM_CHn_PDMR = 1; + TimerInitType.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; + TimerInitType.PWM_CHn_LR = 0xFFFFFFFF; + TimerInitType.PWM_CHn_PDMR = 1; - PWM_TimerModeInit(PWM_CH3, &TimMasterHandle_CH3); - PWM_CHn_Start(PWM_CH3); + PWM_TimerModeInit(TIMER_1, &TimerInitType); + PWM_CHn_Start(TIMER_1); } uint32_t us_ticker_read() { if (!us_ticker_inited) us_ticker_init(); - - return (PWM_CH3->TCR); + return (TIMER_1->TCR); } void us_ticker_set_interrupt(timestamp_t timestamp) { int32_t dev = 0; + if (!us_ticker_inited) { us_ticker_init(); } - dev = (int32_t)(timestamp - (us_ticker_read() + 150)); + dev = (int32_t)(timestamp - us_ticker_read()); + dev = dev * ((GetSystemClock() / 1000000) / 16); if(dev <= 0) { us_ticker_irq_handler(); - return; + return; } - - PWM_CHn_Stop(PWM_CH2); - - SystemCoreClockUpdate(); - TimMasterHandle_CH2.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; - TimMasterHandle_CH2.PWM_CHn_LR = dev; + + DUALTIMER_ClockEnable(TIMER_0); + DUALTIMER_Stop(TIMER_0); + + TimerHandler.TimerControl_Mode = DUALTIMER_TimerControl_Periodic; + TimerHandler.TimerControl_OneShot = DUALTIMER_TimerControl_OneShot; + TimerHandler.TimerControl_Pre = DUALTIMER_TimerControl_Pre_16; + TimerHandler.TimerControl_Size = DUALTIMER_TimerControl_Size_32; + + TimerHandler.TimerLoad = (uint32_t)dev; + + DUALTIMER_Init(TIMER_0, &TimerHandler); + + DUALTIMER_IntConfig(TIMER_0, ENABLE); + + NVIC_EnableIRQ(TIMER_IRQn); + + DUALTIMER_Start(TIMER_0); + - TimMasterHandle_CH2.PWM_CHn_UDMR = 0; - TimMasterHandle_CH2.PWM_CHn_PDMR = 0; - - NVIC_EnableIRQ(PWM2_IRQn); - - PWM_CHn_IntConfig(PWM_CH2, PWM_CHn_IER_OIE, ENABLE); - PWM_IntConfig(PWM_CH2, ENABLE); - PWM_TimerModeInit(PWM_CH2, &TimMasterHandle_CH2); - - PWM_CHn_Start(PWM_CH2); } void us_ticker_disable_interrupt(void) { - NVIC_DisableIRQ(PWM2_IRQn); - - PWM_CHn_IntConfig(PWM_CH2, PWM_CHn_IER_OIE, DISABLE); - PWM_IntConfig(PWM_CH2, DISABLE); + NVIC_DisableIRQ(TIMER_IRQn); + + DUALTIMER_IntConfig(TIMER_0, DISABLE); } void us_ticker_clear_interrupt(void) { - PWM_CHn_ClearInt(PWM_CH2, PWM_CHn_IER_OIE); + DUALTIMER_IntClear(TIMER_0); }