跳到主要内容

STM32 外设接口概述

介绍

STM32微控制器是嵌入式系统中广泛使用的芯片之一,其强大的外设接口功能使其能够与各种外部设备进行通信和控制。外设接口是STM32与外部世界交互的桥梁,包括GPIO、UART、SPI、I2C、ADC、DAC等。理解这些外设接口的工作原理和使用方法,是掌握STM32编程的关键。

外设接口的基本概念

外设接口是STM32微控制器与外部设备进行数据交换的通道。每个外设接口都有其特定的功能和通信协议。以下是STM32中常见的外设接口:

  • GPIO(通用输入输出):用于控制数字信号的输入和输出。
  • UART(通用异步收发传输器):用于串行通信。
  • SPI(串行外设接口):用于高速串行通信。
  • I2C(集成电路总线):用于低速串行通信。
  • ADC(模数转换器):用于将模拟信号转换为数字信号。
  • DAC(数模转换器):用于将数字信号转换为模拟信号。

GPIO接口

GPIO是STM32中最基本的外设接口,用于控制数字信号的输入和输出。每个GPIO引脚都可以配置为输入或输出模式,并且可以设置为推挽输出、开漏输出等。

代码示例:配置GPIO引脚为输出模式

#include "stm32f4xx.h"

void GPIO_Config(void) {
// 使能GPIOA时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

// 配置PA5为输出模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}

int main(void) {
GPIO_Config();

while (1) {
// 设置PA5为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_5);
// 延时
for (int i = 0; i < 1000000; i++);
// 设置PA5为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
// 延时
for (int i = 0; i < 1000000; i++);
}
}
备注

在上面的代码中,我们配置了GPIOA的第5引脚为输出模式,并通过设置和清除该引脚的电平来控制LED的闪烁。

UART接口

UART是一种常见的串行通信接口,用于在两个设备之间传输数据。STM32的UART接口支持全双工通信,并且可以配置不同的波特率、数据位、停止位和校验位。

代码示例:配置UART接口

#include "stm32f4xx.h"

void UART_Config(void) {
// 使能GPIOA和USART2时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

// 配置PA2为USART2_TX,PA3为USART2_RX
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// 配置USART2
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStruct);

// 使能USART2
USART_Cmd(USART2, ENABLE);
}

int main(void) {
UART_Config();

while (1) {
// 发送数据
USART_SendData(USART2, 'A');
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
}
提示

在上面的代码中,我们配置了USART2接口,并通过该接口发送字符'A'。你可以通过串口调试工具查看发送的数据。

SPI接口

SPI是一种高速的串行通信接口,通常用于与闪存、传感器等设备进行通信。STM32的SPI接口支持全双工通信,并且可以配置为主机或从机模式。

代码示例:配置SPI接口

#include "stm32f4xx.h"

void SPI_Config(void) {
// 使能GPIOB和SPI2时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

// 配置PB13为SPI2_SCK,PB14为SPI2_MISO,PB15为SPI2_MOSI
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStruct);

// 配置SPI2
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStruct);

// 使能SPI2
SPI_Cmd(SPI2, ENABLE);
}

int main(void) {
SPI_Config();

while (1) {
// 发送数据
SPI_I2S_SendData(SPI2, 0x55);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
}
}
警告

在上面的代码中,我们配置了SPI2接口,并通过该接口发送数据0x55。请注意,SPI通信需要正确配置时钟极性和相位。

实际应用场景

案例1:使用GPIO控制LED

在许多嵌入式系统中,GPIO接口用于控制LED的亮灭。通过配置GPIO引脚为输出模式,并设置其电平状态,可以实现LED的闪烁效果。

案例2:使用UART与PC通信

UART接口常用于与PC进行通信。通过配置UART接口,STM32可以发送数据到PC,或者接收来自PC的数据。这在调试和监控系统中非常有用。

案例3:使用SPI与传感器通信

SPI接口通常用于与传感器进行通信。例如,温度传感器、加速度传感器等设备通常通过SPI接口与STM32进行数据交换。

总结

STM32的外设接口是嵌入式系统设计中不可或缺的一部分。通过理解和使用这些外设接口,你可以实现与各种外部设备的通信和控制。本文介绍了GPIO、UART和SPI接口的基本概念和配置方法,并提供了实际应用场景的案例。

附加资源与练习

  • 练习1:尝试配置STM32的I2C接口,并与I2C设备进行通信。
  • 练习2:使用ADC接口读取模拟信号,并将结果通过UART发送到PC。
  • 资源:参考STM32的官方文档和库函数手册,深入了解每个外设接口的详细配置和使用方法。
注意

在进行外设接口配置时,请务必参考STM32的参考手册,确保配置参数的正确性。