====== General Purpose Output ====== * The [[#OTYPER|output buffer]] is enabled (open drain or push-pull). * The Schmitt trigger input is active. * The pull-up and -down resistors are active, according to [[#registers|PUPDR]]. * Input data is sampled every AHB clock. * Input data register holds I/O state. * Output data register holds last written value. \\ {{gpio_output.svg}} \\ \\ ===== Programming Instructions ===== ==== Enable Peripheral ==== Make sure the peripheral is enabled: * Enable GPIOx in ''RCC->AHBENR[0]''. ==== Setup output mode ==== Configure the MODE and PUPDR as well as the output type and speed register, \\ for every pin that should act as digital output: * Write ''0x01'' to the corresponding fields in ''GPIOx->MODE''. * Configure pull-up / -down in ''GPIOx->PUPDR''. * Configure output type in ''GPIOx->OTYPER''. \\ (in conjunction with ''GPIOx->PUPDR'') * Configure output speed in ''GPIOx->OSPEEDR''. \\ ===== Configuration Registers ===== ==== GPIOx_MODER - Port mode register ==== \\ {{gpio_reg_common.svg}} \\ \\ |< 100% 5em 5em >| |Pin x|01|Output mode| ==== GPIOx_PUPDR - Port pull-up / pull-down register ==== \\ {{gpio_reg_common.svg}} \\ \\ |< 100% 5em 5em >| |Pin x|00|No pull-up, pull-down (reset state)| |:::|01|Pull-up| |:::|10|Pull-down| |:::|11|Reserved| ==== GPIOx_OTYPER - Port output type register ==== \\ {{gpio_reg_otyper.svg}} \\ \\ |< 100% 5em 5em >| |Pin x|0|Output type: push-pull (reset state)| |:::|1|Output type: open-drain| ==== GPIOx_OSPEEDR - Port output speed register ==== \\ {{gpio_reg_common.svg}} \\ \\ |< 100% 5em 5em >| |Pin x|00|Speed: 2 MHz (reset state)| |:::|01|Speed: 10 MHz| |:::|10|Speed: 50 MHz| |:::|11|Speed: 100 MHz| ===== Data Registers ===== ==== GPIOx_ODR - Port output data register ==== \\ {{gpio_reg_odr.svg}} \\ \\ |< 100% 5em 5em >| |ODx|0|Clear/reset pin x| |:::|1|Set pin x| ==== GPIOx_BSRR Port bit set / reset register ==== \\ {{gpio_reg_bsrr.svg}} \\ \\ |< 100% 5em 5em >| |BSx|0|No effect| |:::|1|Set pin x| |BRx|0|No effext| |:::|1|Clear/reset pin x|