9.1 GPIO als uitgang
GPIO staat voor General Purpose Input/Output: de gewone in- en uitgangspinnen. Je kent de HAL-blink al; nu sluit je je eigen LED aan en stuur je hem gericht aan.
Een externe LED met HAL
Sluit een LED met weerstand aan tussen PB0 en GND. Onthoud: de STM32 werkt op 3,3 V, dus een weerstand van 220 Ω is prima.
#include "stm32f1xx_hal.h"
int main(void) {
HAL_Init();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef gpio = {0};
gpio.Pin = GPIO_PIN_0;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);
while (1) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // aan
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // uit
HAL_Delay(500);
}
}
Wat gebeurt hier?
De stappen zijn hetzelfde als bij de ingebouwde LED, maar nu op poort B:
__HAL_RCC_GPIOB_CLK_ENABLE();
Een andere poort betekent een andere klok. Pin PB0 zit op poort B, dus zet je de klok naar GPIOB aan — niet GPIOC.
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
GPIO_PIN_SET maakt de pin hoog (3,3 V), GPIO_PIN_RESET maakt hem laag. Op een externe LED is SET gewoon "aan", zoals je verwacht. Alleen de ingebouwde LED op PC13 is omgekeerd bedraad.
Pin-namen kiezen
Bijna elke pin kan uitgang zijn. Veelgebruikte vrije pinnen op de Blue Pill zijn PB0, PB1, PB5, PB6 en de meeste PA-pinnen. Een paar pinnen hebben een speciale taak (bijvoorbeeld de SWD-debugpinnen PA13 en PA14); die laat je met rust.
Let op het patroon: bij PB0 hoort poort GPIOB en pin GPIO_PIN_0, bij PA5 hoort GPIOA en GPIO_PIN_5. De letter bepaalt de poort (en dus de klok), het cijfer bepaalt de pin.
Opdracht 9.1.a: Stoplicht
Maak een stoplicht met drie LED's op PB0 (rood), PB1 (geel) en PB5 (groen). Doorloop de volgorde: rood → rood+geel → groen → geel → rood.
Klik hier voor een tip!
Alle drie de pinnen zitten op poort B, dus je hoeft de klok maar één keer aan te zetten (__HAL_RCC_GPIOB_CLK_ENABLE()). Je kunt drie keer HAL_GPIO_Init() doen, of de drie pinnen combineren met GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5.
Klik hier voor de oplossing!
#include "stm32f1xx_hal.h"
int main(void) {
HAL_Init();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef gpio = {0};
gpio.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);
while (1) {
// rood
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(3000);
// rood + geel
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1000);
// groen
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(3000);
// geel
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1000);
}
}
Door de pinnen te combineren met | stel je ze in één keer in.