1. 什么是STM32外设?
STM32微控制器集成了多种外设,这些外设可以帮助我们实现各种功能,比如控制LED灯、读取传感器数据、与其他设备通信等。常见的外设有GPIO(通用输入输出)、ADC(模数转换器)、UART(通用异步收发传输器)、SPI(串行外围接口)和I2C(集成电路间通信)。
2. 如何开始使用STM32外设?
首先,你需要准备一个STM32开发板,比如STM32F103。然后,安装必要的开发工具,如STM32CubeIDE。这个软件可以帮助你编写代码、配置外设和下载程序到开发板上。
3. GPIO(通用输入输出)
GPIO是最基本的外设,可以配置为输入或输出模式。比如,你可以用它来控制一个LED灯的亮灭,或者读取一个按钮的状态。
-
代码示例:
c复制
#include "main.h"
#include "stm32f4xx_hal.h"void SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1){// 点亮 LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);HAL_Delay(1000);// 熄灭 LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);HAL_Delay(1000);}
}static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
4. ADC(模数转换器)
ADC可以将模拟信号转换为数字信号,比如测量温度或光照强度。
-
代码示例:
c复制
#include "main.h"
#include "stm32f4xx_hal.h"ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();uint32_t adc_value;while (1){HAL_ADC_Start(&hadc1);if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK){adc_value = HAL_ADC_GetValue(&hadc1);// 处理 ADC 值}HAL_Delay(100);}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;hadc1.Init.Resolution = ADC_RESOLUTION_12B;hadc1.Init.ScanConvMode = DISABLE;hadc1.Init.ContinuousConvMode = DISABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;hadc1.Init.DMAContinuousRequests = DISABLE;hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = 1;sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}
5. UART(通用异步收发传输器)
UART用于设备间的数据交换,比如将数据发送到电脑。
-
代码示例:
c复制
#include "main.h"
#include "stm32f4xx_hal.h"
#include "stdio.h"UART_HandleTypeDef huart1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();char message[] = "Hello, STM32!\r\n";while (1){HAL_UART_Transmit(&huart1, (uint8_t *)message, sizeof(message) - 1, HAL_MAX_DELAY);HAL_Delay(1000);}
}static void MX_USART1_UART_Init(void)
{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;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}
6. SPI(串行外围接口)
SPI是一种高速串行通信协议,常用于与外部存储器、显示屏、传感器等设备的通信。
7. I2C(集成电路间通信)
I2C是一种用于连接低速设备的通信协议,比如EEPROM、传感器等。
-
代码示例:
c复制
#define EEPROM_ADDRESS 0xA0 // 设备地址
#define EEPROM_WIGHT_OFFSET 0x00 // 写入地址偏移
#define EEPROM_READ_OFFSET 0x01 // 读取地址偏移
uint8_t data_buffer[1]; // 读写数据缓冲区// 写数据到EEPROM
HAL_StatusTypeDef I2C_Write(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{return HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDRESS, MemAddress << 1, I2C_MEMADD_SIZE_8BIT, pData, Size, HAL_MAX_DELAY);
}// 从EEPROM读数据
HAL_StatusTypeDef I2C_Read(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{return HAL_I2C_Mem_Read(&hi2c1, EEPROM_ADDRESS, MemAddress << 1, I2C_MEMADD_SIZE_8BIT, pData, Size, HAL_MAX_DELAY);
}// 使用示例
I2C_Write(EEPROM_WIGHT_OFFSET, data_buffer, 1); // 写入数据
I2C_Read(EEPROM_READ_OFFSET, data_buffer, 1); // 读取数据
8. 实战案例:基于STM32的环境监测系统
你可以用STM32和DHT11温湿度传感器来制作一个环境监测系统。通过UART将数据发送到电脑,然后在电脑上显示温湿度信息。
-
硬件组件:
-
STM32微控制器(如STM32F103)
-
DHT11温湿度传感器
-
USB转UART模块
-
电源模块
-
-
软件功能:
-
读取DHT11传感器的数据
-
通过UART将数据发送到PC
-
在PC上显示温湿度信息
-
-
代码示例:
c复制
#include "stm32f1xx_hal.h"
#include "dht11.h"// UART句柄
UART_HandleTypeDef huart1;// 初始化UART
void UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;HAL_UART_Init(&huart1);
}// 主函数
int main(void)
{HAL_Init();SystemClock_Config();UART_Init();DHT11_Init();char buffer[50];uint8_t temperature, humidity;while (1){// 读取温湿度数据if (DHT11_Read(&temperature, &humidity) == DHT11_OK){// 格式化数据sprintf(buffer, "Temp: %d C, Humidity: %d %%\n", temperature, humidity);// 通过UART发送数据HAL_UART_Transmit