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

配置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波形,发现恨我吗预计的是可以的,我们最终给他修复完成。

http://www.rkmt.cn/news/193709.html

相关文章:

  • 【Linux命令大全】001.文件管理之umask命令(实操篇)
  • YOLOFuse多模态检测优势解析:低光、烟雾场景下的精度突破
  • 全链路压测中的数据隔离:关键策略与实践挑战
  • YOLOFuse markdown表格美化插件推荐
  • 【Linux命令大全】001.文件管理之which命令(实操篇)
  • 让游戏更真实的物理引擎,助力你的VR应用!
  • 云原生应用性能监控与测试一体化实践
  • 每日互动(个推)用户运营便捷的平台助力头部直播APP智能预测用户流失倾向,用户留存提升15%
  • [Windows] 视频剪辑编辑软件中文绿色版ShotCut v25.12.31
  • YOLOFuse是否支持视频流输入?可通过修改infer_dual.py实现
  • RBAC角色权限控制系统:多用户协作场景下的必要配置
  • YOLOFuse网盘直链下载助手推荐:快速分发大体积镜像文件
  • YOLOFuse你尝试预览的文件可能有害?安全提示与信任设置
  • YOLOFuse计费模式透明:按秒计费无隐性消费
  • YOLOFuse支持JavaScript调用吗?Node.js与Python通信方案
  • Linux .ko字符串驱动模块
  • YOLOFuse vs DEYOLO:多模态检测模型性能与资源消耗全面对比
  • YOLOFuse术语表整理:统一技术词汇翻译标准
  • YOLOFuse训练脚本train_dual.py使用说明及参数配置建议
  • YOLOFuse英文文档改进:提升国际影响力的关键一步
  • YOLOFuse豆瓣小组讨论:非技术向用户也能参与
  • Linux .ko字符串驱动模块编写
  • 东方博宜OJ 2142:福布斯富豪排行榜 ← 结构体 + 结构体排序
  • 2025年度盘点:国内喷淋塔除尘器口碑排行榜,静电除尘器/水帘除尘器/滤筒除尘器喷淋塔除尘器直销厂家排行 - 品牌推荐师
  • YOLOFuse API封装示例:构建RESTful接口供前端调用
  • YOLOFuse CSDN博客同步更新:中文开发者首选平台
  • YOLOFuse实战教程:如何在复杂环境下提升检测精度?
  • YOLOFuse高并发处理能力:支持千级请求同时响应
  • YOLOFuse培训课程预告:线上直播讲解高级用法
  • 导师推荐10个AI论文软件,自考毕业论文格式规范必备!