完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
我创建了一个测试项目,用于在设备通过 UART 接收数据时从停止模式唤醒设备。 我从 /STM32Cube/Repository/STM32Cube_FW_L5_V1.3.1/Projects/STM32L562E-DK/Examples/UART/ 提供的“UART_WakeUpFromStopUsingFIFO”移植了代码 STM 的示例项目按预期工作。设备进入停止模式并在收到数据时唤醒。 但是,我的测试项目不工作。 更多信息: 1. 该项目是为STM32L562 MCU 创建的。 2.测试板为L562-DK 3. 如果配置了 USART 1,LED GREEN 在我的项目中不会打开。 4. 从 STOP 模式唤醒不起作用。 5. 当我禁用代码进入停止模式 (SystemClock_Config_fromSTOP()) 并在从停止模式唤醒后配置系统时钟 (SystemClock_Config_fromSTOP()) 时,通过 UART 接收字节正在工作。使用 USART 1。 我已将我的项目附加到 zip 文件中。 你能告诉我,如何解决吗? 谢谢 |
|
相关推荐
1个回答
|
|
我已经下载了您的项目,在 nucleo-L552ZE-Q 上对其进行了测试,并且能够找出问题的根本原因。
在从 SystemClock_Config_fromSTOP() 调用的 HAL_RCC_OscConfig() 中第一次从 STOP 唤醒后,执行会卡住。 等待 RCC_CR_PLLRDY 的 while 循环以超时结束,因为此标志从未设置。 然后执行转到 Error_Handler()。 原因是在 RCC_OscInitStruct 中传递了错误的 PLL 参数,特别是 RCC_OscInitStruct->PLL->PLLM 在您的情况下为 1。 给定配置的正确值为 4。 RCC_OscInitStruct 值是通过调用函数 HAL_RCC_GetOscConfig() 获得的,这是 SystemClock_Config_fromSTOP() 的前一步。 STM32 可以使用 MSI 或 HSI 时钟源从 STOP 模式唤醒。如果应用随后使用不同的时钟设置(例如使用外部时钟源或 PLL),则必须在唤醒后重新配置时钟树(这就是调用 SystemClock_Config_fromSTOP() 的原因)。 在您的项目中,内部 HSI RC 16 MHz 振荡器用作唤醒源,请参见 main(): /* 指定 HSI 作为从停止模式唤醒后使用的时钟源 */ __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); 在 SystemClock_Config_fromSTOP() 中,PLL 打开,HSI 配置为 PLL 源。 但是,当我检查用于初始时钟配置(在 main() 开始时调用)的 SystemClock_Config() 时, 使用不同的内部振荡器,即 MSI。它用作 PLL 源,所有 PLL 参数都相应设置。 然后,当您通过调用 SystemClock_Config_fromSTOP() 中的函数 HAL_RCC_GetOscConfig() 获取 RCC_OscInitStruct 值时, 你得到的是 MSI 的值而不是 HSI 的值(所以错误的 PLL 配置值)! 然后将这些传递给 HAL_RCC_OscConfig(&RCC_OscInitStruct)。 此配置(PLLSource = HSI、PLLM = 1、PLLN = 55、PLLR = 2)导致 PLL 生成的频率为 440 MHz,远高于 CPU 的最大值。频率 110 兆赫。 使用正确的配置(PLLSource = HSI,PLLM = 4,PLLN = 55,PLLR = 2),产生的频率为 110 MHz(因此 CPU 最大值)。 有几种方法可以解决这个问题,例如: 1) 在 HAL_RCC_OscConfig(&RCC_OscInitStruct) 调用之前的 SystemClock_Config_fromSTOP() 中添加以下行: RCC_OscInitStruct.PLL.PLLM = 4; 2) 重写 SystemClock_Config() 函数以使用 HSI 代替 MSI 并设置以上参数 PLLSource = HSI, PLLM = 4, PLLN = 55, PLLR = 2(优选方案)。 当然,这是最大的。CPU频率110MHz,如果想使用更低的频率,可以调整数值。 我还建议在 main() 的开头添加以下两行: DBGMCU->CR &= ~DBGMCU_CR_DBG_STOP; DBGMCU->CR &= ~DBGMCU_CR_DBG_STANDBY; 这将在 STOP 和 STANDBY 模式下禁用调试。一些 IDE 会自动启用此功能,之后设备将由于 SysTick 中断而从 STOP 模式唤醒(前提是 SysTick 已激活且其中断已启用)。应用此配置可能需要重启。 您可以在调试期间在 DBGMCU->CR 中检查这些值。但这是一个不同的故事。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2725 浏览 1 评论
3237 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1807 浏览 1 评论
3646 浏览 6 评论
6034 浏览 21 评论
1336浏览 4评论
197浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
442浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
273浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:45 , Processed in 1.251877 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号