嵌入式开发实战:从裸机到外设应用深度解析

2026年8月27日 0 By admin

嵌入式开发实战:从裸机到外设应用深度解析

1. 单片机裸机编程入门

在嵌入式开发的世界里,单片机裸机编程是入门的第一步。它要求开发者直接操作硬件寄存器,理解CPU的指令集和时序。以下是一个简单的裸机编程示例,用于点亮一个LED灯。

#include 

// 假设LED连接在GPIO端口的一个引脚上
#define LED_PIN (1 << 0)

void delay(uint32_t ms) {
    // 简单的延时函数,具体实现依赖于硬件时钟配置
    for (uint32_t i = 0; i < ms; ++i) {
        // 空操作延时
    }
}

int main() {
    // 初始化GPIO端口,配置引脚为输出模式
    // 具体初始化代码依赖于硬件手册

    while (1) {
        // 打开LED
        GPIO_PORT |= LED_PIN;
        delay(1000); // 延时1000ms

        // 关闭LED
        GPIO_PORT &= ~LED_PIN;
        delay(1000); // 延时1000ms
    }
}

2. STM32/ESP32/GD32等MCU应用

随着技术的发展,越来越多的开发板和MCU提供了丰富的库函数和开发工具,使得开发过程更加高效。以下是一个使用STM32 HAL库函数的示例,用于控制一个PWM输出。

#include "stm32f1xx_hal.h"

TIM_HandleTypeDef htim2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);

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

    while (1) {
        // 更新PWM占空比
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500);
        HAL_Delay(1000);
    }
}

void MX_TIM2_Init(void) {
    TIM_OC_InitTypeDef sConfigOC = {0};

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 0;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 1000 - 1;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim2);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500 - 1;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
}

3. 外设与总线

在嵌入式系统中,外设与总线的通信是必不可少的。以下是一些常见的外设和总线的应用示例。

UART通信

UART_HandleTypeDef huart1;

void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1);
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    if (uartHandle->Instance == USART1) {
        __HAL_RCC_USART1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART1_IRQn);
    }
}

SPI通信

SPI_HandleTypeDef hspi1;

void MX_SPI1_Init(void) {
    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_2;
    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. 中断与DMA

中断和DMA是嵌入式系统中提高效率的关键技术。

中断示例

void EXTI0_IRQHandler(void) {
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) {
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
        // 处理中断
    }
}

DMA示例

void MX_DMA_Init(void) {
    __HAL_RCC_DMA1_CLK_ENABLE();

    hdma_usart1_rx.Instance = DMA1_Channel5;
    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_rx.Init.Mode = DMA_NORMAL;
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
    HAL_DMA_Init(&hdma_usart1_rx);

    __HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx);
}

5. 低功耗设计

低功耗设计是嵌入式系统设计中不可忽视的一环。以下是一些低功耗设计的要点。

  • 关闭未使用的模块和时钟
  • 使用低功耗模式
  • 优化代码和算法

在嵌入式开发中,了解和掌握这些技术是至关重要的。通过本文的介绍,相信读者对嵌入式开发有了更深入的了解。在实际项目中,还需要根据具体情况进行调整和优化。