登录/注册

stm32外设的使用

更多

STM32 外设的使用涉及硬件配置、寄存器操作或库函数调用(如标准外设库、HAL/LL库)。以下是一些常见外设的使用要点:


一、通用外设基础

  1. GPIO(通用输入输出)

    • 功能:控制引脚电平(输入/输出)、中断、复用功能(如UART、SPI等)。
    • 配置步骤
      1. 使能GPIO时钟:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
      2. 设置引脚模式(输入/输出/复用/模拟)、上下拉、速度:
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.Pin = GPIO_PIN_5;       // 选择引脚(如PA5)
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
        GPIO_InitStruct.Pull = GPIO_NOPULL;      // 无上下拉
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 速度
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化
      3. 读写电平:
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 置高
        uint8_t state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5); // 读取电平
  2. 中断(EXTI)

    • 配置引脚为中断模式,设置中断优先级,编写中断服务函数。
    • 示例:按键中断触发
      // 配置中断引脚
      GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      // 设置中断优先级
      HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(EXTI0_IRQn);
      // 中断服务函数
      void EXTI0_IRQHandler(void) {
       HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 清除中断标志
       // 处理逻辑
      }

二、常用通信外设

  1. UART(串口通信)

    • 功能:异步串行通信,常用于调试或与模块通信。
    • 配置步骤
      1. 使能UART和GPIO时钟。
      2. 配置引脚复用为UART功能(如PA9-TX, PA10-RX)。
      3. 初始化UART参数(波特率、数据位、停止位等):
        UART_HandleTypeDef huart1;
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 115200;
        huart1.Init.WordLength = UART_WORDLENGTH_8B;
        huart1.Init.StopBits = UART_STOPBITS_1;
        huart1.Init.Parity = UART_PARITY_NONE;
        HAL_UART_Init(&huart1);
      4. 发送/接收数据:
        // 阻塞式发送
        HAL_UART_Transmit(&huart1, (uint8_t*)"Hello", 5, 100);
        // 中断接收
        HAL_UART_Receive_IT(&huart1, rx_buffer, buffer_size);
  2. SPI(高速全双工通信)

    • 用于连接显示屏、FLASH等设备。
    • 配置时钟极性(CPOL)、相位(CPHA),主从模式:
      SPI_HandleTypeDef hspi1;
      hspi1.Instance = SPI1;
      hspi1.Init.Mode = SPI_MODE_MASTER;
      hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;   // 时钟相位
      hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟极性
      HAL_SPI_Init(&hspi1);
    • 数据传输:
      uint8_t tx_data = 0xAA;
      uint8_t rx_data;
      HAL_SPI_TransmitReceive(&hspi1, &tx_data, &rx_data, 1, 100);
  3. I2C(两线制通信)

    • 用于传感器、EEPROM等。
    • 配置时钟速度、地址模式:
      I2C_HandleTypeDef hi2c1;
      hi2c1.Instance = I2C1;
      hi2c1.Init.ClockSpeed = 100000; // 100kHz
      hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
      HAL_I2C_Init(&hi2c1);
    • 读写数据:
      uint8_t data[2] = {0x00, 0xFF};
      HAL_I2C_Master_Transmit(&hi2c1, 0xA0, data, 2, 100); // 发送到设备地址0xA0

三、模拟外设

  1. ADC(模数转换)

    • 配置通道、采样时间、分辨率:
      ADC_HandleTypeDef hadc1;
      hadc1.Instance = ADC1;
      hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 12位分辨率
      HAL_ADC_Init(&hadc1);
      // 配置通道
      ADC_ChannelConfTypeDef sConfig = {0};
      sConfig.Channel = ADC_CHANNEL_1; // 对应引脚(如PA1)
      sConfig.Rank = 1;
      sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
      HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    • 启动转换并读取:
      HAL_ADC_Start(&hadc1);
      if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {
       uint16_t adc_value = HAL_ADC_GetValue(&hadc1);
      }
  2. DAC(数模转换)

    • 输出模拟电压,配置触发方式:
      DAC_HandleTypeDef hdac;
      hdac.Instance = DAC;
      HAL_DAC_Init(&hdac);
      // 启动DAC通道
      HAL_DAC_Start(&hdac, DAC_CHANNEL_1); // 对应引脚(如PA4)
      // 输出值(12位)
      HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048); // 输出约1.65V(3.3V参考)

四、定时器(TIM)

  1. 基本定时器

    • 用于定时中断或延时:
      TIM_HandleTypeDef htim6;
      htim6.Instance = TIM6;
      htim6.Init.Prescaler = 8399;          // 分频后时钟=84MHz/(8399+1)=10kHz
      htim6.Init.Period = 9999;             // 10kHz/(9999+1)=1Hz中断
      HAL_TIM_Base_Init(&htim6);
      HAL_TIM_Base_Start_IT(&htim6);        // 启动定时器中断
    • 中断处理函数中执行周期性任务。
  2. PWM输出

    • 配置通道为PWM模式,调节占空比:
      TIM_OC_InitTypeDef sConfigOC = {0};
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 500; // 占空比(0~ARR值)
      HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

五、工具与调试

  1. STM32CubeMX
    • 图形化配置外设,自动生成初始化代码,减少手动配置错误。
  2. 逻辑分析仪/示波器
    • 验证SPI、I2C、UART等通信波形。
  3. ST-Link Utility/STM32CubeProgrammer
    • 下载程序、读取Flash内容。

六、常见问题

  1. 外设不工作
    • 检查时钟是否使能(RCC配置)。
    • 确认GPIO模式是否正确(如复用功能)。
  2. 中断无法触发
    • 检查中断优先级配置和使能。
    • 清除中断标志位。
  3. 通信失败
    • 确认波特率/时钟极性匹配。
    • 检查硬件连接(如上拉电阻)。

实际开发中建议结合数据手册(Reference Manual)和STM32CubeMX工具,快速配置外设并生成代码框架。

一个小项目看懂 STM32 全部外设

很多刚接触STM32的同学,常常被它庞杂的外设列表劝退。GPIO、USART、ADC、TIM、DMA、SPI、I2C……光看手册目录就已经头晕。其实,只要你通过一个完整的小项目,把这些

2026-01-09 19:04:02

STM32基于标准外设库的外部中断配置

本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断

2023-11-02 14:13:06

STM32失能时钟和复位外设的区别

STM32失能时钟和复位外设的区别

2023-10-17 11:48:30

STM32中文参考手册下载

STM32中文参考手册_V10,详细介绍了32的各种功能外设以及部分内核

资料下载 kafenwong 2022-01-25 10:02:46

STM32F4的DSP和标准外设库资料合集免费下载

本文档的主要内容详细介绍的是STM32F4的DSP和标准外设库资料合集免费下载。

资料下载 佚名 2020-06-12 16:36:04

STM32以太网外设的培训教程说明

本文档的主要内容详细介绍的是STM32以太网外设的培训教程说明。

资料下载 列兵2 2020-04-13 08:00:00

如何使用Keil MDK及标准外设库创建STM32工程

如何使用Keil MDK及标准外设库创建STM32工程使用Keil MDK 运行第一个STM32F10X 程序

资料下载 佚名 2019-07-24 16:27:04

STM32开发标准外设库的详细资料说明

STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数

资料下载 佚名 2019-05-09 18:15:00

STM32F1 USB外设在USB系统的位置

STM32F1 USB外设实现了USB2.0全速总线和APB1总线间的接口。

2023-07-17 15:43:05

STM32外设驱动库分析及如何实现

这里以STM32F429芯片为例,讲解下单片机芯片内存映射图。从此图中可以看到芯片的外设被分配了512M的空间,然而真正的外设其实没有使用到51

2023-03-08 13:22:00

线下实训 | STM32数字电源设计关键外设详解与应用

模拟外设资源,目前在数字电源产品中被广泛应用。本次课程将为你带来STM32与数字电源应用相关的关键外设的详细介绍以及动手实验。 课程安排 本次培

2022-12-08 18:15:02

STM32为什么要先开启外设时钟?

相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其

2022-10-20 14:10:13

STM32F1_ 常见外设资源汇总

STM32F1_常见外设资源汇总

2020-04-08 09:54:02

STM32标准外设库SPL转换成 Cube LL

STM32标准外设库SPL转换成Cube LL

2020-03-08 12:08:06

STM32标准外设库的文件结构解析

STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。

2019-10-17 15:55:20

7天热门专题 换一换
相关标签