]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_R4F_RZ_T_GCC_IAR/src/Full_Demo/IntQueueTimer.c
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / CORTEX_R4F_RZ_T_GCC_IAR / src / Full_Demo / IntQueueTimer.c
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 /*\r
30  * This file contains the non-portable and therefore RZ/T specific parts of\r
31  * the IntQueue standard demo task - namely the configuration of the timers\r
32  * that generate the interrupts and the interrupt entry points.\r
33  */\r
34 \r
35 /* Scheduler includes. */\r
36 #include "FreeRTOS.h"\r
37 #include "task.h"\r
38 \r
39 /* Demo includes. */\r
40 #include "IntQueueTimer.h"\r
41 #include "IntQueue.h"\r
42 \r
43 /* Renesas includes. */\r
44 #include "r_cg_macrodriver.h"\r
45 #include "r_cg_cmt.h"\r
46 #include "r_reset.h"\r
47 \r
48 #define tmrCMT_1_CHANNEL_0_HZ   ( 4000UL )\r
49 #define tmrCMT_1_CHANNEL_1_HZ   ( 2011UL )\r
50 \r
51 /*\r
52  * Handlers for the two timers used.  See the documentation page\r
53  * for this port on TBD for more information on writing\r
54  * interrupt handlers.\r
55  */\r
56 void vCMT_1_Channel_0_ISR( void );\r
57 void vCMT_1_Channel_1_ISR( void );\r
58 \r
59 /*\r
60  * Entry point for the handlers.  These set the pxISRFunction variable to point\r
61  * to the C handler for each timer, then branch to the FreeRTOS IRQ handler.\r
62  */\r
63 #ifdef __GNUC__\r
64         static void vCMT_1_Channel_0_ISR_Entry( void ) __attribute__((naked));\r
65         static void vCMT_1_Channel_1_ISR_Entry( void ) __attribute__((naked));\r
66 #endif /* __GNUC__ */\r
67 #ifdef __ICCARM__\r
68         /* IAR requires the entry point to be in an assembly file.  The functions\r
69         are     implemented in $PROJ_DIR$/System/IAR/Interrupt_Entry_Stubs.asm. */\r
70         extern void vCMT_1_Channel_0_ISR_Entry( void );\r
71         extern void vCMT_1_Channel_1_ISR_Entry( void );\r
72 #endif /* __ICCARM__ */\r
73 /*-----------------------------------------------------------*/\r
74 \r
75 void vInitialiseTimerForIntQueueTest( void )\r
76 {\r
77 uint32_t ulCompareMatchValue;\r
78 const uint32_t ulPeripheralClockDivider = 6UL, ulCMTClockDivider = 8UL;\r
79 \r
80         /* Disable CMI2 and CMI3 interrupts. */\r
81         VIC.IEC0.LONG = ( 1UL << 23UL ) | ( 1UL << 24UL );\r
82 \r
83         /* Cancel CMT stop state in LPC. */\r
84         r_rst_write_enable();\r
85         MSTP( CMT1 ) = 0U;\r
86         r_rst_write_disable();\r
87 \r
88         /* Interrupt on compare match. */\r
89         CMT2.CMCR.BIT.CMIE = 1;\r
90         CMT3.CMCR.BIT.CMIE = 1;\r
91 \r
92         /* Calculate the compare match value. */\r
93         ulCompareMatchValue = configCPU_CLOCK_HZ / ulPeripheralClockDivider;\r
94         ulCompareMatchValue /= ulCMTClockDivider;\r
95         ulCompareMatchValue /= tmrCMT_1_CHANNEL_0_HZ;\r
96         ulCompareMatchValue -= 1UL;\r
97         CMT2.CMCOR = ( unsigned short ) ulCompareMatchValue;\r
98 \r
99         ulCompareMatchValue = configCPU_CLOCK_HZ / ulPeripheralClockDivider;\r
100         ulCompareMatchValue /= ulCMTClockDivider;\r
101         ulCompareMatchValue /= tmrCMT_1_CHANNEL_1_HZ;\r
102         ulCompareMatchValue -= 1UL;\r
103         CMT3.CMCOR = ( unsigned short ) ulCompareMatchValue;\r
104 \r
105         /* Divide the PCLK by 8. */\r
106         CMT2.CMCR.BIT.CKS = 0;\r
107         CMT3.CMCR.BIT.CKS = 0;\r
108 \r
109         /* Clear count to 0. */\r
110         CMT2.CMCNT = 0;\r
111         CMT3.CMCNT = 0;\r
112 \r
113         /* Set CMI2 and CMI3 edge detection type. */\r
114         VIC.PLS0.LONG |= ( 1UL << 23UL ) | ( 1UL << 24UL );\r
115 \r
116         /* Set CMI2 and CMI3 priority levels so they nest. */\r
117         VIC.PRL23.LONG = _CMT_PRIORITY_LEVEL2;\r
118         VIC.PRL24.LONG = _CMT_PRIORITY_LEVEL9;\r
119 \r
120         /* Set CMI2 and CMI3 interrupt address. */\r
121         VIC.VAD23.LONG = ( uint32_t ) vCMT_1_Channel_0_ISR_Entry;\r
122         VIC.VAD24.LONG = ( uint32_t ) vCMT_1_Channel_1_ISR_Entry;\r
123 \r
124     /* Enable CMI2 and CMI3 interrupts in ICU. */\r
125         VIC.IEN0.LONG |= ( 1UL << 23UL ) | ( 1UL << 24UL );\r
126 \r
127     /* Start CMT1 channel 0 and 1 count. */\r
128     CMT.CMSTR1.BIT.STR2 = 1U;\r
129         CMT.CMSTR1.BIT.STR3 = 1U;\r
130 }\r
131 /*-----------------------------------------------------------*/\r
132 \r
133 void vCMT_1_Channel_0_ISR( void )\r
134 {\r
135         /* Clear the interrupt. */\r
136         VIC.PIC0.LONG = ( 1UL << 23UL );\r
137 \r
138         /* Call the handler that is part of the common code - this is where the\r
139         non-portable code ends and the actual test is performed. */\r
140         portYIELD_FROM_ISR( xFirstTimerHandler() );\r
141 }\r
142 /*-----------------------------------------------------------*/\r
143 \r
144 void vCMT_1_Channel_1_ISR( void )\r
145 {\r
146         /* Clear the interrupt. */\r
147         VIC.PIC0.LONG = ( 1UL << 24UL );\r
148 \r
149         /* Call the handler that is part of the common code - this is where the\r
150         non-portable code ends and the actual test is performed. */\r
151         portYIELD_FROM_ISR( xSecondTimerHandler() );\r
152 }\r
153 /*-----------------------------------------------------------*/\r
154 \r
155 /*\r
156  * The RZ/T vectors directly to a peripheral specific interrupt handler, rather\r
157  * than using the Cortex-R IRQ vector.  Therefore each interrupt handler\r
158  * installed by the application must follow the examples below, which save a\r
159  * pointer to a standard C function in the pxISRFunction variable, before\r
160  * branching to the FreeRTOS IRQ handler.  The FreeRTOS IRQ handler then manages\r
161  * interrupt entry (including interrupt nesting), before calling the C function\r
162  * saved in the pxISRFunction variable.  NOTE:  The entry points are naked\r
163  * functions - do not add C code to these functions.\r
164  *\r
165  * See http://www.freertos.org/Renesas_RZ-T_Cortex-R4F-RTOS.html\r
166  */\r
167 #ifdef __GNUC__\r
168         /* The IAR equivalent is implemented in\r
169         $PROJ_DIR$/System/IAR/Interrupt_Entry_Stubs.asm */\r
170         static void vCMT_1_Channel_0_ISR_Entry( void )\r
171         {\r
172                 __asm volatile (\r
173                                                         "PUSH   {r0-r1}                                                         \t\n"\r
174                                                         "LDR    r0, =pxISRFunction                                      \t\n"\r
175                                                         "LDR    r1, =vCMT_1_Channel_0_ISR                       \t\n"\r
176                                                         "STR    r1, [r0]                                                        \t\n"\r
177                                                         "POP    {r0-r1}                                                         \t\n"\r
178                                                         "B              FreeRTOS_IRQ_Handler                                    "\r
179                                                 );\r
180         }\r
181 #endif /* __GNUC__ */\r
182 /*-----------------------------------------------------------*/\r
183 \r
184 #ifdef __GNUC__\r
185         /* The IAR equivalent is implemented in\r
186         $PROJ_DIR$/System/IAR/Interrupt_Entry_Stubs.asm */\r
187         static void vCMT_1_Channel_1_ISR_Entry( void )\r
188         {\r
189                 __asm volatile (\r
190                                                         "PUSH   {r0-r1}                                                         \t\n"\r
191                                                         "LDR    r0, =pxISRFunction                                      \t\n"\r
192                                                         "LDR    r1, =vCMT_1_Channel_1_ISR                       \t\n"\r
193                                                         "STR    r1, [r0]                                                        \t\n"\r
194                                                         "POP    {r0-r1}                                                         \t\n"\r
195                                                         "B              FreeRTOS_IRQ_Handler                                    "\r
196                                                 );\r
197         }\r
198 #endif /* __GNUC__ */\r
199 \r
200 \r
201 \r
202 \r
203 \r