【STM32单片机入门指南】:揭开嵌入式世界的奥秘,轻松上手STM32
发布时间: 2024-07-03 07:21:26 阅读量: 5 订阅数: 12 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![【STM32单片机入门指南】:揭开嵌入式世界的奥秘,轻松上手STM32](https://img-blog.csdnimg.cn/5903670652a243edb66b0e8e6199b383.jpg)
# 1. STM32单片机简介**
STM32单片机是意法半导体(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的高性能微控制器。它以其强大的处理能力、丰富的片上外设和低功耗特性而著称,广泛应用于工业控制、物联网、医疗设备等领域。
STM32单片机采用哈佛架构,具有独立的指令和数据存储器,提高了执行效率。其核心架构基于ARM Cortex-M系列内核,包括Cortex-M0、Cortex-M3、Cortex-M4和Cortex-M7,提供从低功耗到高性能的广泛选择。
# 2. STM32单片机硬件架构
STM32单片机是意法半导体(STMicroelectronics)公司生产的一系列32位微控制器,广泛应用于工业控制、物联网、医疗电子等领域。其硬件架构主要包括核心架构和外设资源两部分。
### 2.1 STM32单片机的核心架构
STM32单片机的核心架构采用ARM Cortex-M系列内核,该系列内核具有低功耗、高性能和丰富的指令集等特点。
#### 2.1.1 Cortex-M内核系列
Cortex-M内核系列包括Cortex-M0、Cortex-M0+、Cortex-M1、Cortex-M3、Cortex-M4、Cortex-M7和Cortex-M23等多种型号,每种型号针对不同的应用场景进行了优化。
| Cortex-M内核 | 特点 |
|---|---|
| Cortex-M0 | 低功耗、低成本,适合于简单控制应用 |
| Cortex-M0+ | 增强了Cortex-M0,增加了浮点运算单元,适合于对性能要求稍高的应用 |
| Cortex-M1 | 具有DSP指令集,适合于数字信号处理应用 |
| Cortex-M3 | 性能更强,具有更高的时钟频率和更多的外设接口,适合于复杂控制应用 |
| Cortex-M4 | 在Cortex-M3的基础上增加了浮点运算单元,适合于对浮点运算要求较高的应用 |
| Cortex-M7 | 性能最强,具有更高的时钟频率、更多的外设接口和丰富的指令集,适合于高性能应用 |
| Cortex-M23 | 专为低功耗应用而设计,具有超低功耗模式和丰富的省电技术 |
#### 2.1.2 内存系统
STM32单片机的内存系统主要包括以下几种类型:
- **Flash存储器:**用于存储程序代码和数据,具有高可靠性和非易失性。
- **SRAM:**用于存储程序数据和临时变量,具有高速度和易失性。
- **EEPROM:**用于存储需要长期保存的数据,具有高可靠性和可擦写性。
STM32单片机的内存大小和类型根据不同的型号而异,一般来说,Flash存储器容量从几KB到几MB,SRAM容量从几KB到几十KB,EEPROM容量从几KB到几百KB。
### 2.2 STM32单片机的外设资源
STM32单片机的外设资源非常丰富,包括通用输入/输出(GPIO)、定时器和计数器、通信外设等。
#### 2.2.1 通用输入/输出(GPIO)
GPIO是STM32单片机上最基本的输入/输出接口,可以用于连接各种外部设备,如LED、按键、传感器等。GPIO具有以下特点:
- **可配置性:**每个GPIO引脚可以配置为输入、输出、模拟输入或其他功能。
- **中断功能:**GPIO引脚可以触发中断,当引脚状态发生变化时,可以通知处理器进行响应。
- **复用功能:**GPIO引脚可以复用为其他外设的功能,如定时器、通信外设等。
#### 2.2.2 定时器和计数器
定时器和计数器是STM32单片机上常用的外设,可以用于产生脉冲、测量时间、产生PWM信号等。STM32单片机上有多种类型的定时器和计数器,包括通用定时器、高级定时器、基本定时器等。
| 定时器类型 | 特点 |
|---|---|
| 通用定时器 | 功能简单,可以产生脉冲、测量时间等 |
| 高级定时器 | 功能更强大,可以产生PWM信号、捕获输入信号等 |
| 基本定时器 | 功耗低,适合于低功耗应用 |
#### 2.2.3 通信外设
STM32单片机上集成了丰富的通信外设,包括串口、I2C、SPI、CAN等。这些外设可以用于与其他设备进行数据通信。
| 通信外设 | 特点 |
|---|---|
| 串口 | 用于异步串行通信,可以与其他设备交换数据 |
| I2C | 用于同步串行通信,可以与其他设备交换数据 |
| SPI | 用于高速串行通信,可以与其他设备交换数据 |
| CAN | 用于工业控制网络通信,可以与其他设备交换数据 |
# 3. STM32单片机开发环境搭建
### 3.1 IDE选择和安装
**3.1.1 Keil MDK**
Keil MDK(Microcontroller Development Kit)是ARM官方提供的集成开发环境(IDE),专为ARM Cortex-M内核的单片机开发而设计。它包含了编译器、调试器、仿真器和各种开发工具。
**安装步骤:**
1. 从ARM官网下载Keil MDK安装包。
2. 运行安装程序并按照提示进行安装。
3. 安装完成后,启动Keil MDK并选择“File”->“New”->“Project”创建一个新项目。
**3.1.2 IAR Embedded Workbench**
IAR Embedded Workbench是IAR Systems公司提供的另一款流行的IDE,也适用于ARM Cortex-M内核的单片机开发。它提供了强大的编译器、调试器和代码分析工具。
**安装步骤:**
1. 从IAR Systems官网下载IAR Embedded Workbench安装包。
2. 运行安装程序并按照提示进行安装。
3. 安装完成后,启动IAR Embedded Workbench并选择“File”->“New”->“Project”创建一个新项目。
### 3.2 编译器和调试器配置
**3.2.1 编译器选项**
**Keil MDK:**
* 在“Project”窗口中,右键单击项目并选择“Options for Target”。
* 在“Options”对话框中,选择“C/C++”选项卡。
* 在“Optimization”部分中,可以配置优化级别和其他编译器选项。
**IAR Embedded Workbench:**
* 在“Project”窗口中,右键单击项目并选择“Options”。
* 在“Options”对话框中,选择“Compiler”选项卡。
* 在“Optimization”部分中,可以配置优化级别和其他编译器选项。
**3.2.2 调试器设置**
**Keil MDK:**
* 在“Project”窗口中,右键单击项目并选择“Options for Target”。
* 在“Options”对话框中,选择“Debug”选项卡。
* 在“Debugger”部分中,可以配置调试器设置,例如调试端口和仿真速度。
**IAR Embedded Workbench:**
* 在“Project”窗口中,右键单击项目并选择“Options”。
* 在“Options”对话框中,选择“Debugger”选项卡。
* 在“Connection”部分中,可以配置调试器设置,例如调试端口和仿真速度。
**代码块:**
```c
#include <stm32f10x.h>
int main(void)
{
// 配置 GPIOA 的第 5 个引脚为输出模式
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRH &= ~(GPIO_CRH_MODE5);
GPIOA->CRH |= GPIO_CRH_MODE5_0;
// 配置定时器 2 为向上计数模式
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->CR1 &= ~TIM_CR1_DIR;
// 设置定时器 2 的预分频器和重装载值
TIM2->PSC = 7200 - 1;
TIM2->ARR = 1000 - 1;
// 启用定时器 2
TIM2->CR1 |= TIM_CR1_CEN;
while (1)
{
// 如果定时器 2 的溢出标志位已设置,则翻转 GPIOA 的第 5 个引脚
if (TIM2->SR & TIM_SR_UIF)
{
GPIOA->ODR ^= GPIO_ODR_ODR5;
TIM2->SR &= ~TIM_SR_UIF;
}
}
}
```
**逻辑分析:**
* 该代码配置了STM32F10x单片机的GPIOA和TIM2外设。
* GPIOA的第5个引脚被配置为输出模式,用于控制LED。
* TIM2被配置为向上计数模式,并设置了预分频器和重装载值,以产生1秒的定时中断。
* 在主循环中,程序不断检查TIM2的溢出标志位。
* 当溢出标志位被设置时,程序翻转GPIOA的第5个引脚,从而控制LED闪烁。
**参数说明:**
* `RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;`:使能GPIOA时钟。
* `GPIOA->CRH &= ~(GPIO_CRH_MODE5);`:清除GPIOA第5个引脚的模式位。
* `GPIOA->CRH |= GPIO_CRH_MODE5_0;`:将GPIOA第5个引脚配置为输出模式。
* `RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;`:使能TIM2时钟。
* `TIM2->CR1 &= ~TIM_CR1_DIR;`:将TIM2配置为向上计数模式。
* `TIM2->PSC = 7200 - 1;`:设置TIM2的预分频器为7200。
* `TIM2->ARR = 1000 - 1;`:设置TIM2的重装载值为1000。
* `TIM2->CR1 |= TIM_CR1_CEN;`:使能TIM2。
* `if (TIM2->SR & TIM_SR_UIF)`:检查TIM2的溢出标志位是否已设置。
* `GPIOA->ODR ^= GPIO_ODR_ODR5;`:翻转GPIOA的第5个引脚。
* `TIM2->SR &= ~TIM_SR_UIF;`:清除TIM2的溢出标志位。
# 4. STM32单片机编程基础
### 4.1 C语言基础
#### 4.1.1 数据类型和变量
C语言中,数据类型决定了变量存储的数据类型和范围。常用的数据类型包括:
| 数据类型 | 描述 | 范围 |
|---|---|---|
| int | 整数 | -2^31 ~ 2^31-1 |
| float | 浮点数 | 1.175494351e-38 ~ 3.402823466e+38 |
| double | 双精度浮点数 | 2.2250738585072014e-308 ~ 1.7976931348623157e+308 |
| char | 字符 | ASCII码值 |
变量用于存储数据,其声明语法为:
```c
<数据类型> <变量名>;
```
例如:
```c
int count;
float temperature;
```
#### 4.1.2 运算符和表达式
运算符用于执行算术、逻辑和关系运算。常用的运算符包括:
| 运算符 | 描述 |
|---|---|
| + | 加法 |
| - | 减法 |
| * | 乘法 |
| / | 除法 |
| % | 取模 |
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
表达式由运算符和操作数组成,用于计算结果。例如:
```c
int result = 10 + 20; // result = 30
```
### 4.2 STM32单片机编程规范
为了确保代码的可读性和可维护性,STM32单片机编程遵循特定的规范。
#### 4.2.1 命名约定
变量、函数和宏的命名应遵循以下规则:
* 使用小写字母和数字
* 使用下划线(_)分隔单词
* 避免使用特殊字符(如 !, @, #)
* 使用有意义的名称,反映变量或函数的用途
例如:
```c
int led_status;
void gpio_init();
#define LED_PORT GPIOA
```
#### 4.2.2 代码风格
代码风格应遵循以下准则:
* 使用缩进和换行符使代码易于阅读
* 使用注释解释复杂的代码段
* 遵循一致的代码格式,如大括号和分号的放置
* 避免使用冗长的代码行
* 使用适当的命名约定和数据类型
# 5.1 LED闪烁程序
### 5.1.1 GPIO配置
LED闪烁程序需要使用GPIO外设来控制LED的亮灭。STM32单片机有多个GPIO端口,每个端口有16个GPIO引脚。LED闪烁程序通常使用GPIOA端口的第5个引脚(PA5)来控制LED。
```c
// 定义LED引脚
#define LED_PIN GPIO_PIN_5
// 初始化GPIO引脚
void GPIO_Init(void) {
// 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 配置PA5为输出模式
GPIOA->CRH &= ~(GPIO_CRH_MODE5);
GPIOA->CRH |= GPIO_CRH_MODE5_0;
}
```
### 5.1.2 定时器配置
LED闪烁程序需要使用定时器来控制LED的闪烁频率。STM32单片机有多个定时器,每个定时器有不同的功能和配置选项。LED闪烁程序通常使用TIM2定时器。
```c
// 定义定时器时钟频率
#define TIM_CLOCK_FREQ 72000000
// 初始化定时器
void TIM2_Init(void) {
// 使能TIM2时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// 配置TIM2为向上计数模式
TIM2->CR1 &= ~TIM_CR1_DIR;
// 设置TIM2的预分频系数
TIM2->PSC = TIM_CLOCK_FREQ / 1000 - 1;
// 设置TIM2的自动重装载值
TIM2->ARR = 1000 - 1;
// 使能TIM2的中断
TIM2->DIER |= TIM_DIER_UIE;
// 启动TIM2
TIM2->CR1 |= TIM_CR1_CEN;
}
```
### 中断服务函数
当TIM2的中断发生时,会执行中断服务函数。中断服务函数中需要更新LED的状态,以实现LED的闪烁。
```c
// TIM2中断服务函数
void TIM2_IRQHandler(void) {
// 清除TIM2的中断标志位
TIM2->SR &= ~TIM_SR_UIF;
// 更新LED的状态
GPIOA->ODR ^= LED_PIN;
}
```
0
0
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)