/* 开发板硬件相关头文件 */ #include "board.h" /* RT-Thread相关头文件 */ #include #include #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) #define RT_HEAP_SIZE 1024 /* 从内部SRAM里面分配一部分静态内存来作为rtt的堆空间,这里配置为4KB */ static uint32_t rt_heap[RT_HEAP_SIZE]; RT_WEAK void *rt_heap_begin_get(void) { return rt_heap; } RT_WEAK void *rt_heap_end_get(void) { return rt_heap + RT_HEAP_SIZE; } #endif /** * @brief 开发板硬件初始化函数 * @param 无 * @retval 无 * * @attention * RTT把开发板相关的初始化函数统一放到board.c文件中实现, * 当然,你想把这些函数统一放到main.c文件也是可以的。 */ void rt_hw_board_init() { /* 系统时钟初始化成480MHz */ SystemClock_Config(); /* 初始化SysTick */ HAL_SYSTICK_Config( HAL_RCC_GetSysClockFreq() / RT_TICK_PER_SECOND ); /* 硬件BSP初始化统统放在这里,比如LED,串口,LCD等 */ /* LED 端口初始化 */ LED_GPIO_Config(); /* usart 端口初始化 */ DEBUG_USART_Config(); /* KEY 端口初始化 */ Key_GPIO_Config(); /* 调用组件初始化函数 (use INIT_BOARD_EXPORT()) */ #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); #endif } /** * @brief SysTick中断服务函数 * @param 无 * @retval 无 * * @attention * SysTick中断服务函数在固件库文件stm32f10x_it.c中也定义了,而现在 * 在board.c中又定义一次,那么编译的时候会出现重复定义的错误,解决 * 方法是可以把stm32f10x_it.c中的注释或者删除即可。 */ void SysTick_Handler(void) { /* 进入中断 */ rt_interrupt_enter(); /* 更新时基 */ rt_tick_increase(); /* 离开中断 */ rt_interrupt_leave(); } /** * @brief 重映射串口DEBUG_USARTx到rt_kprintf()函数 * Note:DEBUG_USARTx是在bsp_usart.h中定义的宏,默认使用串口1 * @param str:要输出到串口的字符串 * @retval 无 * * @attention * */ void rt_hw_console_output(const char *str) { /* 进入临界段 */ rt_enter_critical(); /* 直到字符串结束 */ while (*str!='\0') { /* 换行 */ if (*str=='\n') { //HAL_UART_Transmit( &UartHandle,(uint8_t *)'\r',1,1000); } HAL_UART_Transmit( &UartHandle,(uint8_t *)(str++),1,1000); } /* 退出临界段 */ rt_exit_critical(); } /** * @brief System Clock 配置 * system Clock 配置如下: * System Clock source = PLL (HSE) * SYSCLK(Hz) = 480000000 (CPU Clock) * HCLK(Hz) = 240000000 (AXI and AHBs Clock) * AHB Prescaler = 2 * D1 APB3 Prescaler = 2 (APB3 Clock 120MHz) * D2 APB1 Prescaler = 2 (APB1 Clock 120MHz) * D2 APB2 Prescaler = 2 (APB2 Clock 120MHz) * D3 APB4 Prescaler = 2 (APB4 Clock 120MHz) * HSE Frequency(Hz) = 25000000 * PLL_M = 5 * PLL_N = 192 * PLL_P = 2 * PLL_Q = 4 * PLL_R = 2 * VDD(V) = 3.3 * Flash Latency(WS) = 4 * @param None * @retval None */ static void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; HAL_StatusTypeDef ret = HAL_OK; /*使能供电配置更新 */ MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0); /* 当器件的时钟频率低于最大系统频率时,电压调节可以优化功耗, 关于系统频率的电压调节值的更新可以参考产品数据手册。 */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /* 启用HSE振荡器并使用HSE作为源激活PLL */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_OFF; RCC_OscInitStruct.CSIState = RCC_CSI_OFF; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; RCC_OscInitStruct.PLL.PLLN = 192; RCC_OscInitStruct.PLL.PLLP = 2; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLQ = 4; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); if(ret != HAL_OK) { while(1) { ; } } /* 选择PLL作为系统时钟源并配置总线时钟分频器 */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | \ RCC_CLOCKTYPE_HCLK | \ RCC_CLOCKTYPE_D1PCLK1 | \ RCC_CLOCKTYPE_PCLK1 | \ RCC_CLOCKTYPE_PCLK2 | \ RCC_CLOCKTYPE_D3PCLK1); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4); if(ret != HAL_OK) { while(1) { ; } } } /****************************END OF FILE***************************/