STM32单片机外设全解析:解锁外设潜能,拓展应用场景
发布时间: 2024-07-01 22:22:26 阅读量: 79 订阅数: 45
![stm32单片机选型](https://wiki.st.com/stm32mpu/nsfr_img_auth.php/2/25/STM32MP1IPsOverview.png)
# 1. STM32单片机外设概述**
STM32单片机外设是其内部集成的硬件模块,为开发人员提供了丰富的功能,如输入/输出控制、定时、通信、数据转换等。这些外设可通过编程进行配置和控制,极大地拓展了单片机的应用场景。
外设的编程涉及到寄存器操作、中断处理和DMA技术。寄存器是外设内部的存储单元,用于配置和控制外设的各种功能。中断是一种硬件机制,当外设发生特定事件时,会触发中断请求,从而引起CPU的响应。DMA(直接存储器访问)技术允许外设直接与存储器进行数据交换,无需CPU干预,提高了数据传输效率。
# 2. 外设编程基础
### 2.1 外设寄存器结构与访问
**寄存器结构**
STM32单片机的外设寄存器通常由以下部分组成:
- **地址偏移量:**指明寄存器在特定外设中的位置。
- **位域:**代表寄存器中的特定位或位组,用于控制外设的特定功能。
- **读/写访问:**指定寄存器是否可以读取或写入。
**寄存器访问**
访问外设寄存器可以通过以下方式实现:
- **直接寄存器访问:**使用指针直接访问寄存器地址。
- **HAL库函数:**使用HAL库提供的函数,简化寄存器访问和配置。
**代码示例:**
```c
// 直接寄存器访问
volatile uint32_t *GPIOA_ODR = (uint32_t *)0x40020014;
*GPIOA_ODR |= (1 << 5); // 设置 PA5 输出高电平
// HAL库函数访问
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 设置 PA5 输出高电平
```
### 2.2 中断处理机制
**中断概念**
中断是一种硬件机制,当特定事件发生时,可以暂停当前程序执行并跳转到指定的中断处理程序。
**STM32中断处理**
STM32单片机支持多级中断,每个外设都有自己的中断向量。中断处理过程如下:
- **中断发生:**外设事件触发中断请求。
- **中断向量跳转:**根据中断请求号,跳转到对应的中断处理程序。
- **中断处理:**执行中断处理程序中的代码,处理中断事件。
- **中断返回:**执行完中断处理程序后,返回到中断发生前的程序位置。
**中断优先级**
STM32单片机支持中断优先级,允许为不同的中断分配不同的优先级。高优先级中断可以抢占低优先级中断。
### 2.3 DMA技术应用
**DMA概念**
DMA(直接内存访问)是一种硬件机制,允许外设直接与内存进行数据传输,无需CPU干预。
**STM32 DMA技术**
STM32单片机提供多个DMA控制器,支持各种外设与内存之间的DMA传输。DMA传输过程如下:
- **配置DMA:**设置DMA传输参数,如源地址、目标地址、传输大小等。
- **启动DMA:**启动DMA传输,DMA控制器将自动进行数据传输。
- **传输完成:**DMA传输完成后,触发中断或DMA事件。
**DMA优点**
使用DMA技术可以提高数据传输效率,减轻CPU负担,并降低功耗。
**代码示例:**
```c
// DMA传输配置
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.Channel = DMA_Channel_4;
DMA_InitStructure.Direction = DMA_DIR_MemoryToMemory;
DMA_InitStructure.PeriphInc = DMA_PINC_Enable;
DMA_InitStructure.MemInc = DMA_MINC_Enable;
DMA_InitStructure.PeriphDataAlignment = DMA_PDATAALIGN_Word;
DMA_InitStructure.MemDataAlignment = DMA_MDATAALIGN_Word;
DMA_InitStructure.Mode = DMA_Mode_Normal;
DMA_InitStructure.Priority = DMA_Priority_High;
DMA_InitStructure.FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.MemBurst = DMA_MBURST_Single;
DMA_InitStructure.PeriphBurst = DMA_PBURST_Single;
// 启动DMA传输
DMA_Cmd(DMA1_Channel4, ENABLE);
```
# 3. 常用外设解析
### 3.1 GPIO端口
**3.1.1 GPIO端口概述**
GPIO(General Purpose Input/Output)端口是STM32单片机中一种通用输入/输出接口,可用于连接各种外部设备。GPIO端口具有以下特点:
- 可配置为输入或输出模式
- 可用于数字信号或模拟信号的输入/输出
- 具有可编程的拉/下拉电阻
- 可支持中断功能
**3.1.2 GPIO端口寄存器结构**
GPIO端口的寄存器结构主要包括以下几个寄存器:
- GPIOx_MODER:模式寄存器,用于配置GPIO端口的模式(输入/输出)
- GPIOx_OTYPER:输出类型寄存器,用于配置GPIO端口的输出类型(推挽/开漏)
- GPIOx_OSPEEDR:输出速度寄存器,用于配置GPIO端口的输出速度
- GPIOx_PUPDR:上拉/下拉寄存器,用于配置GPIO端口的上拉/下拉电阻
- GPIOx_IDR:输入数据寄存器,用于读取GPIO端口的输入数据
- GPIOx_ODR:输出数据寄存器,用于设置GPIO端口的输出数据
**3.1.3 GPIO端口编程**
GPIO端口的编程主要涉及以下步骤:
1. **配置GPIO端口模式:**通过设置GPIOx_MODER寄存器配置GPIO端口的模式(输入/输出)。
2. **配置GPIO端口输出类型:**通过设置GPIOx_OTYPER寄存器配置GPIO端口的输出类型(推挽/开漏)。
3. **配置GPIO端口输出速度:**通过设置GPIOx_OSPEEDR寄存器配置GPIO端口的输出速度。
4. **配置GPIO端口上拉/下拉电阻:**通过设置GPIOx_PUPDR寄存器配置GPIO端口的上拉/下拉电阻。
5. **读取GPIO端口输入数据:**通过读取GPIOx_IDR寄存器读取GPIO端口的输入数据。
6. **设置GPIO端口输出数据:**通过设置GPIOx_ODR寄存器设置GPIO端口的输出数据。
**代码块:**
```c
// 配置GPIO端口A的第5位为输出模式,推挽输出,高速输出
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
GPIOA->MODER &= ~(GPIO_MODER_MODE5);
GPIOA->MODER |= GPIO_MODER_MODE5_0;
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_5);
GPIOA->OSP
```
0
0