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


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


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

另在hal库里设置中断向量表,到底应该在哪个位置?看原子的标准库教程,是在main函数一开始就设。
而看hal库的官方例程,是在HAL_Init()和SystemClock_Config()之后,有个注释说需要加,但已经在system_stm32f1xx.c里改了。

int main(void)
{
  /* STM32F103xG HAL library initialization:
       - Configure the Flash prefetch
       - Systick timer is configured by default as source of time base, but user 
         can eventually implement his proper time base source (a general purpose 
         timer for example or other time source), keeping in mind that Time base 
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and 
         handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
     */
  HAL_Init();
  /* Configure the system clock to 72 MHz */
  SystemClock_Config();
  
  /* Set the Vector Table base location at 0x08004000 
    (this is already done in system_stm32f1xx.c file) */ 
  
  /* Add your own code here...    
    */
  /* Initialize Leds mounted on STM3210E-EVAL RevD board */
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED2);

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

已邀请:

yup1983

赞同来自:

两种库肯定是能混着用的,毕竟最终编译执行的是二进制代码。先按照原子的方法,全用HAL库,把boot和app都弄通了,就明白了。不过我最近做在线升级也遇到了一点问题,是更新cube之后产生的,所以建议你用cube4.27或以前的版本来生成工程。

要回复问题请先登录注册