]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D4x_EK_IAR/AtmelFiles/libboard_sama5d4x-ek/source/timetick.c
Core kernel files:
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D4x_EK_IAR / AtmelFiles / libboard_sama5d4x-ek / source / timetick.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2011, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29  \r
30 /**\r
31  *  \file\r
32  *  Implement simple PIT usage as system tick.\r
33  */\r
34 \r
35 /*----------------------------------------------------------------------------\r
36  *         Headers\r
37  *----------------------------------------------------------------------------*/\r
38 \r
39 #include "board.h"\r
40 \r
41 /*----------------------------------------------------------------------------\r
42  *         Local variables\r
43  *----------------------------------------------------------------------------*/\r
44 \r
45 /** Tick Counter united by ms */\r
46 static volatile uint32_t _dwTickCount = 0 ;\r
47 \r
48 /*----------------------------------------------------------------------------\r
49  *         Exported Functions\r
50  *----------------------------------------------------------------------------*/\r
51 \r
52 /**\r
53  *  \brief Handler for Sytem Tick interrupt.\r
54  */\r
55 extern void TimeTick_Increment( uint32_t dwInc )\r
56 {\r
57     _dwTickCount += dwInc;\r
58 }\r
59 \r
60 /**\r
61  *  \brief Configures the PIT & reset tickCount.\r
62  *  Systick interrupt handler will generates 1ms interrupt and increase a\r
63  *  tickCount.\r
64  *  \note IRQ handler must be configured before invoking this function.\r
65  *  \note PIT is enabled automatically in this function.\r
66  *  \param new_mck  Current master clock.\r
67  */\r
68 extern uint32_t TimeTick_Configure( uint32_t new_mck )\r
69 {\r
70     _dwTickCount = 0 ;\r
71     PIT_Init( 1000, new_mck / 1000000 );\r
72     PIT_EnableIT();\r
73     PIT_Enable();\r
74     return 0;\r
75 }\r
76 \r
77 /**\r
78  * Get Delayed number of tick\r
79  * \param startTick Start tick point.\r
80  * \param endTick   End tick point.\r
81  */\r
82 extern uint32_t GetDelayInTicks(uint32_t startTick, uint32_t endTick)\r
83 {\r
84     if (endTick >= startTick) return (endTick - startTick);\r
85     return (endTick + (0xFFFFFFFF - startTick) + 1);\r
86 }\r
87 \r
88 /**\r
89  *  \brief Get current Tick Count, in ms.\r
90  */\r
91 extern uint32_t GetTickCount( void )\r
92 {\r
93     return _dwTickCount ;\r
94 }\r
95 \r
96 /**\r
97  *  \brief Sync Wait for several ms\r
98  */\r
99 extern void Wait( volatile uint32_t dwMs )\r
100 {\r
101     uint32_t dwStart ;\r
102     uint32_t dwCurrent ;\r
103 \r
104     dwStart = _dwTickCount ;\r
105     do\r
106     {\r
107         dwCurrent = _dwTickCount ;\r
108     } while ( dwCurrent - dwStart < dwMs ) ;\r
109 }\r
110 \r
111 /**\r
112  *  \brief Sync Sleep for several ms\r
113  */\r
114 extern void Sleep( volatile uint32_t dwMs )\r
115 {\r
116     uint32_t dwStart ;\r
117     uint32_t dwCurrent ;\r
118     __ASM("CPSIE   I");\r
119     dwStart = _dwTickCount ;\r
120 \r
121     do\r
122     {\r
123         dwCurrent = _dwTickCount ;\r
124 \r
125         if ( dwCurrent - dwStart > dwMs )\r
126         {\r
127             break ;\r
128         }\r
129         __ASM("WFI");\r
130     } while( 1 ) ;\r
131 }\r
132 \r