当前位置: 首页 > news >正文

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备

STM32CubeMX v6.11.1
STM32CubeIDE v1.15
STM32CubeProgrammer v2.16.0
STM32MP13xx参考手册
STM32MP13勘误手册
STM32MP135AD数据手册
正点原子stm32MP135开发板

1 确认时钟源

本例使用的时钟源均由外部晶振提供,分别是24MHz的HSE、32.768KHz的LSE。原理图如下:

在这里插入图片描述
在这里插入图片描述
STM32MP135AD数据手册对HSE、LSE的描述如下:
LSE:
在这里插入图片描述
HSE:
在这里插入图片描述

2 使用STM32CubeMX生成RCC初始化代码

2.1 使能HSE、LSE

在这里插入图片描述

2.2 修改RCC时钟树

本例以HSE倍频后的PLL1P作为MPU的主频为999MHz,如果使用HSI的话可以设置到正好1GHz。为了保证时钟源的精度,这里牺牲1MHz频率选择HSE。
在这里插入图片描述
按照上图指示完成步骤1、2,然后在3框内输入999即可自动得出合适的配置。
其余的时钟我们暂时没用到,配置如下:
在这里插入图片描述

2.3 生成初始化代码

在这里插入图片描述
在方框内输入工程名,然后点击生成代码即可。

3 修改STM32CubeMX生成的RCC初始化代码

3.1 初始化前去初始化RCC

STM32CubeMX生成的RCC初始化代码并不能直接使用,参考官方初始化RCC操作,我们需要在初始化RCC前去初始化RCC,也就是在RCC初始化前加上HAL_RCC_DeInit(),完整代码如下:

void SystemClock_Config(void)
{
#if !defined(USE_DDR)HAL_RCC_DeInit();RCC_OscInitTypeDef RCC_OscInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = 16;RCC_OscInitStruct.HSIDivValue = RCC_HSI_DIV1;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLL12SOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 2;RCC_OscInitStruct.PLL.PLLN = 83;RCC_OscInitStruct.PLL.PLLP = 1;RCC_OscInitStruct.PLL.PLLQ = 2;RCC_OscInitStruct.PLL.PLLR = 2;RCC_OscInitStruct.PLL.PLLFRACV = 2048;RCC_OscInitStruct.PLL.PLLMODE = RCC_PLL_FRACTIONAL;RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL2.PLLSource = RCC_PLL12SOURCE_HSE;RCC_OscInitStruct.PLL2.PLLM = 2;RCC_OscInitStruct.PLL2.PLLN = 62;RCC_OscInitStruct.PLL2.PLLP = 3;RCC_OscInitStruct.PLL2.PLLQ = 2;RCC_OscInitStruct.PLL2.PLLR = 2;RCC_OscInitStruct.PLL2.PLLFRACV = 4096;RCC_OscInitStruct.PLL2.PLLMODE = RCC_PLL_FRACTIONAL;RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL3.PLLSource = RCC_PLL3SOURCE_HSE;RCC_OscInitStruct.PLL3.PLLM = 2;RCC_OscInitStruct.PLL3.PLLN = 50;RCC_OscInitStruct.PLL3.PLLP = 3;RCC_OscInitStruct.PLL3.PLLQ = 2;RCC_OscInitStruct.PLL3.PLLR = 2;RCC_OscInitStruct.PLL3.PLLRGE = RCC_PLL3IFRANGE_1;RCC_OscInitStruct.PLL3.PLLFRACV = 0;RCC_OscInitStruct.PLL3.PLLMODE = RCC_PLL_INTEGER;RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}
#endif
}

这里有个USE_DDR的宏定义,如果用户程序是在DDR中运行的,则不能再初始化时钟避免DDR异常。

3.2 添加一个LED闪烁观察是否初始化成功

RCC初始化如果异常则会进入Error_Handler函数,这是一个死循环:

void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}

本例在RCC初始化后加上一个LED闪烁死循环,如果LED能够闪烁起来则说明RCC初始化成功。相关代码如下:

static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* USER CODE BEGIN MX_GPIO_Init_1 *//* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOI_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOI, GPIO_PIN_3, GPIO_PIN_RESET);/*Configure GPIO pin : PI3 */GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);/* USER CODE BEGIN MX_GPIO_Init_2 *//* USER CODE END MX_GPIO_Init_2 */}

主函数完整代码如下:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_Delay(500);HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_3);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

4 烧录测试

这里有一个小技巧,如果我们的程序是在SYSRAM中运行的,不需要使用调试工具,直接将板子设置为USB/UART启动,然后将我们的用户程序直接烧写到SYSRAM中即可看到实验现象。下图就是本例使用的烧录配置:
在这里插入图片描述
只需要下载用户程序(记得加上stm32头标识)即可。
实验现象:
请添加图片描述

可以看到LED灯闪烁了起来,说明我们已经将主频设置到了999MHz,完成了RCC初始化!

相关文章:

  • XX食品有限公司智能制造汇报材料(71页PPT)
  • Claude3 注册及升级教程(包含封号解决方法)
  • VBA即用型代码手册:删除空列Delete Empty Columns
  • Docker面试整理-如何进行Docker镜像的构建和发布?
  • Matlab笔记
  • 3072. 将元素分配到两个数组中 II
  • tkinter 下拉列表框Combobox控件
  • SpringCloud 前端-网关-微服务-微服务间实现信息共享传递
  • 【网络安全】跨站脚本攻击漏洞—HTML前端基础
  • “手撕”二叉树的OJ习题
  • Vue-插槽 Slots
  • 全方位·多层次·智能化,漫途水库大坝安全监测方案
  • idea常用设置
  • 第四章-决策树
  • 用人工智能写2024年高考作文
  • angular2开源库收集
  • iOS编译提示和导航提示
  • Js基础——数据类型之Null和Undefined
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node 版本过低
  • node-glob通配符
  • PAT A1017 优先队列
  • Selenium实战教程系列(二)---元素定位
  • STAR法则
  • 阿里云Kubernetes容器服务上体验Knative
  • 第2章 网络文档
  • 欢迎参加第二届中国游戏开发者大会
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 入门到放弃node系列之Hello Word篇
  • 小程序button引导用户授权
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​configparser --- 配置文件解析器​
  • ​Python 3 新特性:类型注解
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #AngularJS#$sce.trustAsResourceUrl
  • #大学#套接字
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)c52学习之旅-简单了解单片机
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (黑马点评)二、短信登录功能实现
  • (回溯) LeetCode 131. 分割回文串
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)Dubbo快速入门、介绍、使用
  • (自用)网络编程
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *p++,*(p++),*++p,(*p)++区别?
  • .equals()到底是什么意思?
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别