]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/libchip_samv7/source/timetick.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained_IAR_Keil / libchip_samv7 / 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 "chip.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 /**\r
54  *  \brief Handler for Sytem Tick interrupt.\r
55  *\r
56  *  Process System Tick Event\r
57  *  Increments the timestamp counter.\r
58  */\r
59 void SysTick_Handler( void )\r
60 {\r
61     _dwTickCount ++;  \r
62 }\r
63 \r
64 /**\r
65  *  \brief Handler for Sytem Tick interrupt.\r
66  */\r
67 extern void TimeTick_Increment( uint32_t dwInc )\r
68 {\r
69     _dwTickCount += dwInc;\r
70 }\r
71 \r
72 /**\r
73  *  \brief Configures the PIT & reset tickCount.\r
74  *  Systick interrupt handler will generates 1ms interrupt and increase a\r
75  *  tickCount.\r
76  *  \note IRQ handler must be configured before invoking this function.\r
77  *  \note PIT is enabled automatically in this function.\r
78  *  \param new_mck  Current master clock.\r
79  */\r
80 extern uint32_t TimeTick_Configure( uint32_t new_mck )\r
81 {\r
82     _dwTickCount = 0 ;\r
83     /* Configure systick for 1 ms. */\r
84     printf( "Configure system tick to get 1ms tick period.\n\r" ) ;\r
85     if ( SysTick_Config( new_mck ) )\r
86     {\r
87         TRACE_ERROR("Systick configuration error\n\r" ) ;\r
88         return 1;\r
89     }\r
90     return 0;\r
91 }\r
92 \r
93 /**\r
94  * Get Delayed number of tick\r
95  * \param startTick Start tick point.\r
96  * \param endTick   End tick point.\r
97  */\r
98 extern uint32_t GetDelayInTicks(uint32_t startTick, uint32_t endTick)\r
99 {\r
100     if (endTick >= startTick) return (endTick - startTick);\r
101     return (endTick + (0xFFFFFFFF - startTick) + 1);\r
102 }\r
103 \r
104 /**\r
105  *  \brief Get current Tick Count, in ms.\r
106  */\r
107 extern uint32_t GetTickCount( void )\r
108 {\r
109     return _dwTickCount ;\r
110 }\r
111 \r
112 /**\r
113  *  \brief Sync Wait for several ms\r
114  */\r
115 extern void Wait( volatile uint32_t dwMs )\r
116 {\r
117     uint32_t dwStart ;\r
118     uint32_t dwCurrent ;\r
119 \r
120     dwStart = _dwTickCount ;\r
121     do\r
122     {\r
123         dwCurrent = _dwTickCount ;\r
124     } while ( dwCurrent - dwStart < dwMs ) ;\r
125 }\r
126 \r
127 /**\r
128  *  \brief Sync Sleep for several ms\r
129  */\r
130 extern void Sleep( volatile uint32_t dwMs )\r
131 {\r
132     uint32_t dwStart ;\r
133     uint32_t dwCurrent ;\r
134     __ASM("CPSIE   I");\r
135     dwStart = _dwTickCount ;\r
136 \r
137     do\r
138     {\r
139         dwCurrent = _dwTickCount ;\r
140 \r
141         if ( dwCurrent - dwStart > dwMs )\r
142         {\r
143             break ;\r
144         }\r
145         __ASM("WFI");\r
146     } while( 1 ) ;\r
147 }\r
148 \r