/* * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-12-16 CDT first version */ #include "board.h" #define DBG_TAG "drv_common" #define DBG_LVL DBG_INFO #include #ifdef RT_USING_PIN #include #endif #ifdef RT_USING_SERIAL #ifdef RT_USING_SERIAL_V2 #include #else #include #endif /* RT_USING_SERIAL */ #endif /* RT_USING_SERIAL_V2 */ #ifdef RT_USING_FINSH #include static void reboot(uint8_t argc, char **argv) { rt_hw_cpu_reset(); } MSH_CMD_EXPORT(reboot, Reboot System); #endif /* RT_USING_FINSH */ /** * This function is executed in case of error occurrence. */ void _Error_Handler(char *s, int num) { LOG_E("Error_Handler at file:%s num:%d", s, num); while (1) { } } /** * This is the timer interrupt service routine. */ void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); } /** * Configures the SysTick for OS tick. */ void SysTick_Configuration(void) { stc_clock_freq_t stcClkFreq; rt_uint32_t cnts; CLK_GetClockFreq(&stcClkFreq); cnts = (rt_uint32_t)stcClkFreq.u32HclkFreq / RT_TICK_PER_SECOND; SysTick_Config(cnts); } /** * This function will initial HC32 board. */ void rt_hw_board_init() { PeripheralRegister_Unlock(); SystemBase_Config(); SystemClock_Config(); PeripheralClock_Config(); /* Configure the SysTick */ SysTick_Configuration(); /* Heap initialization */ #if defined(RT_USING_HEAP) rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); #endif #ifdef RT_USING_PIN rt_hw_pin_init(); #endif #ifdef RT_USING_SERIAL rt_hw_usart_init(); #endif #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif /* Board underlying hardware initialization */ #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif } void rt_hw_us_delay(rt_uint32_t us) { uint32_t start, now, delta, reload, us_tick; start = SysTick->VAL; reload = SysTick->LOAD; us_tick = SystemCoreClock / 1000000UL; do { now = SysTick->VAL; delta = start > now ? start - now : reload + start - now; } while (delta < us_tick * us); } /*@}*/