STM32 PLLCLK配置与时钟系统详解

需积分: 47 36 下载量 180 浏览量 更新于2024-08-06 收藏 16.14MB PDF 举报
"STM32单片机的时钟系统、 PLLCLK 2分频配置以及在北斗伪距多路径分析和单点定位解算中的应用" STM32是一款基于Cortex-M3内核的微控制器,广泛应用于嵌入式系统设计。在STM32中,时钟系统是非常关键的部分,它决定了处理器和其他外设的工作速度。标题提到的"2分频的PLLCLK"是指经过锁相环(PLL)倍频后的系统时钟再进行2分频,生成的时钟频率。 STM32的时钟配置寄存器RCC_CFGR中的MCO[2:0]位用于选择不同的时钟源。时钟输出通常需要使能控制,例如AHB总线时钟、内核时钟、APB1和APB2外设时钟等。在使用特定模块时,必须先通过相应的使能控制端开启其时钟。 APB总线分为高速APB2和低速APB1,分别连接不同的外设。APB1上连接的设备包括电源接口、CAN、USB、多个I2C和UART以及特定的定时器等。而APB2则连接了UART1、SPI1、Timer1、ADC以及所有的普通和第二功能IO口等。 关于定时器的倍频器,当APB的预分频系数为1时,其倍频器设置为1,否则倍频器设置为2。这意味着即使APB分频,定时器的时钟速度仍可以保持较高。 在STM32中,如果独立看门狗(IWDG)被启动,内部低速振荡器(LSI)会被强制打开,并且无法关闭。一旦LSI开始工作,其时钟将供给IWDG使用,确保看门狗的正常运行。 在北斗伪距多路径分析及单点定位解算中,精确的时钟系统至关重要。PLLCLK的2分频可以调整系统时钟频率,适应不同的计算和通信需求。伪距测量涉及接收卫星信号与本地时钟之间的时差,多路径效应会导致信号的反射和干扰,影响定位精度。通过精确的时钟管理和PLL配置,可以提高伪距测量的准确性和定位解算的可靠性。 STM32神舟系列开发板,如神舟I号,提供了丰富的硬件资源,包括STM32F103RBT6微控制器和2.8英寸TFT触摸彩屏,为开发者提供了一个理想的平台,用于学习和实践STM32的相关技术,包括时钟系统的配置和应用在导航定位中的实践。 理解STM32的时钟系统和PLLCLK的配置对于高效地利用该微控制器及其在北斗导航系统中的应用至关重要。开发者需要熟悉RCC寄存器的配置,掌握时钟使能和预分频设置,以优化性能并减少功耗,同时在实际项目中解决多路径效应带来的挑战。

void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1; RCC_OscInitStruct.PLL.PLLN = 8; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /** * @brief I2C1 Initialization Function * @param None * @retval None */ static void MX_I2C1_Init(void) { /* USER CODE BEGIN I2C1_Init 0 */ /* USER CODE END I2C1_Init 0 */ /* USER CODE BEGIN I2C1_Init 1 */ /* USER CODE END I2C1_Init 1 */ hi2c1.Instance = I2C1; hi2c1.Init.Timing = 0x10707DBC; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } /** Configure Analogue filter */ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { Error_Handler(); } /** Configure Digital filter */ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { Error_Handler(); } GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); // 配置 I2C1_SCL 引脚 GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF6_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF6_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN I2C1_Init 2 */ /* USER CODE END I2C1_Init 2 */ }这个是什么意思需要修改添加代码吗

2023-07-15 上传