打印
[应用相关]

STM32L476RCT6单片机刚上电就进入停止模式

[复制链接]
302|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2024-7-10 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
系统初始化之后进入停止模式,使用rtc中断5分钟唤醒一次停止模式,断电前进入停止模式的话,上电后直接处于停止模式,没有执行初始化部分的代码。不是应该先进行初始化操作码?非常疑惑。

使用特权

评论回复
沙发
yiy| | 2024-7-13 22:44 | 只看该作者
可能是因为电源恢复后立即进入停止模式,并且没有正确配置唤醒流程。

使用特权

评论回复
板凳
yiy| | 2024-7-13 22:44 | 只看该作者
1. 电源恢复时的复位流程
当电源恢复时,STM32L476RCT6 应该首先进行复位,然后才会进入用户代码执行初始化。如果上电后立即进入停止模式,可能是因为复位没有正确触发或代码流程中有问题。

2. 检查复位原因
你可以通过检查复位原因寄存器(RCC_CSR)来确定单片机是因为哪种复位事件启动的。这样可以帮助你理解为什么初始化代码没有执行。

使用特权

评论回复
地板
yiy| | 2024-7-13 22:45 | 只看该作者
uint32_t reset_cause = RCC->CSR;
if (reset_cause & RCC_CSR_SFTRSTF) {
    // 软件复位
} else if (reset_cause & RCC_CSR_WDGRSTF) {
    // 看门狗复位
} else if (reset_cause & RCC_CSR_LPWRRSTF) {
    // 低功耗复位
} else if (reset_cause & RCC_CSR_PORRSTF) {
    // 电源复位
} else if (reset_cause & RCC_CSR_PINRSTF) {
    // 引脚复位
}
// 清除复位标志
RCC->CSR |= RCC_CSR_RMVF;

使用特权

评论回复
5
yiy| | 2024-7-13 22:45 | 只看该作者
3. 检查初始化代码的位置
确保初始化代码在主函数的最开始部分执行,并且没有任何条件或中断会阻止其运行。尤其要确保进入低功耗模式的代码不是在初始化代码之前执行。
int main(void) {
    // 初始化代码
    HAL_Init();
    SystemClock_Config();
    // 其他初始化代码

    while (1) {
        // 主循环
    }
}

4. 停止模式配置
检查停止模式的配置是否正确,确保进入停止模式前所有必要的初始化已经完成。可以在进入停止模式之前打印一些调试信息来确保初始化代码已经执行。

5. RTC 中断配置
检查 RTC 中断配置,确保 RTC 中断能够正确唤醒 MCU 并恢复正常运行。
void RTC_Wakeup_Init(void) {
    // 配置 RTC 唤醒中断
    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x7FFF, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {
    // RTC 唤醒中断回调函数
}

使用特权

评论回复
6
yiy| | 2024-7-13 22:46 | 只看该作者
你先试试上述解决方式。

使用特权

评论回复
7
sj8zw8| | 2024-7-27 14:56 | 只看该作者
初始化代码没有被跳过或被错误配置为条件编译。

使用特权

评论回复
8
sj8zw8| | 2024-7-27 14:56 | 只看该作者
在停止模式下,RTC 可以保持运行并设置中断以唤醒 MCU。系统在从停止模式恢复后,通常会从复位向量开始执行初始化代码。

使用特权

评论回复
9
LOVEEVER| | 2024-7-28 13:37 | 只看该作者
是不是又相关的配置问题导致相关参数复位导致问题发生

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1976

主题

6882

帖子

9

粉丝