STM32开发 -- 低功耗模式详解(1)

53 篇文章 1204 订阅 ¥19.90 ¥99.00

如需转载请注明出处:https://juyou.blog.csdn.net/article/details/95364296

很多单片机都有低功耗模式,STM32 也不例外。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗。
这部分不是我负责,但是也是有必要看一下的。

参看:
STM32F1开发指南-库函数版本_V3.2.pdf
STM32中文参考手册_V10.pdf

一、低功耗模式

在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

STM32有三种低功耗模式:
睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)
停止模式(所有的时钟都已停止)
待机模式(1.8V电源关闭)
在这里插入图片描述
此外,在运行模式下,可以通过以下方式中的一种降低功耗:
降低系统时钟
在运行模式下,通过对预分频寄存器进行编程&#x

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F4系列的自旋锁是通过设置特定的寄存器来实现的。在STM32F4中,可以使用内置的DWT(Data Watchpoint and Trace)模块来实现自旋锁。DWT模块可以用来监控程序执行时间,从而实现自旋锁。 在使用自旋锁之前,需要先初始化DWT模块。具体的初始化代码如下: ``` void spin_lock_init(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } ``` 在上述代码中,首先将Core Debug模块使能,然后启用DWT模块的计数器。 接下来,可以使用以下代码来实现自旋锁的加锁和解锁操作: ``` void spin_lock(volatile uint32_t* lock) { while (__ldrex(lock) == 1); __strex(1, lock); } void spin_unlock(volatile uint32_t* lock) { __strex(0, lock); } ``` 在上述代码中,spin_lock函数会一直循环检查lock指向的变量是否为1,如果是1,则说明锁已经被其他线程占用,当前线程需要一直等待。如果lock指向的变量是0,则将其设置为1,表示当前线程占用了锁。 spin_unlock函数则是将lock指向的变量设置为0,表示当前线程释放了锁。 需要注意的是,自旋锁是一种非阻塞锁,如果其他线程一直占用锁,当前线程会一直循环等待,这会导致CPU占用率过高。因此,在使用自旋锁时,应该根据具体应用场景来选择合适的锁类型。同时,在STM32F4中,还可以使用信号量和互斥锁等更加高级的锁机制来解决多线程同步问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聚优致成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值