OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7093|回复: 10

BootLoader跳转app,app卡在串口中断初始化处

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
发表于 2021-1-25 14:34:20 | 显示全部楼层 |阅读模式
我的芯片是stm32f103vct6
我在BootLoader中使用了串口2和串口5  

void Uart2Init(void)
{
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

                GPIO_InitTypeDef GPIO_InitStructure;

        //UART2ê±Öó       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Rx (PD.06) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

                USART_InitStructure.USART_BaudRate = 115200;//156250;
                USART_InitStructure.USART_WordLength = USART_WordLength_8b;
                USART_InitStructure.USART_StopBits = USART_StopBits_1;
                USART_InitStructure.USART_Parity = USART_Parity_No ;
                USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       
                USART_InitStructure.USART_Mode = USART_Mode_Rx;// | USART_Mode_Tx;
                USART_Init(USART2, &USART_InitStructure);  

                        //ê1Äü½óêÕ·¢ËíÖD¶Ï       
                USART_Cmd(USART2, ENABLE);
                USART_ITConfig(USART2, USART_IT_TC, ENABLE);
                USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

        //Çå·¢Ëííê3é±ê¼Çλ
    USART_ClearITPendingBit(USART2, USART_IT_TC);

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
       
}

void Uart5Init(void)
{
                GPIO_InitTypeDef GPIO_Initstrue2; //¶¨òåGPIO½á11ìå
                USART_InitTypeDef USART_Initstrue2; //¶¨òå′®¿ú2½á11ìå                                                                                                                                    
                NVIC_InitTypeDef NVIC_Initstrue2; //¶¨òåÖD¶Ï2Îêy
       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //ê1ÄüA¿úê±Öó
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);  //ê1Äü′®¿ú2ê±Öó
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
                GPIO_Initstrue2.GPIO_Pin = GPIO_Pin_12; //ÅäÖÃ′®¿ú5μÄtx
                GPIO_Initstrue2.GPIO_Mode = GPIO_Mode_AF_PP; //Îa¸′óÃíÆíì       
                GPIO_Initstrue2.GPIO_Speed = GPIO_Speed_50MHz; //ê±Öó50mhz
                GPIO_Init(GPIOC,&GPIO_Initstrue2); //D′èë
               
                GPIO_Initstrue2.GPIO_Pin = GPIO_Pin_2; //ÅäÖÃ′®¿ú5μÄrx
                GPIO_Initstrue2.GPIO_Mode = GPIO_Mode_IN_FLOATING; //Îa¸¡¿Õêäèë
                GPIO_Init(GPIOD,&GPIO_Initstrue2); //D′èë
               
       
                USART_Initstrue2.USART_BaudRate = 115200; //2¨ìØÂê115200
                USART_Initstrue2.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ó2¼tá÷¿ØÎT
                USART_Initstrue2.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //·¢Ëí½óêÕê1Äü
                USART_Initstrue2.USART_Parity = USART_Parity_No; //ÎTÆæżD£Ñé
                USART_Initstrue2.USART_StopBits = USART_StopBits_1; //í£Ö1λ1
                USART_Initstrue2.USART_WordLength = USART_WordLength_8b; //óDD§êy¾Y°Ëλ
                USART_Init(UART5,&USART_Initstrue2); //′®¿ú3õê¼»ˉ
                USART_Cmd(UART5,ENABLE); //
               
                USART_ITConfig(UART5,USART_IT_RXNE,ENABLE); //ê1Äü′®¿ú½óêÕÖD¶Ï
                USART_ITConfig(UART5, USART_IT_TC, ENABLE);
                USART_ClearITPendingBit(UART5, USART_IT_TC);
       
                NVIC_Initstrue2.NVIC_IRQChannel = UART5_IRQn; //ÖD¶Ïí¨μàéèÖÃÎa′®¿ú5
                NVIC_Initstrue2.NVIC_IRQChannelCmd =  ENABLE; //¿aÆôÖD¶Ïí¨μà
                NVIC_Initstrue2.NVIC_IRQChannelPreemptionPriority = 3;//éèÖÃÖD¶ÏóÅÏ輶Îa1
                NVIC_Initstrue2.NVIC_IRQChannelSubPriority = 3;  //éèÖÃ×óóÅÏ輶Îa1
                NVIC_Init(&NVIC_Initstrue2);
}


void USART2_IRQHandler(void)
{
        //RX
    if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
                {
                                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                                ComData2.ucRxBuf[ComData2.uiRxEndIndex] = USART_ReceiveData(USART2);
                                ComData2.uiRxEndIndex++;
                                if(ComData2.uiRxEndIndex >= ComRxBufferSize)
                                {
                                                ComData2.uiRxEndIndex = 0;
                                }
                                ComData2.uiRxReadyFlag = 0;
                                ComData2.uiRxTimeOut   = 0;                          
                }
                USART_ClearFlag(USART1,USART_FLAG_TC);
                //TX
                if(USART_GetITStatus(USART2, USART_IT_TC) == SET)
                {
                                USART_ClearITPendingBit(USART2, USART_IT_TC);
                                //·¢Ëííê±Ïí£Ö1·¢Ëí
                                if(ComData2.uiTxStartIndex == ComData2.uiTxEndIndex)
                                {
                //                     USART2->CR1 &= ~USART_Mode_Tx;  
                                                ComData2.uiTxReadyFlag = 1;
                                }
                                        //·¢Ëíêy¾Y
                                else
                                {
                                                USART2->DR = ComData2.ucTxBuf[ComData2.uiTxStartIndex];
                                                                ComData2.uiTxStartIndex++;
                                                if(ComData2.uiTxStartIndex >= ComTxBufferSize)
                                                {
                                                                ComData2.uiTxStartIndex = 0;
                                                }
                                }  
                }
        //RX over
                if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
    {
        (void)USART_ReceiveData(USART2);
    }
}

void UART5_IRQHandler()
{
                //RX
    if(USART_GetITStatus(UART5, USART_IT_RXNE) == SET)
                {
                                u8 Rxd;
                                u16 clear=clear;
                                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                                Rxd = USART_ReceiveData(UART5);
                                if(USART_RX_CNT<USART_REC_LEN)
                                {
                                                USART_RX_BUF[USART_RX_CNT]=Rxd;
                                                USART_RX_CNT++;                                                                                                      
                                }
                                ComData5.ucRxBuf[ComData5.uiRxEndIndex] = USART_ReceiveData(UART5);
                                ComData5.uiRxEndIndex++;
                                if(ComData5.uiRxEndIndex >= ComRxBufferSize)
                                {
                                                ComData5.uiRxEndIndex = 0;
                                }

                                ComData5.uiRxReadyFlag = 0;
                                ComData5.uiRxTimeOut   = 0;       
                }
               
                USART_ClearFlag(USART1,USART_FLAG_TC);
                //TX
                if(USART_GetITStatus(UART5, USART_IT_TC) == SET)
                {
                                USART_ClearITPendingBit(UART5, USART_IT_TC);
                                //·¢&#203;ííê±&#207;í£&#214;1·¢&#203;í
                                if(ComData5.uiTxStartIndex == ComData5.uiTxEndIndex)
                                {
                //                     USART2->CR1 &= ~USART_Mode_Tx;  
                                                ComData5.uiTxReadyFlag = 1;
                                }
                                        //·¢&#203;íêy&#190;Y
                                else
                                {
                                                UART5->DR = ComData5.ucTxBuf[ComData5.uiTxStartIndex];
                                                                ComData5.uiTxStartIndex++;
                                                if(ComData5.uiTxStartIndex >= ComTxBufferSize)
                                                {
                                                                ComData5.uiTxStartIndex = 0;
                                                }
                                }  
                }
        //RX over
                if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) != RESET)
    {
        (void)USART_ReceiveData(UART5);
    }
}


我在APP中使用了串口123和5,可以跳转到app但是程序会卡在app中的串口初始化处。如果我把app中的串口初始化屏蔽,程序是能都正常执行的,但是不屏蔽程序会卡在串口初始化的位置上。部分主程序
pOS_mbox_Uart1Rx = 0;

          QualityDispComm = 1;
       
    UartTaskNum = 0;
    MemEdit = 0;
    QualitySendFlag = 0;
       
                NVIC_SetVectorTable(FLASH_BASE, 0x10000);中断向流量表
                //SCB->VTOR = FLASH_BASE | OffsetAddress; /* Vector Table Relocation in Internal FLASH. *//*system_stm32f10x.c×¢òa*/

                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é ·&#214;2×é
                LED_Init();

                OS_CPU_SysTickInit();                                 //   /* Initialize the SysTick.  
    BSPInit();               


我如果把BootLoader和app合在一起烧写入芯片程序是好用的,app正常运行,我发现是我在执行升级的时候,BootLoader会使用串口,然后app就不好使了!希望大神帮我看看
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2016-4-29
在线时间
266 小时
发表于 2021-1-26 09:04:16 | 显示全部楼层
跳转到APP之前,在Bootloader中复位串口,关中断,清除中断标志,试试看
回复 支持 反对

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-26 11:58:58 | 显示全部楼层
__set_FAULTMASK(1);                //关闭所有中断
跳转之前关中断试试
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-26 13:40:03 | 显示全部楼层
asshole 发表于 2021-1-26 11:58
__set_FAULTMASK(1);                //关闭所有中断
跳转之前关中断试试

按照你说的  试过了  但是还是不行   只要我执行升级   跳转到app就会死在中断初始化上  不执行升级  就是好用的   
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-26 13:44:20 | 显示全部楼层
asshole 发表于 2021-1-26 11:58
__set_FAULTMASK(1);                //关闭所有中断
跳转之前关中断试试

__disable_irq();
                                USART_ITConfig(USART2, USART_IT_TC, DISABLE);
                                USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
                                USART_ITConfig(UART5, USART_IT_TC, DISABLE);
                                USART_ITConfig(UART5, USART_IT_RXNE, DISABLE);
                                                               
                                SysTick->CTRL = 0;
                                SysTick->LOAD = 0;
                                SysTick->VAL = 0;
                                for (i = 0; i < 8; i++)
                                {
                                                NVIC->ICER=0xFFFFFFFF;
                                                NVIC->ICPR=0xFFFFFFFF;
                                }
                                INTX_DISABLE();
                                __set_FAULTMASK(1);
                                //USART_DeInit(USART1);
                                USART_DeInit(USART2);
                                //USART_DeInit(USART3);
                                USART_DeInit(UART5);
                                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //ó&#195;&#187;§′ú&#194;&#235;&#199;&#248;μú&#182;t&#184;&#246;×&#214;&#206;a3ìDò&#191;aê&#188;μ&#216;&#214;·(&#184;′&#206;&#187;μ&#216;&#214;·)               
                                MSR_MSP(*(vu32*)appxaddr);                                        //3&#245;ê&#188;&#187;ˉAPP&#182;&#209;&#213;&#187;&#214;&#184;&#213;&#235;(ó&#195;&#187;§′ú&#194;&#235;&#199;&#248;μ&#196;μúò&#187;&#184;&#246;×&#214;ó&#195;óú′&#230;·&#197;&#213;&#187;&#182;¥μ&#216;&#214;·)
                                jump2app();                                                                        //ì&#248;×aμ&#189;APP.

我在BootLoader跳转之前做了这些操作   能用的基本都用了
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-26 13:47:50 | 显示全部楼层
d1z1y2 发表于 2021-1-26 09:04
跳转到APP之前,在Bootloader中复位串口,关中断,清除中断标志,试试看

复位串口还需要怎么复位呢   我现在基本能够做的操作  都做了 啊
回复 支持 反对

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-26 14:47:01 | 显示全部楼层
真的没有那么多事儿呀,我当时搞IAP的时候 ,app程序里面用了2个串口,1个48,两个定时器,还有看门狗,没什么问题的
就app程序: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000);        //重定位中断向量表地址
app跳转bootloader的时候有这两句  __set_FAULTMASK(1);                //关闭所有中断          NVIC_SystemReset();                //系统复位

其他的就很普通了,我什么都没动
bootloader跳转app:  
  1. if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
  2.                         {
  3.                                 JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
  4.                                 Jump_To_Application = (pFunction) JumpAddress;
  5.                                 __set_MSP(*(__IO uint32_t*) ApplicationAddress);
  6.                                 Jump_To_Application();
  7.                         }
复制代码
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-27 13:17:48 | 显示全部楼层
asshole 发表于 2021-1-26 14:47
真的没有那么多事儿呀,我当时搞IAP的时候 ,app程序里面用了2个串口,1个48,两个定时器,还有看门狗,没 ...

我试了好多次  跳转之前该关闭的都关闭了   升级完  跳转到app  就会死在串口初始化   
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2016-4-29
在线时间
266 小时
发表于 2021-1-28 08:37:32 | 显示全部楼层
仿真跟踪一下,是哪一条代码卡住 了
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-28 14:24:00 | 显示全部楼层
d1z1y2 发表于 2021-1-28 08:37
仿真跟踪一下,是哪一条代码卡住 了

只有执行下载的时候   跳转到app  会卡在app串口初始化   如果同时将两个程序下载进去  是能够正常运行的  
回复 支持 反对

使用道具 举报

7

主题

14

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2022-10-13
在线时间
9 小时
发表于 2023-5-8 22:44:31 来自手机 | 显示全部楼层
我也是这个问题,手动下载两个程序,嘎嘎能跳转app运行,用iap下载app然后跳转过去,马上卡死。请问楼主解决了吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 09:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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