【STC单片机和STM32从入门到精通】:揭秘单片机核心技术,助你快速掌握单片机开发
发布时间: 2024-07-04 05:18:34 阅读量: 115 订阅数: 71
单片机技术实战-基于STC51和STM32
![【STC单片机和STM32从入门到精通】:揭秘单片机核心技术,助你快速掌握单片机开发](https://dl-preview.csdnimg.cn/86831816/0004-3178df5de972453ca8348411741f6524_preview-wide.png)
# 1. STC单片机基础知识**
STC单片机是一种8位微控制器,广泛应用于嵌入式系统中。其特点包括低功耗、高性能和易于使用。
STC单片机具有丰富的片上外设,包括定时器、中断、ADC和DAC等。这些外设使STC单片机能够处理各种任务,例如数据采集、电机控制和通信。
STC单片机采用哈佛架构,具有独立的程序存储器和数据存储器。这使得STC单片机能够同时执行程序和访问数据,从而提高了执行效率。
# 2. STC单片机编程技巧
### 2.1 STC单片机开发环境和工具链
#### 2.1.1 Keil uVision5开发环境介绍
Keil uVision5是一款功能强大的集成开发环境(IDE),专门针对嵌入式系统开发。它提供了一个直观的用户界面、强大的调试功能和丰富的软件库。
**特点:**
* 支持多种STC单片机型号
* 集成编辑器、编译器、调试器和仿真器
* 提供丰富的软件库和示例代码
* 具有图形化界面,易于使用
#### 2.1.2 STC单片机编译器和调试器
STC单片机编译器将源代码编译成机器代码,而调试器则用于调试和分析程序。
**STC单片机编译器:**
* 支持STC单片机指令集
* 优化代码性能和代码大小
* 提供错误和警告信息
**STC单片机调试器:**
* 支持单步调试、断点设置和寄存器查看
* 提供内存和外设访问功能
* 允许在目标板上执行和调试程序
### 2.2 STC单片机寄存器和指令集
#### 2.2.1 STC单片机寄存器结构
STC单片机具有丰富的寄存器,用于存储数据、控制程序执行和配置外设。
**主要寄存器:**
* 程序计数器(PC):存储当前执行的指令地址
* 累加器(ACC):用于算术和逻辑运算
* 数据指针(DPTR):指向数据存储器的地址
* 堆栈指针(SP):指向堆栈的顶部
#### 2.2.2 STC单片机指令集详解
STC单片机指令集包括各种指令,用于执行算术、逻辑、数据传输和控制流操作。
**指令类型:**
* 算术指令:加、减、乘、除
* 逻辑指令:与、或、非
* 数据传输指令:移动、加载、存储
* 控制流指令:跳转、分支、返回
### 2.3 STC单片机中断和定时器
#### 2.3.1 STC单片机中断系统
STC单片机具有一个中断系统,允许外部事件触发程序执行的暂停和跳转。
**中断源:**
* 外部中断:来自外部引脚的信号
* 内部中断:来自定时器、ADC等外设
**中断处理:**
* 中断向量表:存储中断服务程序的地址
* 中断服务程序:处理中断事件的代码
#### 2.3.2 STC单片机定时器功能
STC单片机具有多个定时器,用于生成精确的时间间隔和脉冲。
**定时器功能:**
* 定时模式:生成可编程时间间隔
* 脉冲模式:生成可编程脉冲宽度
* 捕获模式:捕获外部事件的时间戳
**定时器配置:**
```c
// 初始化定时器0为定时模式
TMOD &= ~0x0F; // 清除TMOD寄存器低4位
TMOD |= 0x01; // 设置定时器0为定时模式
```
# 3. STC单片机实践应用
### 3.1 STC单片机I/O端口操作
#### 3.1.1 STC单片机I/O端口配置
STC单片机的I/O端口配置寄存器主要包括P0M0、P0M1、P1M0、P1M1、P2M0、P2M1、P3M0和P3M1。这些寄存器用于配置I/O端口的模式和功能。
| 寄存器 | 功能 |
|---|---|
| P0M0 | P0端口0~3位模式配置寄存器 |
| P0M1 | P0端口4~7位模式配置寄存器 |
| P1M0 | P1端口0~3位模式配置寄存器 |
| P1M1 | P1端口4~7位模式配置寄存器 |
| P2M0 | P2端口0~3位模式配置寄存器 |
| P2M1 | P2端口4~7位模式配置寄存器 |
| P3M0 | P3端口0~3位模式配置寄存器 |
| P3M1 | P3端口4~7位模式配置寄存器 |
**配置步骤:**
1. 确定要配置的I/O端口。
2. 根据需要配置P0M0~P3M1寄存器的相应位。
3. 0表示输入模式,1表示输出模式。
**示例:**
```c
// 将P0.0配置为输入模式
P0M0 &= ~(1 << 0);
```
#### 3.1.2 STC单片机I/O端口读写
STC单片机的I/O端口读写寄存器主要包括P0、P1、P2和P3。这些寄存器用于读写I/O端口的数据。
| 寄存器 | 功能 |
|---|---|
| P0 | P0端口数据寄存器 |
| P1 | P1端口数据寄存器 |
| P2 | P2端口数据寄存器 |
| P3 | P3端口数据寄存器 |
**读操作:**
```c
// 读取P0.0的值
uint8_t data = P0 & (1 << 0);
```
**写操作:**
```c
// 将0x55写入P0.0~P0.7
P0 = 0x55;
```
### 3.2 STC单片机ADC和DAC
#### 3.2.1 STC单片机ADC模块
STC单片机的ADC模块用于将模拟信号转换为数字信号。主要寄存器包括ADCCFG、ADCRES、ADCCON和ADCDATA。
| 寄存器 | 功能 |
|---|---|
| ADCCFG | ADC配置寄存器 |
| ADCRES | ADC结果寄存器 |
| ADCCON | ADC控制寄存器 |
| ADCDATA | ADC数据寄存器 |
**配置步骤:**
1. 配置ADCCFG寄存器,选择参考电压和采样时间。
2. 配置ADCCON寄存器,开启ADC模块和选择转换通道。
3. 启动ADC转换。
4. 读取ADCDATA寄存器获取转换结果。
**示例:**
```c
// 配置ADC模块,使用内部参考电压,采样时间为12个时钟周期
ADCCFG = 0x00;
// 开启ADC模块,选择通道0
ADCCON = 0x80;
// 启动ADC转换
ADCCON |= 0x40;
// 读取ADC转换结果
uint16_t adc_data = ADCDATA;
```
#### 3.2.2 STC单片机DAC模块
STC单片机的DAC模块用于将数字信号转换为模拟信号。主要寄存器包括DACCON和DACDATA。
| 寄存器 | 功能 |
|---|---|
| DACCON | DAC控制寄存器 |
| DACDATA | DAC数据寄存器 |
**配置步骤:**
1. 配置DACCON寄存器,选择参考电压和输出模式。
2. 将数据写入DACDATA寄存器。
**示例:**
```c
// 配置DAC模块,使用内部参考电压,输出模式为电压输出
DACCON = 0x00;
// 将0x55写入DACDATA寄存器,输出电压为VREF * 0x55 / 256
DACDATA = 0x55;
```
### 3.3 STC单片机通信接口
#### 3.3.1 STC单片机UART通信
STC单片机的UART模块用于串口通信。主要寄存器包括SCON、SBUF、SMOD和SM2。
| 寄存器 | 功能 |
|---|---|
| SCON | UART控制寄存器 |
| SBUF | UART数据缓冲寄存器 |
| SMOD | UART波特率发生器寄存器 |
| SM2 | UART模式寄存器 |
**配置步骤:**
1. 配置SCON寄存器,选择数据位、停止位和奇偶校验。
2. 配置SMOD和SM2寄存器,设置波特率。
3. 将数据写入SBUF寄存器发送数据。
4. 从SBUF寄存器读取数据接收数据。
**示例:**
```c
// 配置UART模块,使用8位数据位,1个停止位,无奇偶校验,波特率为9600bps
SCON = 0x50;
SMOD = 0x67;
SM2 = 0x00;
// 发送数据
SBUF = 'A';
// 接收数据
uint8_t data = SBUF;
```
#### 3.3.2 STC单片机I2C通信
STC单片机的I2C模块用于I2C总线通信。主要寄存器包括I2CADR、I2CDAT和I2CCON。
| 寄存器 | 功能 |
|---|---|
| I2CADR | I2C地址寄存器 |
| I2CDAT | I2C数据寄存器 |
| I2CCON | I2C控制寄存器 |
**配置步骤:**
1. 配置I2CADR寄存器,设置设备地址。
2. 配置I2CCON寄存器,选择I2C模式和波特率。
3. 将数据写入I2CDAT寄存器发送数据。
4. 从I2CDAT寄存器读取数据接收数据。
**示例:**
```c
// 配置I2C模块,设备地址为0x55,波特率为100kbps
I2CADR = 0x55;
I2CCON = 0x00;
// 发送数据
I2CDAT = 'A';
// 接收数据
uint8_t data = I2CDAT;
```
# 4. STM32单片机基础知识**
**4.1 STM32单片机架构和特性**
**4.1.1 STM32单片机内核结构**
STM32单片机采用ARM Cortex-M系列内核,具有高性能、低功耗的特点。常见的内核类型包括Cortex-M0、Cortex-M3、Cortex-M4和Cortex-M7。这些内核具有不同的性能和外设资源,满足不同的应用需求。
STM32单片机的内核结构主要包括:
* **程序计数器(PC):**存储当前正在执行的指令的地址。
* **堆栈指针(SP):**存储函数调用和中断处理过程中保存寄存器值的位置。
* **寄存器组:**包括通用寄存器(R0-R15)、程序状态寄存器(PSR)和控制寄存器。
* **浮点单元(FPU):**用于进行浮点运算(仅在某些内核中可用)。
**4.1.2 STM32单片机外设资源**
STM32单片机集成了丰富的片上外设,包括:
* **通用输入/输出(GPIO):**用于控制外部设备和传感器。
* **定时器:**用于生成脉冲、测量时间和创建延时。
* **中断控制器:**用于处理外部事件和内部中断。
* **串行通信接口:**包括UART、I2C和SPI,用于与其他设备通信。
* **模数转换器(ADC):**用于将模拟信号转换为数字信号。
* **数模转换器(DAC):**用于将数字信号转换为模拟信号。
**4.2 STM32单片机编程环境和工具链**
**4.2.1 STM32CubeIDE开发环境介绍**
STM32CubeIDE是STM官方提供的集成开发环境(IDE),专为STM32单片机开发而设计。它集成了代码编辑器、编译器、调试器和外设配置工具,提供了友好的开发体验。
**4.2.2 STM32单片机编译器和调试器**
STM32单片机使用ARM编译器(如ARM Compiler 6)进行编译,并使用ARM调试器(如ARM Debugger)进行调试。这些工具可以帮助开发者快速定位和修复代码中的错误。
**代码块:STM32CubeIDE代码模板**
```cpp
// STM32CubeIDE代码模板
#include "stm32f1xx_hal.h"
int main(void)
{
HAL_Init();
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
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);
// 循环点亮LED
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);
}
}
```
**逻辑分析:**
这段代码使用HAL库函数初始化GPIO引脚并循环点亮LED。
* `HAL_Init()`:初始化STM32单片机的硬件抽象层(HAL)。
* `GPIO_InitStruct`:定义GPIO引脚配置参数。
* `HAL_GPIO_Init()`:初始化GPIO引脚。
* `HAL_GPIO_WritePin()`:设置或复位GPIO引脚。
* `HAL_Delay()`:产生延时。
**参数说明:**
* `GPIO_InitStruct.Pin`:要配置的GPIO引脚。
* `GPIO_InitStruct.Mode`:GPIO引脚模式(输入、输出、中断等)。
* `GPIO_InitStruct.Pull`:GPIO引脚上拉/下拉电阻。
* `GPIO_InitStruct.Speed`:GPIO引脚速度(低速、中速、高速)。
* `GPIOC`:GPIO端口(C端口)。
* `GPIO_PIN_13`:GPIO引脚(13号引脚)。
* `GPIO_PIN_SET`:设置GPIO引脚为高电平。
* `GPIO_PIN_RESET`:设置GPIO引脚为低电平。
* `500`:延时时间(单位:毫秒)。
# 5. STM32单片机实践应用**
**5.1 STM32单片机GPIO操作**
STM32单片机的通用输入/输出(GPIO)端口是单片机与外部设备进行数据交互的重要接口。GPIO端口可以配置为输入、输出或模拟输入等多种模式,为用户提供了灵活的应用选择。
**5.1.1 STM32单片机GPIO配置**
GPIO端口的配置主要涉及以下几个方面:
- **端口选择:**STM32单片机有多个GPIO端口,需要根据具体应用选择合适的端口。
- **引脚选择:**每个GPIO端口有多个引脚,需要选择要使用的引脚。
- **模式配置:**GPIO引脚可以配置为输入、输出、推挽输出、开漏输出或模拟输入等模式。
- **速率配置:**GPIO引脚可以配置为不同的速率,以满足不同的应用需求。
- **上拉/下拉电阻:**GPIO引脚可以配置上拉或下拉电阻,以防止引脚悬空。
GPIO端口的配置可以通过寄存器操作来实现。STM32单片机提供了丰富的GPIO寄存器,可以对GPIO端口的各个方面进行精细的控制。
**5.1.2 STM32单片机GPIO读写**
GPIO端口的读写操作非常简单,可以通过寄存器操作来实现。STM32单片机提供了以下几个寄存器来进行GPIO读写:
- **数据寄存器(GPIOx_ODR):**用于读写GPIO端口的数据。
- **输出数据寄存器(GPIOx_ODR):**用于设置GPIO端口的输出数据。
- **输入数据寄存器(GPIOx_IDR):**用于读取GPIO端口的输入数据。
GPIO端口的读写操作可以通过以下步骤进行:
1. 配置GPIO端口的模式和速率。
2. 读写GPIOx_ODR寄存器来设置或读取GPIO端口的数据。
**代码示例:**
```c
// 配置GPIOA的第5个引脚为输出模式
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
GPIOA->MODER &= ~GPIO_MODER_MODE5;
GPIOA->MODER |= GPIO_MODER_MODE5_0;
// 设置GPIOA的第5个引脚输出高电平
GPIOA->ODR |= GPIO_ODR_OD5;
// 读取GPIOA的第5个引脚输入数据
uint8_t data = GPIOA->IDR & GPIO_IDR_ID5;
```
0
0