Не всегда hard fault ты словишь, если полезешь не в ОЗУ, flash или системную периферию.
Пробовал не раз что-то типа такого(с разными адресами):
*(uint32_t *)&0x12345=0x9876453;
не всегда HardFault ловил, хотя может случайно попадал в реализованные адреса? Чёрт его знает...