171 lines
7.4 KiB
C
171 lines
7.4 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.
|
|
|
|
#ifndef ___FW_SYS_H___
|
|
#define ___FW_SYS_H___
|
|
|
|
#include "fw_conf.h"
|
|
#include "fw_types.h"
|
|
|
|
typedef enum
|
|
{
|
|
SYS_ExternalOSC_Clock = 0x00,
|
|
SYS_ExternalOSC_Crystal = 0x01,
|
|
} SYS_ExternalOSC_t;
|
|
|
|
typedef enum
|
|
{
|
|
SYS_SysClkOutputPort_P54 = 0x00,
|
|
SYS_SysClkOutputPort_P16 = 0x01,
|
|
} SYS_SysClkOutputPort_t;
|
|
|
|
/**
|
|
* STC8H Clock:
|
|
* MCKSEL ||===> MCLKODIV ==> MCLKO_S => P1.6/P5.4
|
|
* 00 Internal IRC | ||
|
|
* 01 External OSC |==> CLKDIV ==> SYSCLK
|
|
* 10 External 32KHz |
|
|
* 11 Internal 32KHz |
|
|
*/
|
|
|
|
#define SYS_SetFOSC(__IRCBAND__, __VRTRIM__, __IRTRIM__, __LIRTRIM__) do { \
|
|
IRCBAND = ((__IRCBAND__) & 0x03); \
|
|
VRTRIM = (__VRTRIM__); \
|
|
IRTRIM = (__IRTRIM__); \
|
|
LIRTRIM = ((__LIRTRIM__) & 0x03); \
|
|
} while(0)
|
|
|
|
/**
|
|
* Enable high speed internal oscillator
|
|
*/
|
|
#define SYS_EnableOscillatorHSI() do { \
|
|
SFRX_ON(); \
|
|
(HIRCCR) = (HIRCCR) | (0x01 << 7); \
|
|
while (!(HIRCCR & 0x01)); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Disable high speed internal oscillator
|
|
*/
|
|
#define SYS_DisableOscillatorHSI() do { \
|
|
SFRX_ON(); \
|
|
(HIRCCR) = (HIRCCR) & ~(0x01 << 7); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
|
|
/**
|
|
* Enable low speed internal oscillator
|
|
*/
|
|
#define SYS_EnableOscillatorLSI() do { \
|
|
SFRX_ON(); \
|
|
(IRC32KCR) = (IRC32KCR) | (0x01 << 7); \
|
|
while (!(IRC32KCR & 0x01)); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Disable low speed internal oscillator
|
|
*/
|
|
#define SYS_DisableOscillatorLSI() do { \
|
|
SFRX_ON(); \
|
|
(IRC32KCR) = (IRC32KCR) & ~(0x01 << 7); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
|
|
/**
|
|
* Enable high speed external oscillator
|
|
*/
|
|
#define SYS_EnableOscillatorHSE() do { \
|
|
SFRX_ON(); \
|
|
(XOSCCR) = (XOSCCR) | (0x01 << 7); \
|
|
while (!(HIRCCR & 0x01)); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Disable high speed external oscillator
|
|
*/
|
|
#define SYS_DisableOscillatorHSE() do { \
|
|
SFRX_ON(); \
|
|
(XOSCCR) = (XOSCCR) & ~(0x01 << 7); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Set high speed external oscillator type
|
|
*/
|
|
#define SYS_SetExternalOscType(__TYPE__) SFRX_ASSIGN(XOSCCR, 6, (__TYPE__))
|
|
|
|
/**
|
|
* Enable low speed external oscillator
|
|
*/
|
|
#define SYS_EnableOscillatorLSE() do { \
|
|
SFRX_ON(); \
|
|
(X32KCR) = (X32KCR) | (0x01 << 7); \
|
|
while (!(X32KCR & 0x01)); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Disable low speed external oscillator
|
|
*/
|
|
#define SYS_DisableOscillatorLSE() do { \
|
|
SFRX_ON(); \
|
|
(X32KCR) = (X32KCR) & ~(0x01 << 7); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Set low speed external oscillator gain
|
|
*/
|
|
#define SYS_SetExternal32kHighGain(__STATE__) SFRX_ASSIGN(X32KCR, 6, (__STATE__))
|
|
|
|
/**
|
|
* System clock output
|
|
* 0:No output, Foutput = SYSCLK / __DIV__
|
|
*/
|
|
#define SYS_SetSysClockOutputDivider(__DIV__) do { \
|
|
SFRX_ON(); \
|
|
(MCLKOCR) = (MCLKOCR) & ~(0x7F) | (__DIV__); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
|
|
/**
|
|
* System clock output pin
|
|
* 0:P5.4, 1:P1.6
|
|
*/
|
|
#define SYS_SetClockOutputPin(__PORT__) SFRX_ASSIGN(MCLKOCR, 7, (__STATE__))
|
|
|
|
/**
|
|
* Enable 48MHz USB OSC
|
|
*/
|
|
#define SYS_EnableOscillator48M() do { \
|
|
SFRX_ON(); \
|
|
RSTFLAG = 0x07; \
|
|
(IRC48MCR) = (IRC48MCR) | (0x01 << 7); \
|
|
while (!(IRC48MCR & 0x01)); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
/**
|
|
* Disable 48MHz USB OSC
|
|
*/
|
|
#define SYS_DisableOscillator48M() do { \
|
|
SFRX_ON(); \
|
|
(IRC48MCR) = (IRC48MCR) & ~(0x01 << 7); \
|
|
SFRX_OFF(); \
|
|
} while(0)
|
|
|
|
void SYS_SetClock(void);
|
|
void SYS_TrimClock(uint8_t vrtrim, uint8_t irtrim);
|
|
void SYS_Delay(uint16_t t);
|
|
void SYS_DelayUs(uint16_t t);
|
|
uint32_t SYS_GetSysClock(void);
|
|
|
|
#endif
|