]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/WizC/PIC18/Drivers/Tick/Tick.c
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Source / portable / WizC / PIC18 / Drivers / Tick / Tick.c
1 /*\r
2  * FreeRTOS Kernel V10.3.0\r
3  * Copyright (C) 2020 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.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 /* \r
29 Changes from V3.0.0\r
30         + ISRcode is pulled inline and portTICKisr() is therefore\r
31           deleted from this file.\r
32 \r
33         + Prescaler logic for Timer1 added to allow for a wider\r
34           range of TickRates.\r
35 \r
36 Changes from V3.0.1\r
37 */\r
38 \r
39 #include <FreeRTOS.h>\r
40 #include <task.h>\r
41 \r
42 /* IO port constants. */\r
43 #define portBIT_SET             (1)\r
44 #define portBIT_CLEAR   (0)\r
45 \r
46 /* \r
47  * Hardware setup for the tick.\r
48  * We use a compare match on timer1. Depending on MPU-frequency\r
49  * and requested tickrate, a prescaled value with a matching\r
50  * prescaler are determined.\r
51  */\r
52 #define portTIMER_COMPARE_BASE                  ((APROCFREQ/4)/configTICK_RATE_HZ)\r
53 \r
54 #if portTIMER_COMPARE_BASE   < 0x10000\r
55         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE)\r
56         #define portTIMER_COMPARE_PS1           (portBIT_CLEAR)\r
57         #define portTIMER_COMPARE_PS0           (portBIT_CLEAR)\r
58 #elif portTIMER_COMPARE_BASE < 0x20000\r
59         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE / 2)\r
60         #define portTIMER_COMPARE_PS1           (portBIT_CLEAR)\r
61         #define portTIMER_COMPARE_PS0           (portBIT_SET)\r
62 #elif portTIMER_COMPARE_BASE < 0x40000\r
63         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE / 4)\r
64         #define portTIMER_COMPARE_PS1           (portBIT_SET)\r
65         #define portTIMER_COMPARE_PS0           (portBIT_CLEAR)\r
66 #elif portTIMER_COMPARE_BASE < 0x80000\r
67         #define portTIMER_COMPARE_VALUE         (portTIMER_COMPARE_BASE / 8)\r
68         #define portTIMER_COMPARE_PS1           (portBIT_SET)\r
69         #define portTIMER_COMPARE_PS0           (portBIT_SET)\r
70 #else\r
71         #error "TickRate out of range"\r
72 #endif\r
73 \r
74 /*-----------------------------------------------------------*/\r
75 \r
76 /*\r
77  * Setup a timer for a regular tick.\r
78  */\r
79 void portSetupTick( void )\r
80 {\r
81         /*\r
82          * Interrupts are disabled when this function is called.\r
83          */\r
84 \r
85         /*\r
86          * Setup CCP1\r
87          * Provide the tick interrupt using a compare match on timer1.\r
88          */\r
89 \r
90         /*\r
91          * Set the compare match value.\r
92          */\r
93         CCPR1H = ( uint8_t ) ( ( portTIMER_COMPARE_VALUE >> 8 ) & 0xff );\r
94         CCPR1L = ( uint8_t )   ( portTIMER_COMPARE_VALUE & 0xff );\r
95 \r
96         /*\r
97          * Set Compare Special Event Trigger Mode\r
98          */\r
99         bCCP1M3         = portBIT_SET;\r
100         bCCP1M2         = portBIT_CLEAR;\r
101         bCCP1M1         = portBIT_SET;\r
102         bCCP1M0         = portBIT_SET;\r
103 \r
104         /*\r
105          * Enable CCP1 interrupt\r
106          */\r
107         bCCP1IE         = portBIT_SET;\r
108 \r
109         /*\r
110          * We are only going to use the global interrupt bit, so disable\r
111          * interruptpriorities and enable peripheral interrupts.\r
112          */\r
113         bIPEN           = portBIT_CLEAR;\r
114         bPEIE           = portBIT_SET;\r
115 \r
116         /*\r
117          * Set up timer1\r
118          * It will produce the system tick.\r
119          */\r
120 \r
121         /*\r
122          * Clear the time count\r
123          */\r
124         TMR1H = ( uint8_t ) 0x00;\r
125         TMR1L = ( uint8_t ) 0x00;\r
126 \r
127         /*\r
128          * Setup the timer\r
129          */\r
130         bRD16           = portBIT_SET;                          // 16-bit\r
131         bT1CKPS1        = portTIMER_COMPARE_PS1;        // prescaler\r
132         bT1CKPS0        = portTIMER_COMPARE_PS0;        // prescaler\r
133         bT1OSCEN        = portBIT_SET;                          // Oscillator enable\r
134         bT1SYNC         = portBIT_SET;                          // No external clock sync\r
135         bTMR1CS         = portBIT_CLEAR;                        // Internal clock\r
136         \r
137         bTMR1ON         = portBIT_SET;                          // Start timer1\r
138 }\r