aboutsummaryrefslogtreecommitdiff
path: root/src/core/delay.cpp
blob: f5e260c4e8ed5d2c8442ac74fb996a3b25118dd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * systick.cpp
 *
 *  Created on: 2011/08/11
 *      Author: atsu
 */

#include "delay.h"

volatile static unsigned long msTicks;                            /* counts 1ms timeTicks */
volatile USER_TIMER_FUNC userfunc;	//user function's pointer

/*------------------------------------------------------------------------------
  delays number of tick Systicks (happens every 1 ms)
 *------------------------------------------------------------------------------*/
void delay (unsigned long dlyTicks) {
  volatile unsigned long curTicks;

  curTicks = msTicks;
  while ((msTicks - curTicks) < dlyTicks);
}


unsigned long millis(void)
{
	return msTicks;
}

void delayMicroseconds (unsigned long us)
{
  volatile unsigned long usTicks;

  //LPC_TMR16B0->TC = 0;	//reset timer counter
  usTicks = LPC_TMR32B1->TC;				//usTicks = micros();
  while ((LPC_TMR32B1->TC - usTicks) < us);	//while ((micros() - usTicks) < us);

}

unsigned long micros(void)
{
	return LPC_TMR32B1->TC;
}

//for micros() and delayMicroseconds()
void setup_TIMER32_1(void)
{
	LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 10);	// Enable clock for CT32B1 module
	NVIC_DisableIRQ(TIMER_32_1_IRQn);
	LPC_TMR32B1->PR = 48;				//48MHz/48=1MHzに分周する
	LPC_TMR32B1->TCR = 1;						//タイマスタート
}

unsigned long attachMicroseconds(USER_TIMER_FUNC func,int us)
{
	//LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 10);	// Enable clock for CT32B1 module
	LPC_TMR32B1->TCR = 0;				//タイマストップ
	LPC_TMR32B1->TC = 0;

	if(us <= 1)return 0;

//	LPC_TMR32B1->PR = 48;				//48MHz/48=1MHzに分周する
	LPC_TMR32B1->MR2 = us - 1;			//us

	LPC_TMR32B1->MCR = (0x3 << 6); // clear at MR2 and Interrupt

	NVIC_EnableIRQ(TIMER_32_1_IRQn);
	NVIC_SetPriority(TIMER_32_1_IRQn,0);//割り込みレベル
	LPC_TMR32B1->TCR = 1;				//タイマスタート

	userfunc = func;

	return 0;
}

void detachMicroseconds(void)
{
	LPC_TMR32B1->MR2 = 0xffffffff;			//us
	NVIC_DisableIRQ(TIMER_32_1_IRQn);

}

/*----------------------------------------------------------------------------
  Timer32_0_Handler
 *----------------------------------------------------------------------------*/
void TIMER32_1_IRQHandler (void)
{
	if (LPC_TMR32B1->IR & (1 << 2)) // MR2 Interrupt
	{
		if(userfunc)userfunc();

		// Clear Flag
		LPC_TMR32B1->IR = (1 << 2);
	}
}

/*----------------------------------------------------------------------------
  SysTick_Handler
 *----------------------------------------------------------------------------*/
void SysTick_Handler(void) {
  msTicks++;                        /* increment counter necessary in Delay() */
}

void setup_systick (void) {

	//LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

	// Setup SysTick Timer for 1 msec interrupts
	// Configure System tick timer in 10msec period
	volatile unsigned long period = SystemCoreClock / 1000;     // Period for 1msec SYSTICK
	SysTick_Config(period);             // Configuration

#if 1
  if ( !(SysTick->CTRL & SysTick_CTRL_CLKSOURCE_Msk) )
  {
	/* When external reference clock is used(CLKSOURCE in
	Systick Control and register bit 2 is set to 0), the
	SYSTICKCLKDIV must be a non-zero value and 2.5 times
	faster than the reference clock.
	When core clock, or system AHB clock, is used(CLKSOURCE
	in Systick Control and register bit 2 is set to 1), the
	SYSTICKCLKDIV has no effect to the SYSTICK frequency. See
	more on Systick clock and status register in Cortex-M3
	technical Reference Manual. */
	LPC_SYSCON->SYSTICKCLKDIV = 0x08;
  }
#endif
}