硬汉嵌入式论坛

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

[BOOT/IAP] STM32H7编写bootloader程序中使用printf函数无法跳转

[复制链接]

3

主题

5

回帖

14

积分

新手上路

积分
14
发表于 昨天 15:53 | 显示全部楼层 |阅读模式
使用printf程序无法跳转,使用HAL_UART_Transmit就没问题,已勾选MicroLIB,大佬遇到过没?
1.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 昨天 16:13 | 显示全部楼层
1、调试下,看看是跳转到到APP卡了,还是在当前BOOT就卡了
2、另外楼主的prinf底层重定向怎么写的
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 昨天 16:21 | 显示全部楼层
eric2013 发表于 2025-9-25 16:13
1、调试下,看看是跳转到到APP卡了,还是在当前BOOT就卡了
2、另外楼主的prinf底层重定向怎么写的

1、代码如下, 可以执行到app_jump(); 应该是卡在APP里面了
[C] 纯文本查看 复制代码
/**
 * @brief   bootloader跳转函数
 * @param   app_addr:app程序入口指针
 * @retval  无
 */
void jump_to_app(uint32_t app_addr)
{
    uint32_t i=0;
	void (*app_jump)(void);         /* 声明一个函数指针 */
    /* 关闭开启的外设 */
    HAL_QSPI_MspDeInit(&hqspi);
    HAL_UART_MspDeInit(&huart8);
    
    
    /* 关闭全局中断 */
    __disable_irq();

    
    /* 设置所有时钟到默认状态,使用HSI时钟 */
	HAL_RCC_DeInit();
    RCC->CR &= ~(RCC_CR_PLLON);     /* 确保 PLL 关闭(可选) */
    while (RCC->CR & RCC_CR_PLLRDY);
    
	/* 关闭滴答定时器,复位到默认值 */
	SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    
    /* 关闭所有中断,清除所有中断挂起标志 */
	for (i = 0; i < 8; i++)
	{
		NVIC->ICER[i] = 0xFFFFFFFF;
		NVIC->ICPR[i] = 0xFFFFFFFF;
	}
    
    /* 清理并关闭Cache */
    SCB_InvalidateICache(); 
    SCB_DisableICache(); 
    SCB_DisableDCache();     
    
    
    /* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)app_addr);
    app_jump = (void (*)(void)) (*((uint32_t *) (app_addr + 4)));
    
    /* 设置为特权级模式,使用MSP指针 确保App从干净的(特权模式+MSP)环境启动 */
    __set_CONTROL(0);

    /* 跳转到系统BootLoader */
    __DSB();
    __ISB();
    app_jump();
    
    /* 跳转成功的话,不会执行到这里 */
	while (1)
	{
        
	}
}

2、代码如下,并勾选MDK的MicroLIB
[C] 纯文本查看 复制代码
#include <stdio.h>
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart8, (uint8_t *)&ch, 1, 2);
	return ch;
}
int fgetc(FILE *f){
	uint8_t ch = 0;
	HAL_UART_Receive(&huart8, &ch, 1, 2);
	return ch;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 7 小时前 | 显示全部楼层
lsksp 发表于 2025-9-25 16:21
1、代码如下, 可以执行到app_jump(); 应该是卡在APP里面了
[mw_shl_code=c,true]/**
* @brief   boot ...

不仅要调用这个HAL_UART_MspDeInit

重要的是调用那个DeInit UART
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 19:31 , Processed in 0.041806 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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