Sinusoidal wave output from a GPIO
Only dedicated DAC outputs could do this directly but for many purposes you could use a timer output pin in compare mode to generate pulse width modulation (PWM) and vary that in a sinusoidal fashion.  If the you then filter it (sometimes with nothing more than some series resistance and capacitance to ground) you can end up with a reasonable approximation to a sine wave for many purposes.

The greater the difference in frequency between the PWM repetition rate, and the desired sine wave frequency, the better the result you can achieve.

With either a DAC or PWM, you probably want to implement a Direct Digital Synthesizer to produce the amplitude values, at least if you need to vary the frequency or it is not a nice fraction of an available clock.  The DDS algorithm is described in this existing EESE answer (describing an audio application, but the technique is general)


  Most practical table based synthesizers use a fixed playback sample
  rate, and a fractional phase increment and accumulator register.
  
  Essentially, calculate the phase increment per sample period for your
  desired output frequency, and pre-multiply by a large power of two,
  say 1024 or even higher - with an ARM MCU you might as well just
  multiply it by 2^16.
  
  Each cycle add this phase increment to an accumulator register.
  
  The accumulator will be wider (have more precision) than the address
  input into your wave lookup table, so simply ignore the lower bits and
  use only as many upper bits as your lookup table has address bits. So
  you might be calculating time with 32-bit accuracy, but only using the
  upper 16 bits to look up samples in a 65536 element table.
  
  The result is that while the index time of a given sample is
  approximate, the cumulative time has many bits of accuracy. This
  easily gets you sub-Hz resolution, without the need to alter a timer
  or DAC clock at all. And that's important, because typically the
  cleanup circuitry in a DAC and following its output is designed for
  only a small number of sample rate(s).
  
  Note that if your lookup table contains a sine or other waveform with
  symmetry, you can probably shrink its size - for a sine you really
  only need to store a quarter of a wave, as you can get the other three
  quadrants by inverting phase or amplitude.