164 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | ||
|  * 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 <rthw.h>
 | ||
| #include <rtthread.h>
 | ||
| #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<told)tcnt+=told-tnow;
 | ||
| 			else tcnt+=reload-tnow+told;
 | ||
| 			told=tnow;
 | ||
| 			if(tcnt>=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)<<MPU_RASR_AP_Pos)|((31)<<MPU_RASR_SIZE_Pos)|(0x5<<16)|1;
 | ||
| 	MPU->CTRL=1;
 | ||
| }
 | ||
| 
 | ||
| const libc_device_file *g_usart;
 | ||
| 
 | ||
| 
 | ||
| // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD>25m<35><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>֤usbΪ48m<38><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ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)
 | ||
| {
 | ||
| }
 |