RT-Thread Studio使用——创建工程并配置外部时钟(转)

硬件:正点原子阿波罗F429开发板,主控STM32F429IGT6,晶振25MHz
软件:RT-Thread Studio
RT-Thread版本:4.1.0
1.创建工程

 

 根据所使用的硬件信息,配置以上信息,注意红色框中的建议内容:工程用的是内部时钟,通常我们用的是外部时钟,需要修改drv_clk.c文件。
2.修改时钟配置函数

 

时钟的配置是在drivers/drv_clk.c文件中,函数system_clock_config()完成的,可以看到用的是内部时钟HSI。配置外部时钟可以由CubeMX来完成,最后直接将生成的时钟配置函数内容复制到drivers/drv_clk.c函数system_clock_config()中。

 

在这里我后面要用到USB,USB时钟需要配置为48MHz,所以主频配置为168MHz。系统时钟频率根据自己的需要来配置即可。
修改后的时钟配置函数如下:

  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
    RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };

    /** Configure the main internal regulator output voltage
     */
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    /** Initializes the CPU, AHB and APB busses clocks
     */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 25;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
    /** Initializes the CPU, AHB and APB busses clocks
     */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
    {
        Error_Handler();
    }

注意:RT-Thread Studio生成的工程中,drivers/stm32f4xx_hal_conf.h文件中定义外部晶振频率为8MHz,这里我用的外部晶振是25MHz的,这里需要做修改。(一开始按照其他人的教程修改了时钟配置函数,但是没有修改晶振频率,即HSE_VALUE的值,导致控制台输出一直乱码,后面debug之后才发现是时钟频率不对,一步步追踪到HSE_VALUE这个值)
默认的值

修改后的

3.打印时钟信息     

int main(void)
{
int count = 1;
//定义IO口模式
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

while (count++)
{
//LOG_D("Hello RT-Thread!");
LOG_D("System Clock information");
LOG_D("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());
LOG_D("HCLK_Frequency = %d", HAL_RCC_GetHCLKFreq());
LOG_D("PCLK1_Frequency = %d", HAL_RCC_GetPCLK1Freq());
LOG_D("PCLK2_Frequency = %d", HAL_RCC_GetPCLK2Freq());
rt_thread_mdelay(1000);
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(1000);
rt_pin_write(LED0_PIN, PIN_LOW);
}

return RT_EOK;
}

**补充:**系统时钟初始化函数调用流程
board.c文件中的rt_hw_board_init()函数 -> drv_common.c文件中的hw_board_init()函数 -> drv_clk.c文件中的clk_init()函数 -> drv_clk.c文件中的system_clock_config()函数。

知道这个流程之后就可以自行修改时钟配置函数。
总结:关于修改外部时钟配置的网上有很多人写过,只不过可能不少人会忽略了修改stm32f4xx_hal_conf.h文件中HSE_VALUE的值。在这里记录一下自己踩过的坑,希望大家学习顺利!

原文链接:https://blog.csdn.net/weixin_44735205/article/details/127115627

posted @ 2023-01-19 13:06  Tony.Jia  阅读(462)  评论(0编辑  收藏  举报