Hi Jeremy,
there are multiple reasons for hard faults on Cortex-M, the most common ones are trying to write to a read only location, or access a peripheral which is not clocked.
Another reason exists for the Kinetis series: there is a memory boundary at address 0x2000'0000. Technically, the SRAM is segmented and not continuous. If using FreeRTOS or any other kind of application you are not allowed to place objects across this memory boundary, otherwise you very likely will run into a hard fault too. The problem is described in Using Multiple Memory Regions with the FreeRTOS Heap | MCU on Eclipse (check out the discussions on that article too). If you want to use the memory in both memory segments, then have a read here: Using Multiple Memory Regions with the FreeRTOS Heap | MCU on Eclipse.
What worked for me best to detect the location of a hard fault is using software or hardware trace or a custom hard fault interrupt handler, see Debugging Hard Faults on ARM Cortex-M | MCU on Eclipse .
I hope this helps,
Erich