@nitin29 wrote:
It also talks about HSI and LSI RC Oscillators which have tolerances.
All oscillators have tolerances - whether external or internal.
The tolerances of external devices are, obviously, up to you - depending on what you specify, and the quality of your design.
The tolerances of the internal oscillators are specified in the datasheet; they are, indeed, "worse" that you could obtain with external devices.
@nitin29 wrote:
Now at page 27th, the datasheet talks about pinout and points to PC14-OSCX_IN and PC15-OSCX_OUT. !
Those can serve as IN and OUT for either the High-speed internal oscillator (4-48MHz) or the Low-speed internal oscillator (32kHz) - hence the 'X':

Elsewhere in the document, they are referred to as OSC32_IN/OUT when used for the 32kHz oscillator, and OSC_IN/OUT when used for the 4-48MHz oscillator:


@nitin29 wrote:
So, what crystal value I can use so I will not have issue? Will Arduino automatically detect what clock is used or it need a specific clock (HSI or HSE or LSI or LSE) to get it program?
I don't know what STM32Duino/Arduino requires or supports - you'd need to ask on the STM32Duino forum for that:
https://www.stm32duino.com/
But, in general, for reliable UART communication you certainly should be using a crystal. Choose one which allows you to generate standard baud rates (9600, 115200, etc) within acceptable errors.
PS:
@nitin29 wrote:
having programmed STM32F103C8 generic board (comes with 8 MHz and 32KHz crystal on board)
Note that the STM32F1 had separate pins for OSC_IN, OSC_OUT (4-16MHz) and OSC32_IN, OSC32_OUT (32kHz) :

The sharing of the OSCx_IN/OUT pins is quite a new feature.