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

stm32l071cbtx IAP跳转到app后无法feed iwdg

[复制链接]
zhaokai3000 提问时间:2020-8-7 14:30 /
项目通过stm32cubeide创建,boot looder部分目前为了测试,进入main函数后直接跳转到app(此时未初始化任何中断、外设):

  1. /* USER CODE BEGIN 1 */
  2.         uint16_t boot_flag;

  3. //boot_flag = readBootFlag();
  4.         //for debug
  5.         boot_flag = BOOT_FLAG_RUNAPP;
  6.         if (boot_flag == BOOT_FLAG_RUNAPP)
  7.         {
  8.     JumpToApp();
  9.         }
  10.   /* USER CODE END 1 */
  11.   
复制代码
bootloader的JumpToApp函数实现:
  1. void JumpToApp(void)
  2. {
  3.     if (((*(__IO uint32_t *)APP_BASE_ADDR)&0x2ffe0000) == 0x20000000)
  4.     {
  5.         JumpToApplication = (pFunction)(*(__IO uint32_t *)(APP_BASE_ADDR+4));
  6.         __disable_irq();
  7.         __set_MSP(*(__IO uint32_t *)APP_BASE_ADDR);
  8.         JumpToApplication();
  9.     }
  10. }
复制代码


app部分修改system_stm32l0xx.c里面VECT_TAB_OFFSET宏为app部分在flash中的位置,主函数主要如下:
  1. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  2.   HAL_Init();

  3.   /* USER CODE BEGIN Init */

  4.   /* USER CODE END Init */

  5.   /* Configure the system clock */
  6.   SystemClock_Config();

  7.   /* USER CODE BEGIN SysInit */
  8.   __enable_irq();
  9.   /* USER CODE END SysInit */

  10.   /* Initialize all configured peripherals */
  11.   MX_GPIO_Init();
  12.   MX_DMA_Init();
  13.   MX_IWDG_Init();               //注释掉就没问题,加上后程序跑到main loop后循环几次后就会reset
  14.   MX_LPUART1_UART_Init();
  15.   MX_USART2_UART_Init();
  16.   /* USER CODE BEGIN 2 */

  17.   /* USER CODE END 2 */



  18.   /* Infinite loop */
  19.   /* USER CODE BEGIN WHILE */
  20.   printf("app enter main loop...\n");
  21.   while (1)
  22.   {
  23.     delay_us(100000);
  24.     /* USER CODE END WHILE */

  25.     /* USER CODE BEGIN 3 */
  26.     printf("%lu\n", HAL_GetTick());
  27.     HAL_IWDG_Refresh(&hiwdg);
  28.   }
  29.   /* USER CODE END 3 */
复制代码


boot启动后跳转到app没问题,发现app部分,只要初始化了IWDG,主循环里面的打印打印了几次后,程序就会reset,主循环里面有喂狗的代码但是感觉不起作用;要是app里面不初始化IWDG,就运行正常。
收藏 评论6 发布时间:2020-8-7 14:30

举报

6个回答
陌路夕颜 回答时间:2020-8-13 09:33:11
IWDG的超时时间是多少,主循环的运行时间是不是与IWDG的超时时间相近

评分

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

查看全部评分

小小超 回答时间:2020-8-13 10:45:47
超时没喂狗?喂狗时间多少?看主函数的延时时间比较长

评分

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

查看全部评分

butterflyspring 回答时间:2020-8-19 17:06:21
测试一下主循环执行的时间,是不是最长的时间接近或者超过了看门狗的时间
奏奏奏 回答时间:2020-8-19 19:10:26
我刚好项目中也有bootloader
测试发现:
如果bootloader先初始化独立看门狗IWDG后,再跳转APP,而且APP里面没有初始化看门狗,就会像LZ这样不断重启
我给出的建议(解决方案)是:bootloader里面可以初始化独立看门狗,但要在跳转APP后面的顺序(就是说如果无法跳转到APP被迫留在bootloader中运行才开启独立看门狗),如果目的是APP运行阶段防止死机,对策是到了APP才初始化独立看门狗
原因是我在bootloader中 开启独立看门狗的用途是串口OTA(在线升级)过程中如果出现死机能够恢复到APP中运行,而不是说是APP运行阶段防止死机
zhaokai3000 回答时间:2020-8-21 17:20:38
奏奏奏 发表于 2020-8-19 19:10
我刚好项目中也有bootloader
测试发现:
如果bootloader先初始化独立看门狗IWDG后,再跳转APP,而且APP里面 ...

谢谢回复!
我之前的做法就是在bootloader的最开始就做了跳转app的操作,如果没能跳转app,后面才会做各种初始化操作。但是app用到iwdg,还是会异常重启。

后来我想着死马当活马医,在跳转app之前,调用了HAL_DeInit(),发现居然好了,而我在跳转app前都没有做init操作。。
zhaokai3000 回答时间:2020-8-21 17:27:29
butterflyspring 发表于 2020-8-19 17:06
测试一下主循环执行的时间,是不是最长的时间接近或者超过了看门狗的时间 ...

没有超过看门狗时间的,我看门狗时间设置的1.5秒,bootloader进入main后直接跳转app,app的main循环中也打印了一些后才重启,时间看起来确实和iwdg设置的时间匹配。

所属标签

相似问题

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