STM32C031C6Tx microcontroller examples for GPIO, I2C, SPI, and UART using HAL.

STM32C031C6Tx microcontroller examples for GPIO, I2C, SPI, and UART using HAL.

The STM32C031C6Tx is a feature-rich 32-bit ARM Cortex-M0+ microcontroller designed for cost-sensitive and low-power applications. With a compact LQFP-48 package, this microcontroller delivers a balance of performance and efficiency, boasting up to 48 MHz clock speed, 32 KB of flash memory, and 6 KB of SRAM. It includes essential peripherals like GPIO, I2C, SPI, and UART, making it versatile for a wide range of applications, from industrial control to IoT devices. Its robust design and extended temperature range (-40°C to +85°C) ensure reliability in demanding environments.

1. GPIO Example

This example toggles an LED connected to a GPIO pin (e.g., PB1) and reads a button input (e.g., PA0).

#include "main.h"

void SystemClock_Config(void);
void MX_GPIO_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    while (1) {
        // Toggle LED on PB1
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
        HAL_Delay(500); // 500 ms delay

        // Read button state on PA0
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
            // Button pressed
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // LED ON
        } else {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // LED OFF
        }
    }
}

void MX_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // Configure PA0 as input with pull-up
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // Configure PB1 as output
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

2. I2C Example

This example communicates with an I2C device (e.g., an EEPROM) using HAL.

#include "main.h"

I2C_HandleTypeDef hi2c1;

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_I2C1_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();

    uint8_t txData[2] = {0x00, 0x55}; // Example data to write
    uint8_t rxData[1];                // Buffer for reading

    // Write data to I2C device (address 0x50)
    HAL_I2C_Master_Transmit(&hi2c1, 0x50 << 1, txData, 2, HAL_MAX_DELAY);

    // Read data from I2C device
    HAL_I2C_Master_Receive(&hi2c1, 0x50 << 1, rxData, 1, HAL_MAX_DELAY);

    while (1) {
        // Infinite loop
    }
}

void MX_I2C1_Init(void) {
    __HAL_RCC_I2C1_CLK_ENABLE();

    hi2c1.Instance = I2C1;
    hi2c1.Init.Timing = 0x00303D5B; // 100 kHz
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    HAL_I2C_Init(&hi2c1);
}
	

3. SPI Example

This example demonstrates SPI communication by sending and receiving data to an SPI slave device.

#include "main.h"

SPI_HandleTypeDef hspi1;

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_SPI1_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();

    uint8_t txData = 0xA5;  // Example data to send
    uint8_t rxData;         // Buffer for received data

    while (1) {
        // Transmit and receive data over SPI
        HAL_SPI_TransmitReceive(&hspi1, &txData, &rxData, 1, HAL_MAX_DELAY);

        HAL_Delay(1000); // 1-second delay
    }
}

void MX_SPI1_Init(void) {
    __HAL_RCC_SPI1_CLK_ENABLE();

    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 10;
    HAL_SPI_Init(&hspi1);
}
	

4. UART Example

This example transmits and receives data over UART.

#include "main.h"

UART_HandleTypeDef huart2;

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_USART2_UART_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();

    char txData[] = "Hello, UART!\r\n";
    char rxData[10];

    while (1) {
        // Transmit data
        HAL_UART_Transmit(&huart2, (uint8_t *)txData, strlen(txData), HAL_MAX_DELAY);

        // Receive data
        HAL_UART_Receive(&huart2, (uint8_t *)rxData, sizeof(rxData), HAL_MAX_DELAY);

        HAL_Delay(1000); // 1-second delay
    }
}

void MX_USART2_UART_Init(void) {
    __HAL_RCC_USART2_CLK_ENABLE();

    huart2.Instance = USART2;
    huart2.Init.BaudRate = 9600;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart2);
}
	

Key Notes:

  1. Peripheral Initialization:
    • GPIO, I2C, SPI, and UART peripherals must be initialized in respective MX_*_Init functions.
    • CubeMX can auto-generate these functions for ease.
  2. Configurations:
    • Adjust pin numbers, addresses, and communication settings to match your hardware.
  3. HAL Delays:
    • Use HAL_Delay() for simple timing, but for precise applications, consider interrupts or RTOS.

The STM32C031C6Tx stands out as a reliable and cost-effective solution for modern embedded systems, offering a compact footprint and comprehensive feature set. Its efficient performance, coupled with the flexibility of peripherals like GPIO, I2C, SPI, and UART, make it ideal for applications across industrial, consumer, and IoT domains. With strong ecosystem support from STMicroelectronics, the STM32C031C6Tx empowers developers to create optimized and scalable designs while reducing time-to-market.

Leave a Reply

Your email address will not be published. Required fields are marked *