90 lines
2.3 KiB
C
90 lines
2.3 KiB
C
// Copyright 2021 IOsetting <iosetting(at)outlook.com>
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "fw_sys.h"
|
|
|
|
/**
|
|
* An approximate estimate of instruction cycles in one second, may vary in
|
|
* different compilers even differnt versions, adjust it if you find the
|
|
* delay too slow or fast.
|
|
*/
|
|
#if defined (__SDCC_SYNTAX_FIX)
|
|
#define __CLK_REF 10000
|
|
#elif defined (SDCC) || defined (__SDCC)
|
|
#define __CLK_REF 9000
|
|
#elif defined __CX51__
|
|
#define __CLK_REF 10000
|
|
#endif
|
|
|
|
__CODE uint8_t clkdiv = ((__CONF_CLKDIV == 0)? 1 : __CONF_CLKDIV);
|
|
__CODE uint16_t ticks_ms = (__CONF_FOSC / ((__CONF_CLKDIV == 0)? 1 : __CONF_CLKDIV) / __CLK_REF);
|
|
__CODE uint8_t ticks_us = (__CONF_FOSC / ((__CONF_CLKDIV == 0)? 1 : __CONF_CLKDIV) / __CLK_REF / 1000);
|
|
|
|
|
|
/**
|
|
* Change system clock
|
|
* - For SDCC only.
|
|
* - For Keil C51, trim IRC in STC-ISP will be more accurate
|
|
* - Invoke this in the beginning of main()
|
|
*/
|
|
void SYS_SetClock(void)
|
|
{
|
|
#if defined (SDCC) || defined (__SDCC)
|
|
uint16_t i = 0; uint8_t j = 5;
|
|
P_SW2 = 0x80;
|
|
if (CLKDIV != (__CONF_CLKDIV))
|
|
{
|
|
CLKDIV = (__CONF_CLKDIV);
|
|
do { // Wait a while after clock changed, or it may block the main process
|
|
while (--i);
|
|
} while (--j);
|
|
}
|
|
P_SW2 = 0x00;
|
|
SYS_SetFOSC(__CONF_IRCBAND, __CONF_VRTRIM, __CONF_IRTRIM, __CONF_LIRTRIM);
|
|
while (--i); // Wait
|
|
#endif
|
|
}
|
|
|
|
void SYS_TrimClock(uint8_t vrtrim, uint8_t irtrim)
|
|
{
|
|
uint16_t i = 0;
|
|
SYS_SetFOSC(__CONF_IRCBAND, vrtrim, irtrim, __CONF_LIRTRIM);
|
|
while (--i); // Wait
|
|
}
|
|
|
|
void SYS_Delay(uint16_t t)
|
|
{
|
|
uint16_t i;
|
|
do
|
|
{
|
|
i = ticks_ms;
|
|
while (--i);
|
|
} while (--t);
|
|
}
|
|
|
|
void SYS_DelayUs(uint16_t t)
|
|
{
|
|
uint8_t i;
|
|
do
|
|
{
|
|
i = ticks_us;
|
|
while (--i);
|
|
} while (--t);
|
|
}
|
|
|
|
uint32_t SYS_GetSysClock(void)
|
|
{
|
|
return ((uint32_t)__CONF_FOSC) / clkdiv;
|
|
}
|