zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【android】string.xml中的一些错误
    【android】【转】class android.media.MediaPlayer
    【android】gallery 循环播放
    【android】使用handler更新UI
    【android】Textview部分字符高亮
    【android】AudioManager音量控制
    【Android】listview选中行字体变大
    整理模拟练习8 第三章 会计电算化的工作环境
    会计电算化模拟试题9
    第二章 会计电算化基本要求
  • 原文地址:https://www.cnblogs.com/mn-xb/p/9915824.html
Copyright © 2011-2022 走看看