Files
EmbeddedSoftwareLearn1/03-驱动开发与外设编程/README.md
T
2025-06-16 15:22:01 +08:00

3.0 KiB
Raw Blame History

🟠 第三层:驱动开发与外设编程

本模块深入解析嵌入式驱动开发技术,涵盖从寄存器级编程到 HAL 库、CubeMX 工具链,适合用于裸机或 RTOS 下的外设控制与驱动编写。


🔹 寄存器级开发

📌 地址映射与寄存器偏移

  • 每个外设通过唯一地址在 MCU 的地址空间中访问(基地址 + 偏移)
#define GPIOA_BASE 0x40020000
#define GPIOA_MODER (*(volatile uint32_t *)(GPIOA_BASE + 0x00))
GPIOA_MODER |= (1 << 10);  // 设置某引脚为输出

📌 位操作技巧

  • 设置位:reg |= (1 << bit);
  • 清除位:reg &= ~(1 << bit);
  • 取反位:reg ^= (1 << bit);
  • 检查位:if (reg & (1 << bit)) {...}

🔹 通用外设驱动

📌 GPIO(输入/输出、中断)

  • 输入/输出模式配置
  • 上拉 / 下拉电阻配置
  • 外部中断配置(EXTI)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

📌 UART / USART

  • 串口通信,常用于调试或模块通信
  • 中断模式 / DMA 模式提升性能
HAL_UART_Transmit(&huart2, data, len, 100);
HAL_UART_Receive_IT(&huart2, recv_buf, 10);

📌 SPI / I2C

  • SPI:全双工同步串行通信,适用于高速模块(屏幕/Flash)
  • I2C:半双工协议,适用于传感器、EEPROM 等
HAL_SPI_Transmit(&hspi1, data, len, 100);
HAL_I2C_Master_Transmit(&hi2c1, addr, data, len, 100);

📌 ADC / DAC

  • ADC:模拟电压转换为数字值(03.3V => 04095)
  • DAC:将数字值输出为模拟电压
HAL_ADC_Start(&hadc1);
uint16_t val = HAL_ADC_GetValue(&hadc1);

📌 定时器 / PWM

  • 定时器用于中断周期控制、计时器任务
  • PWM 用于控制舵机、电机、亮度等
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

📌 RTC 实时时钟

  • 用于日期、时间管理、低功耗唤醒等
RTC_TimeTypeDef sTime = {0};
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);

🔹 复杂外设支持

📌 DMA 控制器

  • 用于内存与外设、内存与内存间的高速传输,释放 CPU 占用
HAL_UART_Receive_DMA(&huart1, rx_buf, 64);

📌 看门狗(独立 / 窗口)

  • 防止程序跑飞,需定期喂狗
HAL_IWDG_Refresh(&hiwdg);

📌 CAN / USB / SDIO / Ethernet

  • CAN:车载、工业通信
  • USB:支持 HID/UVC/CDC 等类驱动
  • SDIO:用于 SD 卡高速读写
  • Ethernet:支持 LwIP 等协议栈

📌 LCD / 触摸屏驱动

  • 并口 / SPI 屏幕驱动初始化、画图、字体渲染
  • 触摸屏需结合电容/电阻触控芯片解析数据

🔹 开发库 & 工具链

📌 STM32 HAL / LL

  • HAL:高级封装,适合快速开发
  • LL(Low Layer):更接近底层,更灵活控制

📌 STM32CubeMX

  • 图形化配置引脚 / 时钟 / 中间件
  • 自动生成初始化代码

📌 CMSIS 标准接口

  • ARM 官方 Cortex-M 接口标准
  • 提供中断向量、系统初始化、寄存器访问等统一方式

📁 每类外设将在 examples/ 中提供完整裸机与 HAL 驱动示例。