Programming any MCU with basic C/C++ means starting at the reset vector. Within the manufactures SDK that often is taken care of with some assembly, but it can be done with pure C.
on a Cortex-M you can, I don't think it is always possible
The amount of assembly needed is often only a few lines to a dozen lines or so, though: setting up the stack and such, nothing complicated or weird. With GCC and Clang-based toolchain, you can even compile the assembly sources using the same frontend (
gcc or
clang) with same compiler options, because they invoke the toolchain assembler for
.s files (preprocessed assembly sources) and
.S files (assembly sources that need preprocessing via toolchain
cpp). Or you can invoke the assembler directly (typically
as in these toolchains) in your build machinery; I use
Makefiles, others prefer
cmake. Even IDEs tend to use one or the other "behind the scenes". So, it's not an issue in real life, at least with these toolchains.
It's the black-box/magic register setup without comments, explanations, or any documentation, that one might see in an SDK that is annoying. That stuff can easily be done in C after setting up the stack, especially if you know what and why it is being done. (Others have told me that manufacturers' and vendors' SDKs don't have much of that nowadays, but I haven't checked.)