stm32外设的使用
STM32 外设的使用涉及硬件配置、寄存器操作或库函数调用(如标准外设库、HAL/LL库)。以下是一些常见外设的使用要点:
一、通用外设基础
-
GPIO(通用输入输出)
- 功能:控制引脚电平(输入/输出)、中断、复用功能(如UART、SPI等)。
- 配置步骤:
- 使能GPIO时钟:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - 设置引脚模式(输入/输出/复用/模拟)、上下拉、速度:
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); // 初始化 - 读写电平:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 置高 uint8_t state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5); // 读取电平
- 使能GPIO时钟:
-
中断(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); // 清除中断标志 // 处理逻辑 }
二、常用通信外设
-
UART(串口通信)
- 功能:异步串行通信,常用于调试或与模块通信。
- 配置步骤:
- 使能UART和GPIO时钟。
- 配置引脚复用为UART功能(如PA9-TX, PA10-RX)。
- 初始化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); - 发送/接收数据:
// 阻塞式发送 HAL_UART_Transmit(&huart1, (uint8_t*)"Hello", 5, 100); // 中断接收 HAL_UART_Receive_IT(&huart1, rx_buffer, buffer_size);
-
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);
-
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
三、模拟外设
-
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); }
- 配置通道、采样时间、分辨率:
-
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)
-
基本定时器
- 用于定时中断或延时:
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); // 启动定时器中断 - 中断处理函数中执行周期性任务。
- 用于定时中断或延时:
-
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);
- 配置通道为PWM模式,调节占空比:
五、工具与调试
- STM32CubeMX
- 图形化配置外设,自动生成初始化代码,减少手动配置错误。
- 逻辑分析仪/示波器
- 验证SPI、I2C、UART等通信波形。
- ST-Link Utility/STM32CubeProgrammer
- 下载程序、读取Flash内容。
六、常见问题
- 外设不工作
- 检查时钟是否使能(RCC配置)。
- 确认GPIO模式是否正确(如复用功能)。
- 中断无法触发
- 检查中断优先级配置和使能。
- 清除中断标志位。
- 通信失败
- 确认波特率/时钟极性匹配。
- 检查硬件连接(如上拉电阻)。
实际开发中建议结合数据手册(Reference Manual)和STM32CubeMX工具,快速配置外设并生成代码框架。
一个小项目看懂 STM32 全部外设
很多刚接触STM32的同学,常常被它庞杂的外设列表劝退。GPIO、USART、ADC、TIM、DMA、SPI、I2C……光看手册目录就已经头晕。其实,只要你通过一个完整的小项目,把这些
2026-01-09 19:04:02
如何使用Keil MDK及标准外设库创建STM32工程
如何使用Keil MDK及标准外设库创建STM32工程使用Keil MDK 运行第一个STM32F10X 程序
资料下载
佚名
2019-07-24 16:27:04
STM32开发标准外设库的详细资料说明
STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数
资料下载
佚名
2019-05-09 18:15:00
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
STM32标准外设库的文件结构解析
STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
2019-10-17 15:55:20
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览