/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2017-07-24 Tanek the first version * 2018-11-12 Ernest Chen modify copyright */ //#include "bsp_led.h" //#include "device.h" //#include "device_drv_config.h" #include "main.h" #include #include #include "libc.h" #include "string.h" void SystemClock_Config(void); #if 1 #define _SCB_BASE (0xE000E010UL) #define _SYSTICK_CTRL (*(rt_uint32_t *)(_SCB_BASE + 0x0)) #define _SYSTICK_LOAD (*(rt_uint32_t *)(_SCB_BASE + 0x4)) #define _SYSTICK_VAL (*(rt_uint32_t *)(_SCB_BASE + 0x8)) #define _SYSTICK_CALIB (*(rt_uint32_t *)(_SCB_BASE + 0xC)) #define _SYSTICK_PRI (*(rt_uint8_t *)(0xE000ED23UL)) // Updates the variable SystemCoreClock and must be called // whenever the core clock is changed during program execution. extern void SystemCoreClockUpdate(void); // Holds the system core clock, which is the system clock // frequency supplied to the SysTick timer and the processor // core clock. extern uint32_t SystemCoreClock; static uint32_t _SysTick_Config(rt_uint32_t ticks) { if ((ticks - 1) > 0xFFFFFF) { return 1; } _SYSTICK_LOAD = ticks - 1; _SYSTICK_PRI = 0xFF; _SYSTICK_VAL = 0; _SYSTICK_CTRL = 0x07; return 0; } void rt_hw_us_delay(rt_uint32_t us) { u32 ticks; u32 told,tnow,tcnt=0; u32 reload=SysTick->LOAD; ticks=us; rt_enter_critical(); told=SysTick->VAL; while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow=ticks)break; } }; rt_exit_critical(); } #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) RT_WEAK void *rt_heap_begin_get(void) { return (void *)0x10000000; } RT_WEAK void *rt_heap_end_get(void) { return (void *)(0x10000000+64*1024/4); } #endif void mpu_init(void) { MPU->RNR=0; MPU->RBAR=0x00000000; MPU->RASR=((0x3)<CTRL=1; } const libc_device_file *g_usart; // 重新配置时钟,25m晶振如果要保证usb为48m,则主频最高只能配置为168m void reconfig_clock(void) { RCC_ClocksTypeDef rcc = {0}; // RCC_PLLConfig(RCC_PLLSource_HSE, 25, 336, 2, 7); RCC_GetClocksFreq(&rcc); SystemCoreClock = rcc.SYSCLK_Frequency; } /** * This function will initial your board. */ void rt_hw_board_init() { // NVIC_SetVectorTable(NVIC_VectTab_FLASH,(u32)128*1024); NVIC_SetVectorTable(NVIC_VectTab_FLASH,(u32)0); reconfig_clock(); _SysTick_Config (SystemCoreClock/1000); NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); LED_Init(); Usart_Config(); SDRAM_Init(); sFLASH_Init(); mymem_init(); rt_system_heap_init(rt_heap_begin_get(),rt_heap_end_get()); // irq_vector_init(); mpu_init(); Touch_Init(); USART3_Init(); RANDOM_Init(); // USBD_InitAsVcp (); g_usart = libc_find_dev("usart"); g_usart->open(); } void rt_hw_console_output(const char *str) { /* empty console output */ g_usart->write(str,strlen(str)); } void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); } /** * @brief System Clock Configuration * @retval None */ __weak void SystemClock_Config(void) { }