硬汉嵌入式论坛

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

在bootloader 跳转到app程序

[复制链接]

22

主题

22

回帖

88

积分

初级会员

积分
88
发表于 2021-3-11 09:54:03 | 显示全部楼层 |阅读模式
bootloader能够正常跳转到app程序,然后app程序在不触发中断的条件下,程序能够正常运行,但是一旦触发串口中断,程序就死掉了,有没有大佬可以解惑一下
回复

使用道具 举报

22

主题

22

回帖

88

积分

初级会员

积分
88
 楼主| 发表于 2021-3-11 10:34:47 | 显示全部楼层
我在app程序开头增加了 这三行代码   
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
    SCB->VTOR = FLASH_BASE | 0x4000;
    ENABLE_INT();
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2021-3-11 17:38:22 | 显示全部楼层
你上次的问题解决了吗
回复

使用道具 举报

22

主题

22

回帖

88

积分

初级会员

积分
88
 楼主| 发表于 2021-3-11 20:16:32 | 显示全部楼层
eric2013 发表于 2021-3-11 17:38
你上次的问题解决了吗

我感觉这个问题 就是上次的问题。一直都没有解决
回复

使用道具 举报

22

主题

22

回帖

88

积分

初级会员

积分
88
 楼主| 发表于 2021-3-12 16:22:50 | 显示全部楼层
在程序的开头加了以下代码  还是没有进入中断
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);       
    SCB->VTOR = FLASH_BASE | 0x4000;
    ENABLE_INT();
    __enable_irq();//开启总中断
回复

使用道具 举报

22

主题

22

回帖

88

积分

初级会员

积分
88
 楼主| 发表于 2021-3-12 16:40:16 | 显示全部楼层
只要不在bootloader中配置串口二,程序跳转完全没问题,app程序运行也没有问题,但是一但配置串口二,app程序就进不去中断
回复

使用道具 举报

22

主题

22

回帖

88

积分

初级会员

积分
88
 楼主| 发表于 2021-3-12 21:07:00 | 显示全部楼层
/*
*********************************************************************************************************
*        函 数 名: u2_printf
*        功能说明: 蓝牙发送数据
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void ble_printf(char* fmt,...)  
{  
        u16 i,j;
    uint8_t  TXBUF[128];
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)TXBUF,fmt,ap);
        va_end(ap);
        i = strlen((const char*)TXBUF);                //此次发送数据的长度

        for (j = 0; j < i; j++)                                                        //循环发送数据
        {
            while (USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET); //循环发送,直到发送完毕   
                USART_SendData(USART2,TXBUF[j]);
        }   
}       



最终找到问题处在了自己写的这个函数这里 ,调用串口二发送数据,然后串口二的USART_FLAG_TC标志位 一直都没有清除
事实上我在bootloader中调用
/*
*********************************************************************************************************
*        函 数 名: JumpToApp
*        功能说明: 跳转到app
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void JumpToApp(void)
{
        uint32_t i=0;

    HAL_UART_DeInit(&huart1);
    HAL_UART_DeInit(&huart2);
    HAL_UART_MspDeInit(&huart2);
    HAL_UART_MspDeInit(&huart1);
    __HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_TC);

    HAL_DeInit();
        __set_PRIMASK(1);        /* 禁止全局中断 */

        /* 关闭滴答定时器,复位到默认值 */
        SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
   
//    SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; /* Disable SysTick Timer */
   
        /* 设置所有时钟到默认状态,使用HSI时钟 */
        HAL_RCC_DeInit();

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

        __set_PRIMASK(0);        /* 使能全局中断 */

        /* 跳转到APP程序,首地址是MSP,地址+4是复位中断服务程序地址 */
        JumpToApplication = (void (*)(void)) (*((uint32_t *) (APPLICATION_ADDRESS + 4)));

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

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

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

        }
}
的这个函数。反正后来改成了这个 就能正常跑了
void ble_printf(char* fmt,...)  
{  
        u16 i,j;
    uint8_t  TXBUF[128];
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)TXBUF,fmt,ap);
        va_end(ap);
        i = strlen((const char*)TXBUF);                //此次发送数据的长度
    comSendBuf(COM2,TXBUF,i);
}       
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 15:54 , Processed in 0.226812 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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