Hard to tell without a buildable full example. Can you determine the address that is hard faulting, what is that code, and what are the registers at that point. Reading the USART shouldn't fault. If you read/write an unaligned word in memory, or access memory that isn't present it will also fault.
USART_ReceiveDat(USART2); should be USART_ReceiveData(USART2);
Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..