STM32
直播中

张波

7年用户 1384经验值
私信 关注
[问答]

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

回帖(1)

王燕

2024-4-28 18:05:32
从你的描述来看,问题可能出现在以下几个方面:

1. **不同库的兼容性问题**:HAL库和标准库在某些方面可能存在不兼容的情况,这可能导致跳转失败。尽管有些朋友表示他们成功地混合使用了这两种库,但这并不意味着在所有情况下都能成功。建议尽量使用同一种库来避免潜在的兼容性问题。

2. **中断向量表设置位置**:在HAL库中设置中断向量表的位置可能与标准库不同。通常,在HAL库中,中断向量表的设置应该在程序的开始部分,即在`main()`函数之前。这样可以确保在程序启动时,中断向量表已经被正确设置。

3. **IROM起始地址和大小设置**:确保你为IROM设置了正确的起始地址和大小。如果这些参数设置不正确,可能导致跳转失败。

4. **跳转地址**:检查你设置的跳转地址是否正确。确保跳转地址指向了app程序的入口点,即`main()`函数的地址。

5. **编译器和链接器设置**:检查你的编译器和链接器设置,确保它们正确地处理了IAP升级和中断向量表的设置。

为了解决这个问题,你可以尝试以下步骤:

1. **使用相同的库**:尽量使用相同的库(HAL库或标准库)来编写boot和app程序,以避免兼容性问题。

2. **检查中断向量表设置**:确保在HAL库中正确设置了中断向量表,并将其放置在程序的开始部分。

3. **检查IROM设置**:确保IROM的起始地址和大小设置正确。

4. **检查跳转地址**:确保跳转地址正确指向app程序的入口点。

5. **检查编译器和链接器设置**:确保编译器和链接器设置正确,以便正确处理IAP升级和中断向量表的设置。

6. **调试和测试**:使用调试工具逐步执行程序,观察跳转过程中的寄存器和内存状态,以便找到可能的问题所在。

通过以上步骤,你应该能够找到问题所在并解决跳转失败的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分