STM32外设应用

embedded/2025/1/30 21:39:20/

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/embedded/158165.html

相关文章

RAG是否被取代(缓存增强生成-CAG)吗?

引言&#xff1a; 本文深入研究一种名为缓存增强生成&#xff08;CAG&#xff09;的新技术如何工作并减少/消除检索增强生成&#xff08;RAG&#xff09;弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出&#xff0c;但是这样的工作方式很快就不能满足应用的需要: 因…

预测不规则离散运动的下一个结构

有一个点在19*19的平面上运动&#xff0c;运动轨迹为 一共移动了90步&#xff0c;顺序为 y x y x y x 0 17 16 30 10 8 60 15 15 1 3 6 31 10 7 61 14 15 2 12 17 32 9 9 62 16 15 3 4 12 33 10 9 63 18 15 4 3 18 34 15 12 6…

【C++】设计模式详解:单例模式

文章目录 Ⅰ. 设计一个类&#xff0c;不允许被拷贝Ⅱ. 请设计一个类&#xff0c;只能在堆上创建对象Ⅲ. 请设计一个类&#xff0c;只能在栈上创建对象Ⅳ. 请设计一个类&#xff0c;不能被继承Ⅴ. 请设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;&am…

组合模式 - 组合模式的实现

引言 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象&#xff0c;从而简化了代码的复杂性。本文将详细介绍如何在C中实…

嵌入式经典面试题之操作系统(一)

文章目录 1 请你说说常用的Linux命令有哪些&#xff1f;2 在linux中如何创建一个新的目录&#xff1f;3 Linux中查看进程运行状态的指令、tar解压文件的参数。4 在linux中&#xff0c;文件权限如何修改&#xff1f;5 怎样以root权限运行某个程序&#xff1f;6 在linux里如何查看…

WPS计算机二级•幻灯片的段落排版

听说这是目录哦 PPT中格式统一 小技巧&#x1f386;PPT排版原则 少即是多&#x1f387;让文本表达更形象的 图示&#x1f389;演示文件如何设置 缩进和间距✨PPT排版 多文字的处理&#x1f9e8;快速对纯文本内容 进行排版&#x1f381;PPT如何设置 背景与配色方案&#x1f9e7;…

【漫话机器学习系列】060.前馈神经网络(Feed Forward Neural Networks, FFNN)

前馈神经网络&#xff08;Feed Forward Neural Networks, FFNN&#xff09; 1. 定义 前馈神经网络是一种最基本的人工神经网络结构&#xff0c;是深度学习的基础。数据从输入层开始&#xff0c;依次经过隐藏层&#xff0c;最终传递到输出层&#xff0c;不存在任何循环或反馈。…

4.贪心算法

贪心 贪心算法&#xff08;Greedy Algorithms&#xff09;是 C 等编程语言中常用的一种算法策略。 定义 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的是在某种意义上的局部最…