feat: add trim clock function for vrtrim and irtrim scan

This commit is contained in:
IOsetting 2022-07-03 17:59:45 +08:00
parent 8e2ae045bd
commit 8fe7f131c1
3 changed files with 91 additions and 0 deletions

View File

@ -0,0 +1,83 @@
// 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.
/**
* Scan to find most close VRTRIM and IRTRIM for specified frequency.
*
* Change build_flags in platformio.ini
* D__CONF_FOSC -> target frequency, e.g. 36864000UL
* D__CONF_MCU_MODEL -> MCU type, e.g. MCU_MODEL_STC8H3K64S2
* D__CONF_IRCBAND -> frequency band depending on the frequency
* STC8H1K - 00:20MHz, 01:35MHz
* STC8H3K,STC8H8K - 02:24MHz, 03:40MHz
*
* Connect UART at baud 115200 and read output, when the output is not garbled,
* find the middle value of VRTRIM and IRTRIM, lower VRTRIM is preferred
*/
#include "fw_hal.h"
uint8_t readCode(uint8_t offset)
{
return (*(unsigned char volatile __CODE *)(__CID_ADDR + offset));
}
void main(void)
{
uint8_t i, j, vrtrim = 0x01, irtrim = 0;
// Set system clock. Invoke it to set the frequency band
SYS_SetClock();
// UART1 configuration: baud 115200 with Timer2, 1T mode, no interrupt
UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);
while(1)
{
// The upper limit of IRTRIM depends on VRTRIM, MCU becomes unstable if it goes
// too high, set 0x30 to a lower value if scan stucks at beginning
if (++irtrim == 0x30 + vrtrim)
{
irtrim = 0x00;
// VRTRIM controls the voltage level, normally it won't exceed 0x40
if (++vrtrim == 0x40)
{
vrtrim = 0x00;
}
}
SYS_TrimClock(vrtrim, irtrim);
UART1_TxString("ADDR: 0x");
UART1_TxHex(__CID_ADDR >> 8);
UART1_TxHex(__CID_ADDR & 0xFF);
UART1_TxString("\r\n");
UART1_TxString("MCUID: ");
for (j = 0; j < 7; j++)
{
UART1_TxHex(readCode(18 + j));
UART1_TxChar(' ');
}
UART1_TxString("\r\n");
UART1_TxString("Current IRCBAND:");
UART1_TxHex(IRCBAND);
UART1_TxString(", VRTRIM:");
UART1_TxHex(VRTRIM);
UART1_TxString(", IRTRIM:");
UART1_TxHex(IRTRIM);
UART1_TxString(", LIRTRIM:");
UART1_TxHex(LIRTRIM);
UART1_TxString("\r\n\r\n");
SYS_Delay(50);
}
}

View File

@ -162,6 +162,7 @@ typedef enum
} 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);

View File

@ -40,6 +40,13 @@ void SYS_SetClock(void)
while (--i); // Wait
}
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;