打印
[STM32F4]

STM32 CPU reset 再启动,触发中断HardFault

[复制链接]
1112|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32 只进行了CPU复位,从 Reset_Handler再从启动,只要触发中断, 立即进入 HardFault  PC=0x00000000

大侠知道为什么吗?

使用特权

评论回复
沙发
sonicll| | 2021-3-25 10:37 | 只看该作者
中断向量表地址有变化吗?

使用特权

评论回复
板凳
xiaofei558008|  楼主 | 2021-3-25 17:42 | 只看该作者
sonicll 发表于 2021-3-25 10:37
中断向量表地址有变化吗?

肯定有的,不同人写的代码,放在flash 不同的地方;

使用特权

评论回复
地板
sonicll| | 2021-3-25 19:15 | 只看该作者
xiaofei558008 发表于 2021-3-25 17:42
肯定有的,不同人写的代码,放在flash 不同的地方;

那很有可能是内核的SCB->VTOR寄存器跟实际的中断向量表没有对应上

使用特权

评论回复
5
xiaofei558008|  楼主 | 2021-3-30 14:13 | 只看该作者
本帖最后由 xiaofei558008 于 2021-4-1 18:00 编辑

现在问题是DeInit了各个外设(USART,TIM, CAN ,SPI等),结果CoreReset进入Bootloader之后,在跳回App,要么一直在DMA中断里,要么外设CAN通信不上(CAN的寄存器配置完全一样);求大侠帮助;
是否还有啥操作不正确的;

代码如下:


  /* Reset TIMs.
  */
  HAL_TIM_Base_DeInit(&htim2);
  HAL_TIM_Base_DeInit(&htim3);
  HAL_TIM_Base_DeInit(&htim4);
  HAL_TIM_Base_DeInit(&htim5);
  HAL_TIM_Base_DeInit(&htim6);

  /* Reset UARTS.
  */
  LL_USART_DeInit(USART1);
  LL_USART_DeInit(USART6);
  HAL_UART_DeInit(&huart2);
  HAL_UART_DeInit(&huart3);
  HAL_UART_DeInit(&huart5);

  /* Reset SPI.
  */
  HAL_SPI_DeInit(&hspi1);

  /* ## Reset CAN1.
  */
  HAL_CAN_DeInit(&hcan1);
  HAL_CAN_DeInit(&hcan2);

  /* Reset DMA.
  */
  HAL_DMA_DeInit(&hdma_tim4_ch2);
  HAL_DMA_DeInit(&hdma_tim5_ch1);
  HAL_DMA_DeInit(&hdma_uart5_rx);
  HAL_DMA_DeInit(&hdma_uart5_tx);
  HAL_DMA_DeInit(&hdma_usart2_rx);
  HAL_DMA_DeInit(&hdma_usart2_tx);
  HAL_DMA_DeInit(&hdma_usart3_rx);
  HAL_DMA_DeInit(&hdma_usart3_tx);


  DMA1->HIFCR |= 0x0f7d0f7d;
  DMA1->LIFCR |= 0x0f7d0f7d;

  DMA2->HIFCR |= 0x0f7d0f7d;
  DMA2->LIFCR |= 0x0f7d0f7d;

  /* Stop Systick.
  */
  SysTick->CTRL = 0X00;
  SysTick->LOAD = 0;
  SysTick->VAL = 0;

  /* Clear all IRQ enable bits & Penfing Flag.
  */
  for(uint8_t index = 0; index < 8; index ++)
  {
    NVIC->ICER[index] = 0xFFFFFFFF;
    NVIC->ICPR[index] = 0xFFFFFFFF;
  }

  /* Reset Clock.
  */
  HAL_RCC_DeInit();

  /* Disable IRQs.
  */
  __set_FAULTMASK(1);

  /* Only CoreReset.
  */
  __DSB();

  SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
                (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                SCB_AIRCR_VECTRESET_Msk);

  __DSB();






使用特权

评论回复
6
xiaofei558008|  楼主 | 2021-4-6 14:24 | 只看该作者
最近问题应该解了;

需要操作RCC的寄存器,把外设在App跳转之前全部关一遍;




使用特权

评论回复
7
xiaofei558008|  楼主 | 2021-4-6 14:27 | 只看该作者



把RCC寄存关一遍(RESET一遍外设),貌似问题解决了,不会出现莫名其妙的DMA中断等问题;



使用特权

评论回复
8
两只袜子| | 2021-4-6 16:52 | 只看该作者
楼主很厉害啊,这么快就解决了

使用特权

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

本版积分规则

136

主题

956

帖子

13

粉丝