/* * 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 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; } // us级延时 void rt_hw_us_delay(rt_uint32_t us) { u32 ticks; u32 told,tnow,tcnt=0; u32 reload=SysTick->LOAD; //LOAD的值 ticks=us; //需要的节拍数 rt_enter_critical(); //阻止OS调度,防止打断us延时 told=SysTick->VAL; //刚进入时的计数器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow=ticks)break; //时间超过/等于要延迟的时间,则退出. } }; rt_exit_critical(); //恢复OS调度 } #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) #define RT_HEAP_SIZE 5*1024//1536 //static uint32_t rt_heap[RT_HEAP_SIZE]; // heap default size: 6K(1536 * 4) RT_WEAK void *rt_heap_begin_get(void) { // return rt_heap; return (void *)0x10000000; } RT_WEAK void *rt_heap_end_get(void) { // return rt_heap + RT_HEAP_SIZE; return (void *)(0x10000000+64*1024/4); } #endif void mpu_init(void) { //选择0号region MPU->RNR=0; //选择基地址 MPU->RBAR=0x00000000; //设置属性及容量 MPU->RASR=((0x3)<CTRL=1; } /** * This function will initial your board. */ void rt_hw_board_init() { NVIC_SetVectorTable(NVIC_VectTab_FLASH,(u32)128*1024); _SysTick_Config (SystemCoreClock/1000); // LED_Init(); // LED鍒濆鍖? // Usart_Config(); // 涓插彛鍒濆鍖? // SDRAM_Init(); // sdram瑕佸厛浜巈mwin涔嬪墠鍒濆鍖? // sFLASH_Init(); //SPI_Flash_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 ( ); } void OS_CPU_SysTickHandler(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) { }