news 2026/3/23 19:18:10

配置STM32F411CEU6的系统时钟-避免芯片内核锁死

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
配置STM32F411CEU6的系统时钟-避免芯片内核锁死

一.了解

我在尝试建立HAL库的时候使用的正点原子的sys.c的工程,结果出现芯片内核锁死的问题。究其原因是因为正点原子使用的是8M的晶振,就导致程序下进去就会锁死内核

这是正点原子的晶振,这是我的板载晶振。

这是我最小系统的晶振。所以我们只能重写sys.c和sys.h文件解决问题。

二.程序

1.sys.c

#include "sys.h" #include "stm32f4xx.h" /** * @brief STM32F411 对齐CubeMX配置:25M晶振→96MHz 系统时钟 * @param None * @note 1、完全匹配CubeMX参数:PLLM=25, PLLN=192, PLLP=2 → 96MHz * 2、保留超时兜底+时钟源顺序,永不卡死/GPIO乱跳 * 3、校准延时精准到500ms,兼容HAL_Delay */ void SystemClock_Config(void) { uint32_t timeout = 0xFFFFFFF; // 1. FLASH配置(96MHz必备) FLASH->ACR = FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_3WS; // 2. 复位RCC+超时兜底 RCC->CR |= RCC_CR_HSION; while((RCC->CR & RCC_CR_HSIRDY) == 0 && --timeout); if(timeout == 0) { Error_Handler(); } RCC->CFGR = 0x00000000; RCC->CR &= ~(RCC_CR_PLLON | RCC_CR_HSEON); RCC->CIR = 0x00000000; // 3. 使能25M晶振+超时兜底 timeout = 0xFFFFFFF; RCC->CR |= RCC_CR_HSEON; while((RCC->CR & RCC_CR_HSERDY) == 0 && --timeout); if(timeout == 0) { Error_Handler(); } if(timeout > 0) { // 4. 完全对齐CubeMX的PLL参数(关键!) RCC->PLLCFGR = 0x00000000; RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; // 先开时钟源(防失效) RCC->PLLCFGR |= 25; // ? CubeMX的PLLM=25 RCC->PLLCFGR |= (192 << 6); // ? CubeMX的PLLN=192 RCC->PLLCFGR |= (0 << 16); // ? CubeMX的PLLP=2(对应位00) RCC->PLLCFGR |= (4 << 24); // PLLQ=4(CubeMX默认) // 5. 使能PLL+超时兜底 timeout = 0xFFFFFFF; RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0 && --timeout); if(timeout == 0) { Error_Handler(); } if(timeout > 0) { // 6. 总线分频(CubeMX同款:AHB=1, APB1=2, APB2=1) RCC->CFGR |= RCC_CFGR_HPRE_DIV1; RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; // 7. 切PLL时钟源 RCC->CFGR |= RCC_CFGR_SW_PLL; while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); } } // 8. 校准延时:从400ms→500ms精准(只改这行!) SystemCoreClock = 96000000UL; // ? 校准值:25M晶振+CubeMX参数,完美匹配500ms SysTick->CTRL &= ~(1 << 2); // 清脏位 SysTick->CTRL |= (1 << 2); // 关8分频 HAL_SYSTICK_Config(SystemCoreClock / 1000); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } void Error_Handler(void) { __disable_irq(); while(1) {} }

2.sys.h

#ifndef __SYS__H #define __SYS__H #include "stm32f4xx.h" // STM32F4核心头文件 #include "stm32f4xx_hal.h" // HAL库基础定义(必须,因为用到__HAL_XXX宏) // 声明【CubeMX原生无修改】的系统时钟配置函数 void SystemClock_Config(void); // 声明报错函数(原代码里的调用,必须声明) void Error_Handler(void); #endif

三.晶振不起震

我最开始把正点原子的一个低功耗删去,程序也可以运行,但是使用的是内部低速时钟16Mhz,我发现我delay(500)ms实测只有130ms,我又开始继续修复,最终搞定了完整的版本,把时钟跑起来。我还进行了测试。

生成了四路PWM波形,发现恨我吗预计的是可以的,我们最终给他修复完成。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 22:06:32

YOLOFuse typora写博客引流策略:发布SEO优化文章吸引用户

YOLOFuse 多模态目标检测技术深度解析&#xff1a;基于双流融合的开箱即用解决方案 在智能安防、自动驾驶和夜间巡检等实际场景中&#xff0c;单一可见光&#xff08;RGB&#xff09;图像常常“力不从心”——低光照下细节模糊&#xff0c;烟雾遮挡时目标丢失&#xff0c;极端天…

作者头像 李华
网站建设 2026/3/16 9:40:52

YOLOFuse javascript FileReader读取本地图像上传

YOLOFuse 与 JavaScript FileReader&#xff1a;构建轻量级多模态目标检测系统 在智能安防、无人巡检和夜间监控等场景中&#xff0c;单一可见光图像常常因光照不足或环境遮挡而失效。如何让机器“看得更清”&#xff0c;尤其是在黑暗或烟雾弥漫的环境中&#xff1f;答案逐渐指…

作者头像 李华
网站建设 2026/3/13 19:57:03

YOLOFuse 百度地图API结合位置信息打标检测对象

YOLOFuse&#xff1a;融合红外与可见光的目标检测系统及其地理信息集成实践 在城市安防监控中心的大屏上&#xff0c;深夜的街道画面常常陷入一片漆黑——传统摄像头在低光照环境下几乎“失明”。而与此同时&#xff0c;边境巡逻无人机搭载的红外传感器却能清晰捕捉到热源移动。…

作者头像 李华
网站建设 2026/3/21 5:25:20

YOLOFuse typora数学公式渲染异常解决办法

YOLOFuse 数学公式渲染异常的根源与实战解决方案 在撰写多模态目标检测项目文档时&#xff0c;你是否曾遇到这样的尴尬&#xff1a;精心写好的 LaTeX 公式&#xff0c;在 Typora 里却显示为空白、乱码&#xff0c;甚至整段文字“失灵”&#xff1f;尤其是在描述 YOLOFuse 这类基…

作者头像 李华
网站建设 2026/3/12 21:31:53

YOLOFuse github镜像同步更新机制:保持代码最新状态

YOLOFuse 镜像同步机制与多模态检测实践 在复杂环境感知系统日益智能化的今天&#xff0c;单一视觉模态的局限性愈发明显。夜间监控中可见光图像模糊不清&#xff0c;烟雾遮挡下传统目标检测频频漏检——这些现实问题不断推动研究者探索更鲁棒的技术路径。正是在这样的背景下&a…

作者头像 李华
网站建设 2026/3/17 17:36:34

【Linux命令大全】001.文件管理之whereis命令(实操篇)

【Linux命令大全】001.文件管理之whereis命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统文件管理命令的全面汇总与深度优化&#xff0c;结合图标、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff01…

作者头像 李华