硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4930|回复: 2
收起左侧

[USB] STM32H7的USB时钟使HSI48注意事项

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2021-1-21 10:56:58 | 显示全部楼层 |阅读模式


HSI48是USB专用时钟,完整配置如下:

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: SystemClock_Config
  4. *        功能说明: 初始化系统时钟
  5. *                    System Clock source            = PLL (HSE)
  6. *                    SYSCLK(Hz)                     = 400000000 (CPU Clock)
  7. *                   HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  8. *                    AHB Prescaler                  = 2
  9. *                    D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  10. *                    D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  11. *                    D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  12. *                    D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
  13. *                    HSE Frequency(Hz)              = 25000000
  14. *                   PLL_M                          = 5
  15. *                    PLL_N                          = 160
  16. *                    PLL_P                          = 2
  17. *                    PLL_Q                          = 4
  18. *                    PLL_R                          = 2
  19. *                    VDD(V)                         = 3.3
  20. *                    Flash Latency(WS)              = 4
  21. *        形    参: 无
  22. *        返 回 值: 无
  23. *********************************************************************************************************
  24. */
  25. static void SystemClock_Config(void)
  26. {
  27.         RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  28.         RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  29.         HAL_StatusTypeDef ret = HAL_OK;

  30.         /* 锁住SCU(Supply configuration update) */
  31.         MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

  32.         /*
  33.       1、芯片内部的LDO稳压器输出的电压范围,可选VOS1,VOS2和VOS3,不同范围对应不同的Flash读速度,
  34.          详情看参考手册的Table 12的表格。
  35.       2、这里选择使用VOS1,电压范围1.15V - 1.26V。
  36.     */
  37.         __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  38.         while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  39.         /* 使能HSE,并选择HSE作为PLL时钟源 */
  40.         RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_HSI48;
  41.         RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  42.         RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  43.         RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  44.         RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  45.         RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  46.         RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  47.                
  48.         RCC_OscInitStruct.PLL.PLLM = 5;
  49.         RCC_OscInitStruct.PLL.PLLN = 160;
  50.         RCC_OscInitStruct.PLL.PLLP = 2;
  51.         RCC_OscInitStruct.PLL.PLLR = 2;
  52.         RCC_OscInitStruct.PLL.PLLQ = 4;               
  53.                
  54.         RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  55.         RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;       
  56.         ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  57.         if(ret != HAL_OK)
  58.         {
  59.         Error_Handler(__FILE__, __LINE__);
  60.         }

  61.         /*
  62.        选择PLL的输出作为系统时钟
  63.        配置RCC_CLOCKTYPE_SYSCLK系统时钟
  64.        配置RCC_CLOCKTYPE_HCLK 时钟,对应AHB1,AHB2,AHB3和AHB4总线
  65.        配置RCC_CLOCKTYPE_PCLK1时钟,对应APB1总线
  66.        配置RCC_CLOCKTYPE_PCLK2时钟,对应APB2总线
  67.        配置RCC_CLOCKTYPE_D1PCLK1时钟,对应APB3总线
  68.        配置RCC_CLOCKTYPE_D3PCLK1时钟,对应APB4总线     
  69.     */
  70.         RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  71.                                                                  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);

  72.         RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  73.         RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  74.         RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  75.         RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  76.         RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  77.         RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  78.         RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  79.        
  80.         /* 此函数会更新SystemCoreClock,并重新配置HAL_InitTick */
  81.         ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  82.         if(ret != HAL_OK)
  83.         {
  84.         Error_Handler(__FILE__, __LINE__);
  85.         }

  86.     /*
  87.       使用IO的高速模式,要使能IO补偿,即调用下面三个函数
  88.       (1)使能CSI clock
  89.       (2)使能SYSCFG clock
  90.       (3)使能I/O补偿单元, 设置SYSCFG_CCCSR寄存器的bit0
  91.     */
  92.         __HAL_RCC_CSI_ENABLE() ;

  93.         __HAL_RCC_SYSCFG_CLK_ENABLE() ;

  94.         HAL_EnableCompensationCell();

  95.    /* AXI SRAM的时钟是上电自动使能的,而D2域的SRAM1,SRAM2和SRAM3要单独使能 */       
  96. #if 1
  97.         __HAL_RCC_D2SRAM1_CLK_ENABLE();
  98.         __HAL_RCC_D2SRAM2_CLK_ENABLE();
  99.         __HAL_RCC_D2SRAM3_CLK_ENABLE();
  100.        
  101.         __HAL_RCC_BKPRAM_CLKAM_ENABLE();      
  102.         __HAL_RCC_D3SRAM1_CLKAM_ENABLE();
  103. #endif

  104.     {
  105.                 /*
  106.                         USB工作需要48MHz的时钟,可以由PLL1Q,PLL3Q和HSI48提供
  107.                         PLL1Q用于给SDMMC提供时钟
  108.                     PLL3Q给LTDC提供时钟,也可以跟USB共用,不过得更USB设置相同的频率才可一起用。
  109.                     HSI48可以供USB独享,就是精度不是很高。
  110.                 */
  111.                 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  112. #if 0
  113.                 /* PLL3-Q for USB Clock = 48M */
  114.                 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  115.                 PeriphClkInitStruct.PLL3.PLL3M = 5;
  116.                 PeriphClkInitStruct.PLL3.PLL3N = 48;
  117.                 PeriphClkInitStruct.PLL3.PLL3P = 2;
  118.                 PeriphClkInitStruct.PLL3.PLL3Q = 5;
  119.                 PeriphClkInitStruct.PLL3.PLL3R = 2;
  120.                 PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_2;
  121.                 PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
  122.                 PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
  123.                 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;
  124.                 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK)
  125.                 {
  126.                         Error_Handler(__FILE__, __LINE__);
  127.                 }       
  128. #else
  129.                 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  130.                 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
  131.                 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  132.                 {
  133.                         Error_Handler(__FILE__, __LINE__);
  134.                 }
  135.               HAL_PWREx_EnableUSBVoltageDetector();
  136. #endif
  137.         }       
  138. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
 楼主| 发表于 2021-1-21 10:57:30 | 显示全部楼层
这个地方最容易忘
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_HSI48;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-1-21 15:16:45 | 显示全部楼层
自从有了 CUBEMX,我再也没去研究过时钟树了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-30 00:40 , Processed in 0.201296 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表