Controller Resets after Enabling Cache
I suspect what happens is that your cache is uninitialized, which means it could contain any garbage - including valid addresses and invalid instructions. There's typically a little bit of metadata also indicating whether the data is valid, and this is what you need to reset - typically there's an invalidation operation for the cache. Do this before enabling the cache, and it should start fetching rather than executing noise. A second reason to invalidate code cache is if you just wrote some code, i.e. in a JIT compiler or self-modifying code; then invalidating specific ranges typically works.

Other than that, once running, there's rarely a reason to repeat invalidation. Data caches may need to be flushed, however, to interact with other memory accesses (DMA, bus masters, or possibly memory mapped devices).

The linked reference manual contains relevant information in section 5.4.3, Cache Coherency and Invalidation. Note that while it's just a single bit to invalidate the whole cache, this operation takes a long time to complete.