STM32单片机入门指南:从基础概念到实战编程
创作时间:
作者:
@小白创作中心
STM32单片机入门指南:从基础概念到实战编程
引用
CSDN
1.
https://blog.csdn.net/RL2698853114/article/details/144943471
STM32单片机是基于ARM Cortex-M系列处理器的一类微控制器,广泛应用于各种嵌入式系统中。本文将从基础概念、开发环境搭建、编程入门等方面,为你提供一个系统的学习指南。
一、基础概念
1.1 STM32单片机简介
STM32单片机是由STMicroelectronics(意法半导体)公司推出的一系列32位微控制器。它们基于ARM Cortex-M系列处理器架构,具有高性能、低功耗、丰富的外设接口等特点。STM32系列单片机按照性能和功能的不同,分为多个系列,如F系列、L系列、G系列等,每个系列又包含多个型号,以满足不同应用场景的需求。
1.2 ARM Cortex-M系列处理器
ARM Cortex-M系列处理器是专为嵌入式市场设计的处理器架构,具有以下特点:
- 低功耗:采用低功耗设计,适合电池供电的便携式设备。
- 高性能:提供高性能的处理能力,满足复杂应用的需求。
- 实时性:具有快速中断响应能力,适合实时控制系统。
- 易于开发:提供丰富的开发工具和软件库,简化开发过程。
1.3 微控制器的基本组成
微控制器(MCU)是一种集成了处理器、存储器、输入/输出接口等组件的集成电路芯片。STM32单片机的基本组成包括:
- 处理器:负责执行程序指令,如ARM Cortex-M系列处理器。
- 存储器:包括只读存储器(ROM)、随机存取存储器(RAM)等,用于存储程序代码和数据。
- 输入/输出接口:如通用输入/输出(GPIO)、串口通信(UART)、模数转换(ADC)等,用于与外部设备进行数据交换。
- 其他外设:如定时器、看门狗、电源管理等,提供辅助功能。
二、开发环境搭建
2.1 选择开发板
对于新手小白来说,选择一款适合学习的STM32开发板非常重要。以下是一些建议:
- 官方开发板:如ST官方推出的STM32F103C8T6等,具有良好的兼容性和官方技术支持。
- 第三方开发板:市面上有许多第三方厂商生产的STM32开发板,如正点原子、野火等,它们通常具有丰富的外设接口和良好的学习资料支持。
2.2 安装开发软件
开发STM32单片机需要使用专门的集成开发环境(IDE)。以下是一些常用的开发软件:
- Keil uVision:Keil uVision是一款功能强大的集成开发环境,支持多种ARM Cortex-M系列处理器。它提供了代码编辑、编译、调试等功能,并且拥有丰富的软件库和示例代码。
- STM32CubeIDE:STM32CubeIDE是ST官方推出的集成开发环境,专为STM32系列单片机设计。它集成了代码生成器、编译器、调试器等工具,并且提供了丰富的外设配置向导和软件库,非常适合初学者使用。
2.3 配置开发环境
在安装好开发软件后,需要进行相应的配置,以确保能够顺利地进行STM32单片机的开发。以下是一些基本的配置步骤:
- 设置项目:在开发软件中创建一个新的项目,并选择相应的STM32型号和开发板。
- 配置外设:根据项目需求,使用外设配置向导或手动编写代码来配置STM32单片机的外设,如GPIO、UART等。
- 下载驱动:如果使用的是第三方开发板,可能需要下载相应的驱动程序,以便开发软件能够识别和连接开发板。
三、编程入门
3.1 GPIO编程
通用输入/输出(GPIO)是STM32单片机的基本外设之一,用于实现数字信号的输入和输出。以下是一个简单的GPIO编程示例,实现LED灯的闪烁功能:
#include "stm32f1xx_hal.h"
// 初始化GPIO
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIO时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置GPIO模式和输出类型
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 系统时钟初始化
SystemClock_Config();
// 初始化GPIO
GPIO_Init();
while (1)
{
// 点亮LED灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
// 延时
HAL_Delay(500);
// 熄灭LED灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
// 延时
HAL_Delay(500);
}
}
3.2 UART编程
串口通信(UART)是STM32单片机常用的通信方式之一,用于实现与计算机或其他设备的数据交换。以下是一个简单的UART编程示例,实现STM32单片机与计算机的串口通信:
#include "stm32f1xx_hal.h"
// 初始化UART
void UART_Init(void)
{
UART_HandleTypeDef huart2;
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用UART时钟和GPIO时钟
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置UART GPIO
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置UART参数
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart2);
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 系统时钟初始化
SystemClock_Config();
// 初始化UART
UART_Init();
while (1)
{
// 发送数据
char data = 'A';
HAL_UART_Transmit(&huart2, (uint8_t *)&data, 1, HAL_MAX_DELAY);
// 延时
HAL_Delay(1000);
}
}
3.3 ADC编程
模数转换(ADC)是STM32单片机的重要功能之一,用于将模拟信号转换为数字信号。以下是一个简单的ADC编程示例,实现对模拟信号的采样和读取:
#include "stm32f1xx_hal.h"
// 初始化ADC
void ADC_Init(void)
{
ADC_HandleTypeDef hadc1;
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用ADC时钟和GPIO时钟
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置ADC GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置ADC参数
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
// 配置ADC通道
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 系统时钟初始化
SystemClock_Config();
// 初始化ADC
ADC_Init();
while (1)
{
// 启动ADC转换
HAL_ADC_Start(&hadc1);
}
}
热门推荐
热水器漏电保护器跳闸无法复位怎么办?一文详解处理方法
考研复习计划5篇
矫正器牙套断裂怎么办?专业修复指南
Windows内核详解:关键文件、架构设计与内核隔离的重要性
平凉至西藏拉萨沿途特色美食与小吃推荐
不锈钢保温杯如何清洁 保温杯子里面有异味怎么去除
速查你的六十四卦易经本命卦
2025 年成为人工智能工程师的路线图
只能嚼不能咽的蜡瓶糖火了 医生表示:可能带来健康隐忧
广州规划高速磁浮!600公里时速安全吗?何时能像高铁一样普及?
急!头发突然秃了一块!好尴尬,怎么办?
美国留学期间掉头发的原因及应对措施
电影《编号17》:日抛主角的太空打工奇遇,笑中带泪的黑色幽默
《山海经》中的神秘野兽:腓腓
高纯镍粉的化学性质、安全信息及生产厂家
Word软件的撤销功能是什么原理
心理研究:抗焦虑最佳方法是运动!这三种运动效果最好
沈阳市疾病预防控制中心:春节期间甲肝防控指南
重磅发布!武汉地区医院排名来了
为何不买中间户?采光、通风、噪音和隐私是关键
结婚要求是什么
如何完美将妈妈的黑胶唱片转为 MP3?
去年为3.23万劳动者讨薪2.4亿元,南京新年首场发布会聚焦欠薪治理
写作中“起承转合”经典构造及释义,让你成为文章高手
写作结构:所有学生作家都应该知道的 6 种类型
试用期工资怎么计算的公式
脊髓压迫症可以自愈吗?医生的专业解答
银行最怕你用“这4招”存钱,利息多拿几千块,很多人还不知道
装修攻略:如何实现高性价比装修?
如何优化水下机器视觉系统的光照条件