今天我重温习了一下STM32的物联网编程。主要重新温故了一下STM32的时钟设置,并放上了注释:
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; //把RCC_OscInitStruct变量清零。
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; //把RCC_ClkInitStruct变量清零。
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; //时钟类型
/*
#define RCC_OSCILLATORTYPE_NONE 0x00000000U //没有时钟
#define RCC_OSCILLATORTYPE_HSE 0x00000001U //使用外部振荡器晶振作为时钟
#define RCC_OSCILLATORTYPE_HSI 0x00000002U //使用内部高速时钟,时钟频率为8MHz
#define RCC_OSCILLATORTYPE_LSE 0x00000004U //使用外部低速时钟,时钟频率为32.768kHZ
#define RCC_OSCILLATORTYPE_LSI 0x00000008U //内部低功耗休眠时钟,频率为30~60Hz
*/
RCC_OscInitStruct.HSEState = RCC_HSE_OFF; //当不使用外部晶振的时候关闭该时钟,用到就打开。
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
/*一个作用是清空HSE分频,初始化HSE分频;还可以通过改写RCC_HSE_PREDIV_DIV1,
直接改写RCC_CFGR寄存器的值,不过没啥用后面又会被之后的代码改回去,所以这里一般不动。*/
RCC_OscInitStruct.HSIState = RCC_HSI_ON; //如果用到内部时钟,就打开,没用到就关闭。
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //打开锁相环,不分频就关闭锁相环
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
/*
如果是RCC_PLLSOURCE_HSI_DIV2,锁相环就采用内部时钟作为基准,频率就是8MHZ二分频后变成4MHz。
如果是RCC_PLLSOURCE_HSE,锁相环就采用外部时钟作为基准,频率为外部时钟频率
*/
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
/*
#define RCC_PLL_MUL2 RCC_CFGR_PLLMULL2
#define RCC_PLL_MUL3 RCC_CFGR_PLLMULL3
#define RCC_PLL_MUL4 RCC_CFGR_PLLMULL4
#define RCC_PLL_MUL5 RCC_CFGR_PLLMULL5
#define RCC_PLL_MUL6 RCC_CFGR_PLLMULL6
#define RCC_PLL_MUL7 RCC_CFGR_PLLMULL7
#define RCC_PLL_MUL8 RCC_CFGR_PLLMULL8
#define RCC_PLL_MUL9 RCC_CFGR_PLLMULL9
#define RCC_PLL_MUL10 RCC_CFGR_PLLMULL10
#define RCC_PLL_MUL11 RCC_CFGR_PLLMULL11
#define RCC_PLL_MUL12 RCC_CFGR_PLLMULL12
#define RCC_PLL_MUL13 RCC_CFGR_PLLMULL13
#define RCC_PLL_MUL14 RCC_CFGR_PLLMULL14
#define RCC_PLL_MUL15 RCC_CFGR_PLLMULL15
#define RCC_PLL_MUL16 RCC_CFGR_PLLMULL16
一共从2到16有这些频率可以选择
*/
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) //执行时钟频率配置的初始化,外部晶振时钟倍频后最大输出72M
{
while(1);
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
/*
RCC_CLOCKTYPE_SYSCLK选择这个就配置了系统时钟是HSE,HSI,还是PLL,
RCC_CLOCKTYPE_HCLK选择这个就配置了AHB时钟,
RCC_CLOCKTYPE_PCLK1选择这个就配置了APB1的时钟,
RCC_CLOCKTYPE_PCLK2选择这个就配置了APB2的时钟。
*/
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
/*
#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI !< 选择内部高速时钟作为系统时钟
#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE !< 选择外部晶振时钟作为系统时钟
#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL !< 选择锁相环时钟作为系统时钟
*/
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //AHB时钟分频是除以1~512中一个值
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; //APB1时钟分频,先从系统时钟分频得到AHB时钟,再从AHB时钟根据本选项分频得到APB1的频率,最终计算不得超过36MHz
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //APB2时钟分频,先从系统时钟分频得到AHB时钟,再从AHB时钟根据本选项分频得到APB2的频率,最终计算不得超过72MHz
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) //执行系统时钟和系统时钟分频给下面部件的时钟的配置。
{
while(1);
}
}
版权声明:本文为CSDN博主「qq_41744416」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41744416/article/details/122903706
暂无评论