韦东山物联网学习第一课

今天我重温习了一下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

生成海报
点赞 0

qq_41744416

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

嵌入式基本概念

1.现代计算机架构 三大主键:CPU,内存条,硬盘 2.一些处理器概念 cpu:中央处理器,在PC机它是一个独立的芯片。 MPU (Microprocessor Un

【物联网项目】OLED改造

如何把7ping的SPI通信的OLED改造为IIC通信? 之前买OLED的时候发现有两款OLED。 一款是直接IIC通信的OLED只有4Pin管脚。 分别是GND VCC SCL SDA 另一款是支持SPI通信和IIC通信的

基于GD32MCU程序远程升级IAP设计思路

1.1 mcu设备远程升级程序的应用场景 在远程无线监控设备中,IAP程序远程升级功能起着重要作用。比如安装在监控区域的设备需要进行功能升级或者Bug修改,远程监控端可以通过WIFI、蓝牙、lora、以太网等模块将工

STM32开发笔记04---配置系统时间

架构图 思考重点 本文的目的是使用HSE外部晶振来配置系统时钟参考手册中的时钟树如何理解理解开发版初始化过程中对系统时钟的操作如何自行变更系统时钟 配置时钟源 在开发版STM32F429,以HSE, HSI, PLL作为主要