STM32CubeIDE HAL API
GPIO
- Set GPIO
HAL_GPIO_Write(GPIOE, GPIO_PIN_0, GPIO_SET);
- Clear GPIO
HAL_GPIO_Write(GPIOE, GPIO_PIN_0, GPIO_RESET);
- Toggle GPIO
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_0);
Delay
HAL_Delay(100); // time in ms
UART

Blocking Mode
- With
sprintf
#include <stdio.h>
char buffer[100] = {0};
uint32_t len = sprintf(buffer, "Value = %d\r\n", 10);
HAL_UART_Transmit(&huart1, (uint8_t*) buffer, len, HAL_MAX_DELAY);
- With
printf. Source
#include <stdio.h>
#include <errno.h>
int _write(int fd, char* ptr, int len) {
HAL_StatusTypeDef hstatus;
if (fd == 0 || fd == 1) {
hstatus = HAL_UART_Transmit(&huart2, (uint8_t *) ptr, len, HAL_MAX_DELAY);
if (hstatus == HAL_OK)
return len;
else
return EIO;
}
errno = EBADF;
return -1;
}
setvbuf(stdout, NULL, _IONBF, 0);
printf("Value = %d\r\n", 10);
- To enable Floating Point Support right click the project in the project tree ->
Properties->C/C++ Build->Settings-> `MCU Settings->Use float with printf from newlib-nano (-u _printf_float).
Interrupt Mode
uint8_t transmit_buffer[10];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == UART1) {
}
}
HAL_UART_Receive_IT(&huart1, transmit_buffer,
sizeof(transmit_buffer));
DMA Mode
uint8_t receive_buffer[10];
uint8_t transmit_buffer[10];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == UART1) {
HAL_UART_Receive_DMA(huart, receive_buffer,
sizeof(receive_buffer));
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
}
HAL_UART_Receive_DMA(&huart1, transmit_buffer,
sizeof(transmit_buffer));
USB CDC Mode
#include "usbd_cdc_if.h"
char buffer[50] = {0};
uint32_t tick = HAL_GetTick();
uint16_t size = sprintf(buffer, "%08d %08d Hello World\r\n", (int)tick, (int)tick - prev_tick);
CDC_Transmit_FS((uint8_t*) buffer, size);
Change Mode
- Enable Receive Mode:
huart->Instance->CR1 |= UART_MODE_RX;
- Disable Receive Mode
huart->Instance->CR1 &= ~UART_MODE_RX;
Plotting Serial Data
Timer

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
}
HAL_TIM_Base_Start_IT(&htim2);
Quadrature Encoder Mode
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
counter1 = __HAL_TIM_GET_COUNTER(&htim1);
Or Interrupt Mode:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
counter = __HAL_TIM_GET_COUNTER(htim);
}
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
PWM Mode
TIM_CLK= timer clock inputPSC= 16-bit prescaler registerARR= 16/32-bit Autoreload register
void set_pwm(uint16_t value) {
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
}
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1)
ADC

Blocking Mode
HAL_ADC_Start(&hadc1);
HAL_StatusTypeDef status = HAL_ADC_PollForConversion(&hadc1, 1); // Timeout in ms
uint32_t value = HAL_ADC_GetValue(&hadc1);