时钟开关:不用的外设,把它的时钟关掉,省电!

短文标题: 时钟开关:不用的外设,把它的时钟关掉,省电!

你有没有想过一个问题:单片机里那么多外设(USART、SPI、I2C、TIM...),如果没用上,它们费电吗?费。 只要有时钟,外设电路就在工作------即使你没用它。省电的方法很简单:把它的时钟关掉。

**那个"时钟树"的分层(对应教程2.6节),**ARM32的时钟树分三层:

  • AHB:CPU、内存、DMA、SDIO、FSMC...
  • APB2:SPI1、USART1、ADC1、GPIOA-E、TIM1/8...
  • APB1:USART2/3、I2C1/2、SPI2/3、TIM2-7、WWDG、PWR...

每层总线上挂着不同的外设。每个外设都有自己的时钟开关。

**那个"时钟使能"寄存器(对应教程2.7节),**RCC(复位与时钟控制)模块提供了时钟使能寄存器:

  • RCC_AHBENR:AHB总线外设时钟使能
  • RCC_APB2ENR:APB2总线外设时钟使能
  • RCC_APB1ENR:APB1总线外设时钟使能

每个外设占用一个bit。

// 使能USART1时钟(APB2)

RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

// 关闭USART1时钟

RCC->APB2ENR &= ~RCC_APB2ENR_USART1EN;

一个bit,控制一个外设的"死活"。那个"默认"的状态 ,复位后,大部分外设的时钟是关闭 的。这就是为什么教程中强调:**使用外设前,必须先使能它的时钟。**不使能时钟,写寄存器没用------因为外设根本没通电(时钟不通)。

__HAL_RCC_USART1_CLK_ENABLE(); // HAL库写法

这是初学者最容易忘的一步。那个"功耗"的账 ,一个外设的电流可能只有几百μA到几mA。但多个外设加起来,功耗可观。电池供电的设备(如手环、传感器),每个μA都要精打细算。不用的外设,时钟关掉------零成本省电。

那个"调试"时的注意, 调试时如果把某个外设的时钟关了,但代码还在读写它的寄存器。结果:总线一直等待,程序卡死(或进HardFault)。关闭时钟前,确保该外设已不再使用。那个"低功耗模式"的配合, 进入STOP模式前,硬件会自动关闭大部分外设的时钟。但从STOP唤醒后,时钟恢复,外设状态保持。如果你在STOP前关了时钟,唤醒后要重新使能。低功耗设计,时钟管理是基本功。

这个故事的启示, 为什么外设不用时要关时钟?因为只要有时钟,电路就在切换电平,就在耗电 。时钟关了,电路静态,功耗几乎为0。不用的外设,别给它"通电"(时钟)。

写在最后, 下次你写代码,初始化外设前,检查一下时钟使能了吗?结束后,如果不再用了,把时钟关掉。一个bit,省电从细节做起。


(本文灵感源于于振南《新新概念ARM32单片机》教程第2.6节"总线架构与时钟分层"和第2.7节"时钟开关:外设功耗的控制",感谢作者将低功耗设计的底层逻辑讲得如此通透。)


如果您觉得这个故事对您有启发,欢迎点赞、转发,让更多工程师看到这个藏在时钟开关背后的"省电"智慧。

相关推荐
不悔哥2 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20162 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子2 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡2 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5552 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡3 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9663 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛3 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅3 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员3 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程