时钟源
STM32H7 有如下六种时钟可供使用:
- HSI (High-speed internal oscillator) :
HSI 是内部的高速 RC 振荡器,频率 64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快
速启动(仅需几个微秒),缺点是精度差,即使经过校准。 - HSE (High-speed external oscillator):
HSE 是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围 4-48MHz。优势是
精度高,缺点是增加成本。 - LSE (Low-speed external oscillator)
LSE 是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接 32.768KHz,主要用于
RTC 实时时钟。 - LSI (Low-speed internal oscillator)
LSI 是内部的低速 RC 振荡器,频率约是 32KHz,主要用于独立看门狗和自动唤醒,也可以用于 RTC
实时时钟。 - CSI (Low-power internal oscillator)
CSI 是内部的低速振荡器,频率约是 4MHz,相比 64MHz 的 HSI,主要用于低功耗。 - HSI48 (High-speed 48 MHz internal oscillator)
HSI48 是内部高速振荡器,频率约是 48MHz,用于给特定的外设提供时钟,比如 USB。
通过HAL_RCC_OscConfig函数来使能和配置时钟源。
比如下面代码用于配置HSI48、HSE
//使能HSI48MHz给USB使用
RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState=RCC_HSE_ON;
RCC_OscInitStruct.HSI48State=RCC_HSI48_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.PLLN=160;
RCC_OscInitStruct.PLL.PLLM=5;
RCC_OscInitStruct.PLL.PLLP=2;
RCC_OscInitStruct.PLL.PLLQ=4;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
ret=HAL_RCC_OscConfig(&RCC_OscInitStruct);
if(ret!=HAL_OK) while(1);
下面代码用于配置LSE
RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_LSE;//LSE配置
RCC_OscInitStruct.PLL.PLLState=RCC_PLL_NONE;
RCC_OscInitStruct.LSEState=RCC_LSE_ON; //RTC使用LSE
HAL_RCC_OscConfig(&RCC_OscInitStruct);
AHB、APB1~4
/*
选择 PLL 的输出作为系统时钟
配置 RCC_CLOCKTYPE_SYSCLK 系统时钟
配置 RCC_CLOCKTYPE_HCLK 时钟,对应 AHB1,AHB2,AHB3 和 AHB4 总线
配置 RCC_CLOCKTYPE_PCLK1 时钟,对应 APB1 总线
配置 RCC_CLOCKTYPE_PCLK2 时钟,对应 APB2 总线
配置 RCC_CLOCKTYPE_D1PCLK1 时钟,对应 APB3 总线
配置 RCC_CLOCKTYPE_D3PCLK1 时钟,对应 APB4 总线
*/
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_DIV4;
/* 此函数会更新 SystemCoreClock,并重新配置 HAL_InitTick */
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
if(ret != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
设置外设时钟源
FDCAN1 和 FDCAN2 支持三种时钟源 HSE,PLL1Q 和 PLL2Q
//FDCAN1时钟源配置为PLL1Q
FDCAN_PeriphClk.PeriphClockSelection=RCC_PERIPHCLK_FDCAN;
FDCAN_PeriphClk.FdcanClockSelection=RCC_FDCANCLKSOURCE_PLL;
HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk);

也可以给FDCAN选择PLL2Q时钟源的同时配置PLL2
/* 选择 PLL2Q 作为 FDCANx 时钟 */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
PeriphClkInitStruct.PLL2.PLL2M = 5;
PeriphClkInitStruct.PLL2.PLL2N = 80;
PeriphClkInitStruct.PLL2.PLL2P = 2;
PeriphClkInitStruct.PLL2.PLL2Q = 20;
PeriphClkInitStruct.PLL2.PLL2R = 2;
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
设置SPI3的时钟源
//设置SPI3的时钟源
SPI3ClkInit.PeriphClockSelection=RCC_PERIPHCLK_SPI3; //设置SPI3时钟源
SPI3ClkInit.Spi123ClockSelection=RCC_SPI123CLKSOURCE_PLL; //SPI3时钟源使用PLL1Q
HAL_RCCEx_PeriphCLKConfig(&SPI3ClkInit);
设置RTC的时钟源
PeriphClkInitStruct.PeriphClockSelection=RCC_PERIPHCLK_RTC;//外设为RTC
PeriphClkInitStruct.RTCClockSelection=RCC_RTCCLKSOURCE_LSE;//RTC时钟源为LSE
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
1366

被折叠的 条评论
为什么被折叠?



