STM32外设编程指南:GPIO、UART、SPI和I2C

avatar
作者
猴君
阅读量:0

STM32外设编程是嵌入式系统开发中的重要组成部分。以下是对STM32中GPIO(通用输入输出)、UART(通用异步接收传输器)、SPI(串行外设接口)和I2C(互连集成电路)等常见外设的编程指南,以及相应的示例代码。

GPIO编程

GPIO是STM32中最基本的外设之一,用于控制和读取数字信号。

  1. 初始化GPIO:配置GPIO引脚的模式(如输入、输出、上拉/下拉等)、速度(如2MHz、25MHz等)和输出类型(如推挽、开漏等)。

  2. 读取和写入GPIO:使用输入/输出操作函数读取或设置GPIO引脚的状态。

示例代码

GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIOA的第5位为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);  // 点亮LED GPIO_SetBits(GPIOA, GPIO_Pin_5); // 熄灭LED GPIO_ResetBits(GPIOA, GPIO_Pin_5); 

UART编程

UART用于实现微控制器与其他设备的串行通信。

  1. 初始化UART:配置波特率、字长、停止位和校验位。

  2. 发送和接收数据:使用UART发送和接收函数进行数据通信。

示例代码

UART_InitTypeDef UART_InitStructure; // 使能USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 配置USART1为115200波特率,8-N-1 UART_InitStructure.UART_BaudRate = 115200; UART_InitStructure.UART_WordLength = UART_WordLength_8b; UART_InitStructure.UART_StopBits = UART_StopBits_1; UART_InitStructure.UART_Parity = UART_Parity_No; UART_Init(USART1, &UART_InitStructure); UART_Cmd(USART1, ENABLE);  // 发送字符 USART_SendData(USART1, 'H'); // 接收字符 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); char c = USART_ReceiveData(USART1); 

SPI编程

SPI是一种高速串行通信协议,用于微控制器与外部设备之间的短距离通信。

  1. 初始化SPI:配置SPI的时钟极性、时钟相位、数据位宽度、主/从模式等。

  2. 传输数据:使用SPI发送和接收函数进行全双工通信。

示例代码

SPI_InitTypeDef SPI_InitStructure; // 使能SPI1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 配置SPI1为主模式,8位数据位,波特率最大 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE);  // 发送数据 SPI_I2S_SendData(SPI1, 0x55); // 接收数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); uint8_t received = SPI_I2S_ReceiveData(SPI1); 

I2C编程

I2C是一种用于附着于微控制器和集成电路的串行计算机总线。

  1. 初始化I2C:配置I2C的通信速率(如100kHz、400kHz等)、地址模式等。

  2. 传输数据:使用I2C发送和接收函数进行数据通信。

示例代码

I2C_InitTypeDef I2C_InitStructure; // 使能I2C1的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // 配置I2C1为100kHz I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x33; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE);  // 向设备地址为0x55的I2C设备发送一个字节 I2C_SendData(I2C1, 0x55, 0xAA, I2C_AutoEnd_Mode, I2C_No_StartStop); // 从同一设备接收一个字节 while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) == RESET); I2C_GenerateSTART(I2C1, ENABLE); while (I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET); uint8_t received = I2C_ReceiveData(I2C1); I2C_GenerateSTOP(I2C1, ENABLE); 

结语

STM32的外设编程是嵌入式系统开发的核心部分,涉及对GPIO、UART、SPI和I2C等外设的配置和使用。通过理解每种外设的工作原理和编程步骤,开发者可以根据项目需求灵活地实现各种功能。示例代码提供了基本的编程框架,实际应用中可能需要根据具体的硬件连接和功能需求进行调整。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!