硬汉嵌入式论坛

 找回密码
 立即注册
查看: 448|回复: 9
收起左侧

[STM32H7] STM32H7芯片中使用FREERTOS,在启动RTOS前,使用系统HAL_Delay()函数实现延时功能,程序会一直卡死在HAL_Delay()中

[复制链接]

8

主题

57

回帖

81

积分

初级会员

积分
81
发表于 2025-7-18 17:22:25 | 显示全部楼层 |阅读模式
目前使用STM32H7做开发遇到如下问题:
1、使用了freertos,
2、需要程序从bootloader跳转到app
3、app启动MX_FREERTOS_Init();和osKernelStart();前,rtos调度前有一些外设初始化,初始化外设时,调用了HAL_Delay();
4、在每次芯片重新上电后,进入app程序时,一直会卡死在HAL_Delay函数中。
跳转功能函数:
[C] 纯文本查看 复制代码
uint32_t i = 0;
void (SysMemBootJump)(void); / 声明一个函数指针 /
__IO uint32_t BootAddr =
APPLICATION_ADDRESS; / STM32H7的系统BootLoader地址 */

/* 关闭全局中断 */
DISABLE_INT();

/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;

/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit();

/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++) {
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}

/* 使能全局中断 */
ENABLE_INT();

/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 /
SysMemBootJump = (void ()(void))(*((uint32_t *)(BootAddr + 4)));

/* 设置主堆栈指针 /
__set_MSP((uint32_t *)BootAddr);

/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
__set_CONTROL(0);

/* 跳转到系统BootLoader */
SysMemBootJump();

/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
while (1) {
}


回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-7-18 18:03:45 | 显示全部楼层
直接用freeRTOS延时就行了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-7-18 18:04:22 | 显示全部楼层
你可以直接使用free rtos的延时
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-18 19:22:34 | 显示全部楼层
改进下,进入任务里面后初始化外设。
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2025-7-18 20:07:44 | 显示全部楼层
将hal定时器改为其它定时器,不要使用systick即可。
cubemx支持修改。
回复

使用道具 举报

8

主题

57

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2025-7-21 15:57:40 | 显示全部楼层
感谢各位的解答,问题解决了,从bootloader跳转到app时,在bootloader中增加HAL_DeInit()的调用后,跳转后再启动rtos前可以正常使用HAL_Delay()做延时功能。
回复

使用道具 举报

6

主题

44

回帖

62

积分

初级会员

积分
62
发表于 2025-7-26 00:46:40 | 显示全部楼层
你Hal库的心跳给给了吗?一般情况下会在开一个tim中断在里面取tick
回复

使用道具 举报

8

主题

57

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2025-7-28 08:51:20 | 显示全部楼层
money7110 发表于 2025-7-26 00:46
你Hal库的心跳给给了吗?一般情况下会在开一个tim中断在里面取tick

是的,有给
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 5 天前 | 显示全部楼层
这个原理是HAL_Delay使用systick中断,常规配置systick的中断优先级为15,因此会有systick不能进入中断,因此就会卡死,需要把systick的中断优先级高,这样就不会卡死。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 23:51 , Processed in 0.042506 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表