打印

精华帖--IAP FreeRtos 进入bootloader 进入中断程序司机,如何解决

[复制链接]
11834|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kmcfly|  楼主 | 2013-9-27 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kmcfly 于 2013-10-8 15:17 编辑

从FreeRtos 跳转进入到booloader模式,跳之前进入临界资源访问,相当于OS挂起,在bootloader模式若没有中断发生则运行正常,若有中断发生进入
HardFaultException();
若不加OS ,bootloader运行正常,加入OS 进入中断程序就挂了  !!!  
沙发
kmcfly|  楼主 | 2013-9-27 10:32 | 只看该作者

使用特权

评论回复
板凳
kmcfly|  楼主 | 2013-9-27 14:01 | 只看该作者

使用特权

评论回复
地板
kmcfly|  楼主 | 2013-9-27 15:16 | 只看该作者
现在改了一下BOOTLOADER的USART1的中断优先级,可以进入中断接受数据,但是等过一会,程序就进入
void HardFaultException(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }

这个函数 不知道怎么回事,????
}

使用特权

评论回复
5
kmcfly|  楼主 | 2013-9-27 15:38 | 只看该作者
而且两个分立的中断向量表,APP应该和bootloader互不影响才对啊 。。。。。。。。。

            
                                                     
                                                      
                                                      
                        [em:24:]                              [em:24:]
                        [em:24:] [em:24:] [em:24:] [em:24:]
            

使用特权

评论回复
6
wxweipot| | 2013-9-27 16:51 | 只看该作者
猜测还是中断向量表乱了

使用特权

评论回复
7
kmcfly|  楼主 | 2013-9-27 18:14 | 只看该作者
APP:
static void NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        #ifdef VECT_TAB_RAM
                //中断向量表从RAM起始地址开始
                NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else
                //中断向量表从FLASH起始地址开始
                NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3800);
        #endif
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //选择优先级组3   0----7抢占式优先级,从优先级0-1
        /*使能USART1中断*/
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;///2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /*使能USART2中断*/
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;///3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /*使能USART3中断*/
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;///3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       

        /*使能Timer2中断*/
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;///1;///1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;///1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /*使能Timer3中断*/
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;///1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        /*使能 RTC 中断*/
        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       

        /*使能 EXTI 中断*///PE5(speed) PD8(remote)
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;///4;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);               
}

BOOTLOADER:

void NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        #ifdef VECT_TAB_RAM
                //中断向量表从RAM起始地址开始
                NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else
                //中断向量表从FLASH起始地址开始
                NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
        #endif
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //选择优先级组0
        /*使能USART1中断*/
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

        /*使能Timer5中断*/
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


应该没有乱啊   

       

使用特权

评论回复
8
kmcfly|  楼主 | 2013-9-27 18:15 | 只看该作者
话说有点头疼了都

使用特权

评论回复
9
kmcfly|  楼主 | 2013-9-27 18:17 | 只看该作者
对了,还有重要的一点忘记说明了,用不带OS的APP 运行正常,加入OS后就运行一段时间就进入HardFaultException。。。。
跳转之前的操作如下:
{
taskENTER_CRITICAL();//访问临界区资源
vDiableAll();
__MSR_MSP(*(vu32*)IAP_ADDR);//stm32的第一个4bytes的地址存放的是SP
(*(void(*)(void))(*(vu32*)(IAP_ADDR+4)))();//第二个4bytes存放的是RESET的
}

使用特权

评论回复
10
cgm88888| | 2013-9-28 19:34 | 只看该作者
中断优先级太高

使用特权

评论回复
11
kmcfly|  楼主 | 2013-9-29 09:55 | 只看该作者
@cgm88888 :

你的意思是bootloader设置的优先级太高吗?  不高啊

主优先级分别是3和7

使用特权

评论回复
12
kmcfly|  楼主 | 2013-9-29 11:10 | 只看该作者
查看: 699|回复: 7     请教STM32 IAP FREERTOS 延时死机 。。? [复制链接]   未结帖(1)
  

ql1007 当前离线 最后登录2013-9-24在线时间125小时25分注册时间2008-5-26阅读权限30精华0积分193帖子63本月在线6小时30分.串个门加好友打招呼发消息.
ql1007

中级技术员

中级技术员, 积分 193, 距离下一级还需 107 积分
积分193帖子63本月在线6小时30分.专家等级:

结帖率:75%
电梯直达   1#
ql1007 发表于 2012-9-28 11:33:57 |只看该作者 |倒序浏览 回复 |返回版面 .请教个问题 我给大家描素下 我测试的现象

1.IAP下载成功 直接复位跳转到APP,APP延时 长延时死机,短延时第一个延时可以 第二个又死了,这个延时放置在中断向量映射前后都试过,在这个延时前系统没运行操作系统,只有个CPU初始化 ,CPU初始化仅仅是系统时钟配置 GPIO口设置没了。

2.我测过 IAP+个裸机程序 长延时 都没问题 但是+这个系统就有问题

3.我用官网的DEMO YMODEM协议下载这个APP,带系统的 长延时
没问题 没死机

4.我在跳转时做的处理 和DEMO 的处理是一样的,
            JumpAddress = *(__IO uint32_t*) (IAPAddress + 4); //把复位地址赋值给JumpAddress
           Jump_To_Application = (pFunction) JumpAddress;//初始化用户程序的堆栈指针
            __set_PSP(*(__IO uint32_t*) IAPAddress);
             __set_CONTROL(0);    //选择主堆栈指针MSP
            __set_MSP(*(__IO uint32_t*) IAPAddress);    //STM32 跳转,将主堆栈指针指向用户区域,堆栈
            Jump_To_Application();    // 付给PC指针

5.我怀疑过IAP是不是下载的问题 但是 换成裸机试过 长延时没问题啊 这就搞不明白了

已经想不出问题了 麻烦大家给看看
谢谢相关的

/**************************************************************************************/
我的问题和楼上的这个类似,不知道如何解决的。。。。。。。。。。

使用特权

评论回复
13
kmcfly|  楼主 | 2013-9-29 11:56 | 只看该作者
补充一点:跳转进入bootloader以后  单步运行可以,全速运行的话,立马司机。。。。

使用特权

评论回复
14
xxiao6130| | 2013-9-29 14:43 | 只看该作者

使用特权

评论回复
15
kmcfly|  楼主 | 2013-9-29 14:49 | 只看该作者
xxiao6130 发表于 2013-9-29 14:43

难道这个图片给我这问题一暗示?

使用特权

评论回复
16
kmcfly|  楼主 | 2013-9-29 16:12 | 只看该作者
真不知问题所在了  。。。

使用特权

评论回复
17
kmcfly|  楼主 | 2013-9-29 17:40 | 只看该作者
BOOTLOADER   中断DISABLE后 不会司机,中断 ENABLE 后 才会司机,。。。。

使用特权

评论回复
18
mmbs| | 2013-9-29 20:56 | 只看该作者
不太清楚的。

使用特权

评论回复
19
kmcfly|  楼主 | 2013-9-30 09:15 | 只看该作者
难道是?

使用特权

评论回复
20
zhangmangui| | 2013-9-30 10:22 | 只看该作者
kmcfly 发表于 2013-9-27 15:38
而且两个分立的中断向量表,APP应该和bootloader互不影响才对啊 。。。。。。。。。

             ...

这是什么意思啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

170

帖子

1

粉丝