203 lines
5.3 KiB
C
203 lines
5.3 KiB
C
/* 开发板硬件相关头文件 */
|
||
#include "board.h"
|
||
|
||
/* RT-Thread相关头文件 */
|
||
#include <rthw.h>
|
||
#include <rtthread.h>
|
||
|
||
|
||
#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***************************/
|