Understanding the Most Important and Fundamental Aspects of Embedded MCUs: GPIO, Clock, and Interrupts

Level One: GPIO Comprehensive Analysis of GPIO Modes

Mode Description Common Uses
Input Floating No pull-up or pull-down, unstable level, easily interfered with External signal detection (not recommended by default)
Input Pull-up/Pull-down Internally connected to high/low resistance, more stable level Button input, sensor level reading
Push-Pull Output Clear high/low level switching, strong driving capability Driving LEDs, buzzers, etc.
Open-Drain Output Can only pull low, pull high relies on external pull-up resistor I²C communication, multiple devices on the same line control

Common Mistakes

  • LED not lighting up? It may be due to using “open-drain output” without adding a pull-up resistor.

  • Button triggers randomly? Internal pull-up or external resistor not enabled, level floating!

Correct Example (STM32 HAL Library)

GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE(); // Enable GPIOA clockGPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Push-pull outputGPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Level Two: Clock Configuration

Understanding Clock Sources

  • HSI (Internal Clock): Convenient but not precise, suitable for debugging or low-power scenarios.

  • HSE (External Crystal): Accurate and stable, strongly recommended for formal projects.

  • PLL (Phase-Locked Loop): Responsible for frequency multiplication, elevating 8MHz to high-performance frequencies like 72MHz.

Common Pitfalls

  • Forgetting to enable peripheral clocks (e.g., GPIO/UART) → Nothing works!

  • PLL frequency configuration exceeds limits → MCU resets or hangs

  • Using peripherals before system clock is fully set → Erratic behavior

Correct Configuration (CubeMX Auto-Generated Code Example)

RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 8MHz × 9 = 72MHzHAL_RCC_OscConfig(&RCC_OscInitStruct);RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

Level Three: Interrupt Mechanism

Interrupt Priority = Preemptive Priority + Sub-Priority

Type Function
Preemptive Priority Who can interrupt whom
Sub-Priority Order of same-level interrupts

Note: Priority grouping determines the bit allocation for preemptive/sub-priority!

Typical Errors

  • Incorrect priority grouping configuration → Interrupt nesting fails

  • ISR processing too slow → Blocks the system, causing lag

  • Forgetting to clear interrupt flags → Constantly entering interrupt, system goes “crazy”

Correct Approach (Taking UART Receive Interrupt as an Example)

// Set priority grouping (usually in main)HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);// Configure USART1 interruptHAL_NVIC_SetPriority(USART1_IRQn, 1, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);// Enable receive interrupt__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);// Interrupt service functionvoid USART1_IRQHandler(void){if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE))    {uint8_t byte = (uint8_t)(huart1.Instance->DR);// Process data...        __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);    }}

Summary: Memory Technique for the Three Major Modules

Module Core Points
GPIO Clarify modes (input/output), distinguish whether to add pull-up
Clock Understand the relationship between HSE/PLL, don’t forget to enable peripheral clocks
Interrupt Clear priority configuration, ISR must be fast, flags must be cleared

Final Thoughts

The path to mastering MCUs is indeed not smooth, but many issues arise not from a lack of knowledge, but from not being told “where the pitfalls are”.

Understanding the Most Important and Fundamental Aspects of Embedded MCUs: GPIO, Clock, and Interrupts

Leave a Comment