The stack location in RAM is almost always configurable through software. In your tool chain-specific linker script, there will be an area called .stack
or similar, which you can decide to place at a certain address, or give a certain size. This is only the memory mapping part though.
The first thing done in any start-up code is to set the stack pointer. It has to be done through assembler, since C has no means of directly writing to the stack pointer. On some cores like ARM, the stack pointer is set automatically by hardware out of reset, from a value that your linker script has placed in the vector table and programmed in flash.
So generally, the silicon vendor almost always leaves this completely to the programmer to decide. The core does specify if there's an up-counting or down-counting stack however. The most common by far is down-counting, but some oddball architectures have up-counting stacks (most famously PIC).
As for where the stack pointer is set, you'll find it very early on in the start-up code ("CRT"), if such code is delivered with your tool chain. Typically it takes a value obtained from the linker script, but you could as well hard-code it if you wish. It needs to be done before any C code is executed, since C loves to use the stack.
In case you write everything yourself, you should write to the stack pointer the first thing you do out of reset, from inside the reset vector.