• rt-thread 3.1.0+stm32f4xx_hal中的系统时钟问题


    系统各总线时钟测试

     1 int main(void)
     2 {
     3     RCC_OscInitTypeDef RCC_OscInitStruct;
     4 
     5     rt_kprintf("SysClockFreq: %d
    ", HAL_RCC_GetSysClockFreq());
     6     rt_kprintf("PCLK1Freq: %d
    ", HAL_RCC_GetPCLK1Freq());
     7     rt_kprintf("PCLK2Freq: %d
    ", HAL_RCC_GetPCLK2Freq());
     8     HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
     9 
    10     return 0;
    11 }

    得到系统时钟为(env中配置的晶振为25MHz,系统时钟为168MHz)

    从HAL_RCC_GetOscConfig(&RCC_OscInitStruct)中获取的配置如下

    发现问题在于PLLN=160(取值范围应为[192,432])

    解决方法:

    在board.c文件中的static void SystemClock_Config(void)中,添加如下代码

     1 if (source_clk % 2 == 0)
     2     {
     3         RCC_OscInitStruct.PLL.PLLM = source_clk / 2; //Get 2M clock
     4         if ((sys_clk * 4) % 48 == 0)
     5         {
     6             RCC_OscInitStruct.PLL.PLLN = sys_clk * 2;//Get 4*HCLK_VALUE
     7             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;//Get HCLK_VALUE
     8         }
     9         else if ((sys_clk * 6) % 48 == 0)
    10         {
    11             RCC_OscInitStruct.PLL.PLLN = sys_clk * 3;//Get 6*HCLK_VALUE
    12             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV6;//Get HCLK_VALUE
    13         }
    14         else if ((sys_clk * 8) % 48 == 0)
    15         {
    16             RCC_OscInitStruct.PLL.PLLN = sys_clk * 4;//Get 8*HCLK_VALUE
    17             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8;//Get HCLK_VALUE
    18         }
    19         else
    20         {
    21             //can not get 48M Clock USB is unuseable
    22             RCC_OscInitStruct.PLL.PLLN = sys_clk;//Get 2*HCLK_VALUE
    23             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//Get HCLK_VALUE
    24         }
    25     }
    26     else
    27     {
    28         RCC_OscInitStruct.PLL.PLLM = source_clk;//Get 1M clock
    29         if ((sys_clk * 2) % 48 == 0)  //添加内容
    30         {
    31             RCC_OscInitStruct.PLL.PLLN = sys_clk * 2;//Get 2*HCLK_VALUE
    32             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//Get HCLK_VALUE
    33         }
    34         else if ((sys_clk * 4) % 48 == 0)
    35         {
    36             RCC_OscInitStruct.PLL.PLLN = sys_clk * 4;//Get 4*HCLK_VALUE
    37             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;//Get HCLK_VALUE
    38         }
    39         else if ((sys_clk * 6) % 48 == 0)
    40         {
    41             RCC_OscInitStruct.PLL.PLLN = sys_clk * 6;//Get 6*HCLK_VALUE
    42             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV6;//Get HCLK_VALUE
    43         }
    44         else if ((sys_clk * 8) % 48 == 0)
    45         {
    46             RCC_OscInitStruct.PLL.PLLN = sys_clk * 8;//Get 8*HCLK_VALUE
    47             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8;//Get HCLK_VALUE
    48         }
    49         else
    50         {
    51             //can not get 48M Clock USB is unuseable
    52             RCC_OscInitStruct.PLL.PLLN = sys_clk * 2;//Get 2*HCLK_VALUE
    53             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//Get HCLK_VALUE
    54         }
    55     }
    重新运行程序,结果如下:

    STM32F4_RCC系统时钟配置及描述可参见http://www.cnblogs.com/strongerHuang/p/5609969.html

  • 相关阅读:
    myBatis07 案例实践
    mySql开启远程连接
    myBatis05 ResultMap
    centos7.8使用yum安装mysql5.7.30图文结合,手把手教会你
    flowable: parent 'xxxxxx' was updated by another transaction concurrently
    如何在后台运行Linux命令或者脚本
    Linux查看系统是32位还是64位
    Linux中的硬链接和软链接
    Linux中计算文本行数与字数必备命令WC的用法
    Linux中8个有用的touch命令
  • 原文地址:https://www.cnblogs.com/mn-xb/p/9915824.html
Copyright © 2020-2023  润新知