Объясните логику работы дебаг или где-то закралась ошибка: stm32, atolic, gcc. Есть RAM функция прерывания вызываемая каждую 1 мсек: 
RAMFUNC void TIM6_DAC_IRQHandler(void)
{
  __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
  InnerTime_IncMsec();
}
В случае установки точки останова на InnerTime_IncMsec(); 
перед дебагом asm код получается 
          TIM6_DAC_IRQHandler:
20000f6a:   push    {r3, lr}
314         __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
20000f6c:   ldr     r3, [pc, #12]   ; (0x20000f7c <TIM6_DAC_IRQHandler+18>)
20000f6e:   ldr     r3, [r3, #0]
20000f70:   mvn.w   r2, #1
20000f74:   str     r2, [r3, #16]
315         InnerTime_IncMsec();
20000f76:   lsrs    r0, r0, #28
20000f78:   blx     r3
20000f7a:   pop     {r3, pc}
20000f7c:   strb    r0, [r4, #8]
20000f7e:   movs    r0, #0
20000f80:   asrs    r5, r2, #6
20000f82:   movs    r0, #0
И падает в hardfault.
Убираем точку останова ( все еще в дебаге ), перезапускаем, и приложение работает. asm код следующий:
          TIM6_DAC_IRQHandler:
20000f6a:   push    {r3, lr}
314         __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
20000f6c:   ldr     r3, [pc, #12]   ; (0x20000f7c <TIM6_DAC_IRQHandler+18>)
20000f6e:   ldr     r3, [r3, #0]
20000f70:   mvn.w   r2, #1
20000f74:   str     r2, [r3, #16]
315         InnerTime_IncMsec();
20000f76:   ldr     r3, [pc, #8]    ; (0x20000f80 <TIM6_DAC_IRQHandler+22>)
20000f78:   blx     r3
20000f7a:   pop     {r3, pc}
20000f7c:   strb    r0, [r4, #8]
20000f7e:   movs    r0, #0
20000f80:   asrs    r5, r2, #6
20000f82:   movs    r0, #0
Далее, выходим из дебага, удаляем точку останова. Дебажимся, доходит до main. Ставим точку останова и уже все норм:
          TIM6_DAC_IRQHandler:
20000f6a:   push    {r3, lr}
314         __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
20000f6c:   ldr     r3, [pc, #12]   ; (0x20000f7c <TIM6_DAC_IRQHandler+18>)
20000f6e:   ldr     r3, [r3, #0]
20000f70:   mvn.w   r2, #1
20000f74:   str     r2, [r3, #16]
315         InnerTime_IncMsec();
20000f76:   ldr     r3, [pc, #8]    ; (0x20000f80 <TIM6_DAC_IRQHandler+22>)
20000f78:   blx     r3
20000f7a:   pop     {r3, pc}
20000f7c:   strb    r0, [r4, #8]
20000f7e:   movs    r0, #0
20000f80:   asrs    r5, r2, #6
20000f82:   movs    r0, #0
Получается, что если точка останова стоит в RAM функции до дебага, получаем hardfault.
InnerTime_IncMsec() тоже RAM.