你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IAP升级,boot和app分别是用标准库和HAL库写的,跳转不成功。

[复制链接]
any012 提问时间:2018-12-14 11:57 /
悬赏10ST金币已解决
本帖最后由 any012 于 2018-12-14 15:01 编辑

在学IAP升级。
我写的app程序是用HAL库写的,设置了IROM的起始地址及大小,在程序开始后也设置了中断向量表偏移地址。
用我同事写好的boot程序(标准库写的,可以跳转到标准库写的app程序),结果发现跳转不到app程序。
我又下载了个硬石的例程里的HAL库写的boot程序,修改了app跳转的地址,结果发现,能用。
比较了下这两个程序里关于app跳转的这部分,差不多的。那么,问题出在哪里?
是不是不能混着用?我在qq群里问了下,有的朋友回复说这样用过,能行。

----------------------------------------------------------------------------------------

另在hal库里设置中断向量表,到底应该在哪个位置?看原子的标准库教程,是在main函数一开始就设。
而看hal库的官方例程,是在HAL_Init()和SystemClock_Config()之后,有个注释说需要加,但已经在system_stm32f1xx.c里改了。
  1. int main(void)
  2. {
  3.   /* STM32F103xG HAL library initialization:
  4.        - Configure the Flash prefetch
  5.        - Systick timer is configured by default as source of time base, but user
  6.          can eventually implement his proper time base source (a general purpose
  7.          timer for example or other time source), keeping in mind that Time base
  8.          duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  9.          handled in milliseconds basis.
  10.        - Set NVIC Group Priority to 4
  11.        - Low Level Initialization
  12.      */
  13.   HAL_Init();

  14.   /* Configure the system clock to 72 MHz */
  15.   SystemClock_Config();
  16.   
  17. <font color="red">  /* Set the Vector Table base location at 0x08004000
  18.     (this is already done in system_stm32f1xx.c file) */ </font>
  19.   
  20.   /* Add your own code here...   
  21.     */

  22.   /* Initialize Leds mounted on STM3210E-EVAL RevD board */
  23.   BSP_LED_Init(LED1);
  24.   BSP_LED_Init(LED2);
复制代码

官方的例程和硬石的例程,都是在System_Init()里修改中断向量表的,这应该是在进入main()函数前完成的。
而官方例程里留有设置中断向量表的注释,是在main()函数里,HAL_Init()和SystemClock_Config()之后。
我按以上两种方法设了,分别试了下,结果还不一样...
在System_Init()里修改中断向量表的,或一进入main()函数就修改。则标准库编写的boot程序跳转不到hal库编写的app程序。
如果在HAL_Init()和SystemClock_Config()之后设置中断向量表,好像进入了app程序,但有些不对,我是用定时器定时来反转Led灯的,结果led灯亮灭的频率不稳定。

最佳答案

查看完整内容

管它什么标准库HAL库,甚至自己的库,都是操作寄存器,最后编译的二级制文件没差别
收藏 1 评论12 发布时间:2018-12-14 11:57

举报

12个回答
any012 最优答案 回答时间:2019-1-12 16:59:18
本帖最后由 any012 于 2019-1-12 17:20 编辑

又有点进展,进来汇报一下。

我又重写了个简单的app程序,发现串口,led都正常。
和boot程序对比了下,发现,boot程序里用的是tim3并使能了中断,我原来的app程序没有用到tim3。而我后来实验的app程序用的是tim3并且使能了中断。则串口和led正常;
我把实验的app程序用的tim3改为tim6并使能中断。则app程序不正常;
app程序里使能了tim3但没有使能tim3中断,使能tim6中断,app程序不正常;
app程序里使能了tim3且使能了tim3中断,但没有添加TIM3的中断处理函数,tim6使能中断,app程序不正常;
app程序使能了tim3且使能中断且又中断处理函数,tim6使能中断,app正常运行;
app程序使能了tim3没有使能中断但有中断处理函数,tim6使能中断,app正常运行。

以上说的中断处理函数指的是:void TIM3_IRQHandler(void){};

猜测,boot程序里使能了Tim3中断,所以需要中断处理函数。虽然跳到app里了,但tim3仍会中断,因为没有中断处理函数,所以可能跳转到了错误的地方引起程序跑飞。
app程序里添加了中断处理函数,这可能就是个空函数,但中断后就不会跑飞了。
以上为个人猜测。

------------------------------------------------------------------------------------------

在boot程序里跳转前,关闭tim3中断。则app里不需要上述操作可正常运行。
总结:boot程序里打开的中断,要么在跳转前关掉,要么在app程序里有对应的中断处理程序。

-----------------------------------------------------------------------------------------------------------------

上次是先禁止TIM3中断,然后禁止TIM3,再清除TIM3的中断优先级。
现在又发现,直接禁止TIM3就可以。

  1. void Timer3_Close(void)
  2. {
  3. //        NVIC_InitTypeDef NVIC_InitStructure;
  4. //       
  5. //        TIM_ITConfig(TIM3, TIM_IT_Update ,DISABLE);                        //ʹÄÜ»òÕßʧÄÜÖ¸¶¨µÄTIMÖжÏ
  6.         TIM_Cmd(TIM3, DISABLE);

  7. //    NVIC_InitStructure.NVIC_IRQChannel      = TIM3_IRQn;
  8. //    NVIC_InitStructure.NVIC_IRQChannelCmd   = DISABLE;
  9. //    NVIC_Init(&NVIC_InitStructure);
  10. }
复制代码



STM1024 回答时间:2018-12-14 11:57:27
管它什么标准库HAL库,甚至自己的库,都是操作寄存器,最后编译的二级制文件没差别

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

david2016 回答时间:2018-12-14 12:14:33
NVIC Group你设置的是不是一样的?

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

any012 回答时间:2018-12-14 12:35:35
这个没注意过,会有影响吗?
以为只需要设置Irom和中断向量表偏移地址。
那么,还有哪些地方主要注意?
割れたリンゴ 回答时间:2018-12-14 22:25:01
  • APP程序要改向量表的OFFSET,这个在system_stm32f4xx.c的109行,改成如下形式。
  • #define VECT_TAB_OFFSET  0x40000 /* 你的偏移量 */

你可以参考一下我写的程序(验证过了)

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

zccdyfw 回答时间:2018-12-15 11:55:58
同问。。。。。。。。。。。。。希望楼主解决后分享一下
any012 回答时间:2018-12-30 09:01:25
部分解决了。
原boot程序的时钟是8M的,而我写的程序默认是72M的,这是出错的主要原因。
把BOOT程序改成72M后,可以跳转到APP程序。
除此,跳转到APP程序后,APP运行也不正常。发现有这些不同,原BOOT程序有看门狗程序,还有些GPIO引脚和我的APP管脚冲突。比如我的APP用到的CAN是用的复用引脚,而这些引脚在BOOT里是用作SPI的默认引脚的。
修改了以上问题后,APP貌似能正常运转了,能看到板上的LED灯正常闪烁了。但是不知为何GPIOE对应的灯不亮,现在想想,也许还是CAN不能正常接收。
any012 回答时间:2019-1-2 14:34:53
GPIOE的灯能正常亮了。
但进入到APP程序后,貌似不能正常响应CAN发送过去的命令了。
在BOOT程序里CAN能正常通信,也可以通过CAN更新APP程序。但一旦进入到APP程序里,CAN就不正常了...

在BOOT程序里,跳转到APP程序之前,关闭了CAN。然后在APP程序里重新初始化CAN的,也试了跳转之前不关闭CAN,跳转后CAN都不能正常工作。

现在BOOT程序的时钟也设到72M了,波特率设置和APP程序一样。但滤波器设置不一样。管脚都是重映射的,用的是PB8,PB9。还有个管脚接到了CAN收发器的STB管脚,不过上电后一直将该脚拉到低电平。
别的想不到有什么相关的设置了。
any012 回答时间:2019-1-19 09:26:47
david2016 发表于 2018-12-14 12:14
NVIC Group你设置的是不是一样的?

我觉得和nvic group设置没有关系吧,设置nvic group只是设置了中断响应的优先级。而各中断的地址是固定的。
any012 回答时间:2019-1-21 11:54:15
本以为一切都弄好了,结果又遇到了问题。
BOOT程序里原有独立看门狗,我调试时给关掉了,现在又打开了。然后在APP程序里喂狗。
一开始都是接着CAN设备,和其它设备通讯,正常。
偶然一次发现,上电时如果不接其它CAN设备,则看门狗复位了。
逐条屏蔽语句,发现是APP函数里while(1)前的打开CAN中断接收这一语句引起的,屏蔽掉就可以了。
但是,如果不用IAP工程,APP程序直接正常执行,从0X80000000执行。则不屏蔽这句,也不会引起看门狗复位。APP程序里重新打开了独立看门狗。

总结下来就是,如果上电时,使能CAN中断接收后,如果有CAN接收中断产生,则程序能正常运行下去,否则不知卡在那里引起了独立看门狗复位。
any012 回答时间:2019-1-21 14:57:46
解决了,原因是boot里出了开启了can接收中断外,还开起了can_sce中断。我在跳转到app前,只是关闭了can的接收中断,没关闭sce中断。
到了app程序后,一旦开启了can,则立刻产生了sce中断(也不知道为何会产生),然后就跳转到了某个位置,程序跑飞。
在app程序里也使能can_sce中断并添加中断处理函数,问题解决。或者在boot里,跳转app前,也关闭can_sce中断。

我就配合boot程序写个app程序,为何会遇到这么多问题啊...

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版