STM32外设应用

server/2025/2/1 18:25:21/

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

http://www.ppmy.cn/server/164129.html

相关文章

软件工程概论试题一

一、单选 1.下面关于“发布测试”的观点错误的是( )。 A.系统开发团队不应该负责发布测试 B.发布测试是一个确认检查的过程 C.发布测试的目的是让系统供应商确信系统足够好可以使用了 D.发布测试通常采用白盒测试 正答&#xff1a;D 2.下图最有可能是()体系结构风格。 A. C…

Pyecharts之图表组合与布局优化

在数据可视化中&#xff0c;我们经常需要将多个图表组合在一起&#xff0c;以展示不同维度的数据或者进行对比分析。同时&#xff0c;合理的布局能够提升图表的可读性和用户体验。Pyecharts 提供了强大的组件和方法&#xff0c;让我们可以轻松实现图表的组合和布局优化。本篇将…

leetcode——搜索二维矩阵II(java)

编写一个高效的算法来搜索 *m* x *n* 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,1…

代码随想录_栈与队列

栈与队列 232.用栈实现队列 232. 用栈实现队列 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 思路: 定义两个栈: 入队栈, 出队栈, 控制出入…

395. 至少有K个重复字符的最长子串

参考题解&#xff1a;https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/solutions/623991/jie-ben-ti-bang-zhu-da-jia-li-jie-di-gui-obla 递归含义&#xff1a;返回字符串s中至少有k个重复字符的最长子串递归终止条件&#xff1a;当s的…

洛谷P3372 【模板】线段树 1以及分块

【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

数据结构--差分数组(含题目)<基础入门>

定义&#xff1a;差分数组是一种处理数据的技巧&#xff0c;主要用于高效地执行区间修改操作。在一个数组中&#xff0c;如果需要频繁地对某个区间的所有元素执行相同的操作&#xff08;如加或减一个常数&#xff09;&#xff0c;直接遍历并更新区间内的每个元素会非常耗时。差…

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 动态规划思想第一步&#xff1a;描述状态~ dp[i][j]&#xff1a;表示走到i&#xff0c;j位置时&#xff0c;一共有多少种方法~ 动态规划思想第二步&#xff1a;状态转移方程~ 动态规划思想第三步&#xf…