Вы хотите дать указатель p2 while (кроме NULL).
Но здесь вы устанавливаете это значение не для самого указателя, а для памяти, на которое оно указывает.
*ps2 = (void *)src_address;
И это указывает на .... ну ничего, это нулевой указатель (адрес 0 недействителен).
Используя *, вы получаете доступ (или настройку) к значению, на которое указывает указатель. Поэтому вам нужно удалить *, чтобы изменить сам указатель.
ps2 = (void *)src_address;
Или даже лучше:
ps2 = (uint32_t*)src_address;
Затем, чтобы прочитать значение с этого адреса:
uint32_t value = *ps;