STM32单片机入门指南:零基础快速上手,开启嵌入式开发之旅
发布时间: 2024-07-01 10:44:00 阅读量: 82 订阅数: 28
![STM32单片机入门指南:零基础快速上手,开启嵌入式开发之旅](https://img-blog.csdnimg.cn/5903670652a243edb66b0e8e6199b383.jpg)
# 1. STM32单片机简介**
STM32单片机是意法半导体公司推出的基于ARM Cortex-M内核的高性能微控制器系列。它广泛应用于工业控制、消费电子、医疗设备等领域。STM32单片机具有以下特点:
- 高性能:基于ARM Cortex-M内核,主频高达216MHz,具有强大的处理能力。
- 低功耗:采用先进的电源管理技术,提供多种低功耗模式,延长电池寿命。
- 丰富的外设:集成丰富的片上外设,包括定时器、ADC、UART、SPI等,满足各种应用需求。
- 易于开发:提供完善的开发工具链,包括IDE、编译器和调试器,简化开发过程。
# 2. STM32单片机基础
### 2.1 STM32单片机架构
#### 2.1.1 Cortex-M内核
STM32单片机采用ARM Cortex-M内核,是一种32位RISC处理器,具有低功耗、高性能的特点。Cortex-M内核分为多个子系列,STM32单片机主要采用Cortex-M0、Cortex-M3、Cortex-M4和Cortex-M7等内核。
#### 2.1.2 存储器系统
STM32单片机具有丰富的存储器系统,包括闪存(Flash)、静态随机存储器(SRAM)和动态随机存储器(DRAM)。闪存用于存储程序和数据,具有可擦除和可编程的特点;SRAM用于存储临时数据,具有读写速度快、功耗低的特点;DRAM用于存储大量数据,具有容量大、成本低的特点。
#### 2.1.3 总线系统
STM32单片机采用多总线系统,包括系统总线(AHB)、外设总线(APB)和高速外设总线(AHB-Lite)。AHB总线用于连接高速外设,具有高带宽、低延迟的特点;APB总线用于连接低速外设,具有低功耗、低成本的特点;AHB-Lite总线用于连接高速外设,具有低功耗、低延迟的特点。
### 2.2 STM32单片机外设
#### 2.2.1 GPIO(通用输入/输出)
GPIO是STM32单片机最基本的外部接口,可以配置为输入或输出模式,用于与外部设备进行数据交互。GPIO具有可编程的引脚功能,可以配置为不同的功能,如数字输入/输出、模拟输入/输出、中断输入等。
#### 2.2.2 定时器
定时器是STM32单片机中重要的外设,用于生成精确的时间间隔或脉冲。STM32单片机有多个定时器,每个定时器具有不同的功能和特性。定时器可以配置为不同的模式,如定时器模式、计数器模式、PWM模式等。
#### 2.2.3 串口
串口是STM32单片机中常用的外设,用于与外部设备进行异步串行通信。STM32单片机有多个串口,每个串口具有不同的功能和特性。串口可以配置为不同的模式,如UART模式、USART模式、RS-485模式等。
### 2.3 STM32单片机编程环境
#### 2.3.1 开发工具链
STM32单片机的开发工具链包括编译器、汇编器、链接器和调试器等工具。STM32单片机主要使用ARM Compiler工具链,该工具链提供了针对不同Cortex-M内核的优化编译器和汇编器。
#### 2.3.2 集成开发环境(IDE)
IDE是集成开发工具链的图形化界面,为程序员提供了方便的开发环境。STM32单片机常用的IDE有Keil MDK、IAR Embedded Workbench和STM32CubeIDE等。IDE提供了代码编辑、调试、仿真等功能,大大提高了开发效率。
#### 2.3.3 调试器
调试器是用于调试程序的工具,可以帮助程序员查找和修复程序中的错误。STM32单片机常用的调试器有J-Link、ST-Link和SWD等。调试器可以连接到STM32单片机的调试接口,通过单步执行、断点设置等功能,帮助程序员快速定位程序中的问题。
# 3.1 LED闪烁程序
**目标:**
本节将指导您编写一个简单的LED闪烁程序,让您体验STM32单片机的基本编程。
**硬件准备:**
* STM32开发板
* LED灯
* 电阻
**软件准备:**
* STM32CubeIDE
**步骤:**
1. **创建新项目:**
- 打开STM32CubeIDE,新建一个项目。
- 选择目标板,如STM32F103C8T6。
2. **配置GPIO:**
- 在“CubeMX”窗口中,导航到“Pinout & Configuration”选项卡。
- 选择要连接LED灯的GPIO引脚,将其配置为输出模式。
3. **编写代码:**
- 在“Source”窗口中,打开“main.c”文件。
- 添加以下代码:
```c
#include "stm32f1xx_hal.h"
int main(void)
{
HAL_Init();
GPIO_InitTypeDef GPIO_InitStruct;
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);
while (1)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
```
**代码逻辑:**
- 初始化STM32单片机。
- 配置GPIO引脚为输出模式。
- 在一个无限循环中,交替设置GPIO引脚为高电平和低电平,从而使LED灯闪烁。
4. **编译和下载:**
- 编译代码并将其下载到开发板。
5. **运行程序:**
- 复位开发板,观察LED灯闪烁。
**扩展:**
- 调整闪烁频率,修改`HAL_Delay()`函数中的参数。
- 使用其他GPIO引脚连接LED灯。
- 添加按钮输入,控制LED灯的闪烁。
# 4. STM32单片机高级应用**
## 4.1 定时器应用
### 4.1.1 定时器简介
定时器是STM32单片机中一个重要的外设,它可以用来产生精确的定时或计数脉冲。STM32单片机有多种类型的定时器,包括通用定时器(TIMx)、基本定时器(TIMx_BAS)、高级定时器(TIMx_AF)和低功耗定时器(LPTIMx)。
### 4.1.2 定时器配置
STM32单片机的定时器可以通过寄存器进行配置。常用的寄存器包括:
* **CR1寄存器:**控制定时器的时钟源、计数模式、预分频器和溢出中断使能。
* **PSC寄存器:**预分频器寄存器,用于设置定时器时钟的预分频系数。
* **ARR寄存器:**自动重装载寄存器,用于设置定时器的重装载值。
* **CNT寄存器:**计数器寄存器,用于存储当前的计数值。
### 4.1.3 定时器中断
定时器可以产生中断,当计数器达到预定的值时触发中断。中断服务程序可以通过读取SR寄存器来确定中断源。
### 4.1.4 定时器应用实例
定时器在STM32单片机中有着广泛的应用,例如:
* **产生PWM波形:**通过配置定时器的输出比较寄存器,可以产生PWM波形。
* **测量脉冲宽度:**通过配置定时器的输入捕获寄存器,可以测量脉冲的宽度。
* **产生延时:**通过配置定时器的重装载值,可以产生精确的延时。
## 4.2 中断应用
### 4.2.1 中断简介
中断是一种硬件机制,当发生特定的事件时,中断服务程序会暂停当前正在执行的程序并执行中断服务程序。STM32单片机支持多种中断源,包括外部中断、定时器中断和串口中断。
### 4.2.2 中断配置
STM32单片机的中断可以通过寄存器进行配置。常用的寄存器包括:
* **NVIC_ISERx寄存器:**中断使能寄存器,用于使能特定的中断源。
* **NVIC_ICERx寄存器:**中断禁止寄存器,用于禁止特定的中断源。
* **NVIC_ISPRx寄存器:**中断挂起寄存器,用于挂起特定的中断源。
* **NVIC_IPRx寄存器:**中断优先级寄存器,用于设置特定中断源的优先级。
### 4.2.3 中断服务程序
当发生中断时,会执行中断服务程序。中断服务程序通常包含以下步骤:
* **保存寄存器:**保存当前正在执行的程序的寄存器值。
* **处理中断:**执行中断处理逻辑。
* **恢复寄存器:**恢复当前正在执行的程序的寄存器值。
### 4.2.4 中断应用实例
中断在STM32单片机中有着广泛的应用,例如:
* **按键处理:**通过配置外部中断,可以处理按键的按下和释放事件。
* **串口通信:**通过配置串口中断,可以处理串口数据的接收和发送事件。
* **定时器事件处理:**通过配置定时器中断,可以处理定时器溢出或捕获事件。
## 4.3 PWM应用
### 4.3.1 PWM简介
PWM(脉冲宽度调制)是一种调制技术,通过改变脉冲的宽度来控制输出的平均值。STM32单片机支持多种PWM输出通道,可以用来控制电机、LED和扬声器等设备。
### 4.3.2 PWM配置
STM32单片机的PWM输出可以通过寄存器进行配置。常用的寄存器包括:
* **TIMx_CCR1寄存器:**通道1比较寄存器,用于设置PWM输出的占空比。
* **TIMx_PSC寄存器:**预分频器寄存器,用于设置PWM输出的频率。
* **TIMx_ARR寄存器:**自动重装载寄存器,用于设置PWM输出的周期。
### 4.3.3 PWM输出
配置好PWM输出后,可以通过设置TIMx_CCR1寄存器来改变PWM输出的占空比。占空比的计算公式为:
```
占空比 = TIMx_CCR1 / TIMx_ARR
```
### 4.3.4 PWM应用实例
PWM在STM32单片机中有着广泛的应用,例如:
* **电机控制:**通过控制PWM输出的占空比,可以控制电机的转速和方向。
* **LED调光:**通过控制PWM输出的占空比,可以调节LED的亮度。
* **扬声器发声:**通过控制PWM输出的占空比,可以改变扬声器的音调和音量。
# 5.1 数字时钟项目
### 项目概述
数字时钟项目是一个使用STM32单片机实现的时钟功能。该项目将展示如何使用STM32单片机的定时器和显示器外设来构建一个功能齐全的数字时钟。
### 硬件要求
* STM32单片机开发板
* 7段数码管
* 按键
* 电阻
* 电源
### 软件要求
* STM32CubeIDE开发环境
* STM32CubeMX配置工具
### 项目实现
#### 1. 时钟初始化
```cpp
// 初始化定时器
TIM_HandleTypeDef htim;
htim.Instance = TIM2;
htim.Init.Prescaler = 10000;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 1000;
HAL_TIM_Base_Init(&htim);
// 启动定时器
HAL_TIM_Base_Start_IT(&htim);
```
#### 2. 数码管显示
```cpp
// 初始化数码管
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;
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);
// 显示数字
void displayNumber(uint8_t number) {
switch (number) {
case 0:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
break;
// ...省略其他数字的显示代码
}
}
```
#### 3. 按键输入
```cpp
// 初始化按键
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 检测按键按下
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) {
// 按键按下,执行相应操作
}
```
#### 4. 时间更新
```cpp
// 定时器中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
// 更新时间
// ...省略更新时间代码
// 显示时间
displayNumber(hour);
displayNumber(minute);
displayNumber(second);
}
```
### 总结
本项目展示了如何使用STM32单片机的定时器、数码管和按键来构建一个功能齐全的数字时钟。通过对硬件和软件的详细讲解,读者可以掌握STM32单片机开发的基本知识和技能。
0
0