| /* |
| * FreeRTOS Kernel <DEVELOPMENT BRANCH> |
| * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| * |
| * SPDX-License-Identifier: MIT |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy of |
| * this software and associated documentation files (the "Software"), to deal in |
| * the Software without restriction, including without limitation the rights to |
| * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
| * the Software, and to permit persons to whom the Software is furnished to do so, |
| * subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in all |
| * copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
| * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
| * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| * |
| * https://www.FreeRTOS.org |
| * https://github.com/FreeRTOS |
| * |
| */ |
| |
| /* |
| * Changes from V3.0.0 |
| + ISRcode is pulled inline and portTICKisr() is therefore |
| + deleted from this file. |
| + |
| + Prescaler logic for Timer1 added to allow for a wider |
| + range of TickRates. |
| + |
| + Changes from V3.0.1 |
| */ |
| |
| #include <FreeRTOS.h> |
| #include <task.h> |
| |
| /* IO port constants. */ |
| #define portBIT_SET ( 1 ) |
| #define portBIT_CLEAR ( 0 ) |
| |
| /* |
| * Hardware setup for the tick. |
| * We use a compare match on timer1. Depending on MPU-frequency |
| * and requested tickrate, a prescaled value with a matching |
| * prescaler are determined. |
| */ |
| #define portTIMER_COMPARE_BASE ( ( APROCFREQ / 4 ) / configTICK_RATE_HZ ) |
| |
| #if portTIMER_COMPARE_BASE < 0x10000 |
| #define portTIMER_COMPARE_VALUE ( portTIMER_COMPARE_BASE ) |
| #define portTIMER_COMPARE_PS1 ( portBIT_CLEAR ) |
| #define portTIMER_COMPARE_PS0 ( portBIT_CLEAR ) |
| #elif portTIMER_COMPARE_BASE < 0x20000 |
| #define portTIMER_COMPARE_VALUE ( portTIMER_COMPARE_BASE / 2 ) |
| #define portTIMER_COMPARE_PS1 ( portBIT_CLEAR ) |
| #define portTIMER_COMPARE_PS0 ( portBIT_SET ) |
| #elif portTIMER_COMPARE_BASE < 0x40000 |
| #define portTIMER_COMPARE_VALUE ( portTIMER_COMPARE_BASE / 4 ) |
| #define portTIMER_COMPARE_PS1 ( portBIT_SET ) |
| #define portTIMER_COMPARE_PS0 ( portBIT_CLEAR ) |
| #elif portTIMER_COMPARE_BASE < 0x80000 |
| #define portTIMER_COMPARE_VALUE ( portTIMER_COMPARE_BASE / 8 ) |
| #define portTIMER_COMPARE_PS1 ( portBIT_SET ) |
| #define portTIMER_COMPARE_PS0 ( portBIT_SET ) |
| #else /* if portTIMER_COMPARE_BASE < 0x10000 */ |
| #error "TickRate out of range" |
| #endif /* if portTIMER_COMPARE_BASE < 0x10000 */ |
| |
| /*-----------------------------------------------------------*/ |
| |
| /* |
| * Setup a timer for a regular tick. |
| */ |
| void portSetupTick( void ) |
| { |
| /* |
| * Interrupts are disabled when this function is called. |
| */ |
| |
| /* |
| * Setup CCP1 |
| * Provide the tick interrupt using a compare match on timer1. |
| */ |
| |
| /* |
| * Set the compare match value. |
| */ |
| CCPR1H = ( uint8_t ) ( ( portTIMER_COMPARE_VALUE >> 8 ) & 0xff ); |
| CCPR1L = ( uint8_t ) ( portTIMER_COMPARE_VALUE & 0xff ); |
| |
| /* |
| * Set Compare Special Event Trigger Mode |
| */ |
| bCCP1M3 = portBIT_SET; |
| bCCP1M2 = portBIT_CLEAR; |
| bCCP1M1 = portBIT_SET; |
| bCCP1M0 = portBIT_SET; |
| |
| /* |
| * Enable CCP1 interrupt |
| */ |
| bCCP1IE = portBIT_SET; |
| |
| /* |
| * We are only going to use the global interrupt bit, so disable |
| * interruptpriorities and enable peripheral interrupts. |
| */ |
| bIPEN = portBIT_CLEAR; |
| bPEIE = portBIT_SET; |
| |
| /* |
| * Set up timer1 |
| * It will produce the system tick. |
| */ |
| |
| /* |
| * Clear the time count |
| */ |
| TMR1H = ( uint8_t ) 0x00; |
| TMR1L = ( uint8_t ) 0x00; |
| |
| /* |
| * Setup the timer |
| */ |
| bRD16 = portBIT_SET; /* 16-bit */ |
| bT1CKPS1 = portTIMER_COMPARE_PS1; /* prescaler */ |
| bT1CKPS0 = portTIMER_COMPARE_PS0; /* prescaler */ |
| bT1OSCEN = portBIT_SET; /* Oscillator enable */ |
| bT1SYNC = portBIT_SET; /* No external clock sync */ |
| bTMR1CS = portBIT_CLEAR; /* Internal clock */ |
| |
| bTMR1ON = portBIT_SET; /* Start timer1 */ |
| } |