STM32外设应用知识详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Unity中实现预制体自动巡逻与攻击敌人的完整实现指南
文章目录
前言
STM32是一系列由意法半导体(STMicroelectronics)推出的32位ARM Cortex-M微控制器产品线。这些微控制器具有丰富的外设功能,可以广泛应用于各种嵌入式系统中。
在现代嵌入式系统设计中,STM32系列微控制器由意法半导体(STMicroelectronics)推出,以其强大的32位ARM Cortex-M架构和丰富的外设功能而闻名。本文将深入探讨STM32微控制器的各种外设及其应用知识,包括GPIO、USART/UART、SPI、I2C、ADC/DAC、定时器/计数器、中断控制器和看门狗定时器等。通过对这些外设的详细解析,读者将能够更好地理解如何利用STM32微控制器构建高效、可靠的嵌入式系统。让我们一起深入探讨STM32外设的精彩世界,为嵌入式系统设计带来更多可能性和创新!
1、GPIO(通用输入输出)
GPIO(通用输入输出)是STM32微控制器上最基本的外设之一,用于控制外部设备的输入和输出。GPIO引脚可以根据需要配置为输入模式或输出模式,以实现与外部设备的连接和通信。
定义:
GPIO是一种通用的输入输出外设,可以通过配置控制寄存器来控制引脚的输入和输出状态。每个GPIO引脚都可以配置为输入模式(用于接收外部信号)或输出模式(用于向外部设备发送信号)。
特点:
- 灵活性:GPIO引脚可以根据需要配置为输入或输出模式,具有很高的灵活性。
- 多功能性:除了基本的输入输出功能,GPIO引脚还可以配置为其他功能,如模拟输入、复用功能等。
- 可编程性:通过编程配置GPIO寄存器,可以实现对引脚的各种属性设置,如工作模式、速度、上拉/下拉等。
应用:
- 控制外部设备:通过配置GPIO引脚为输出模式,可以控制外部LED、继电器、蜂鸣器等设备的开关状态。
- 读取外部信号:通过配置GPIO引脚为输入模式,可以读取外部传感器、按钮等设备的状态。
- 实现通信:GPIO引脚也可以用于实现简单的通信协议,如控制SPI或I2C总线的片选信号。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的GPIO引脚为输出模式,并控制LED灯的开关状态:
#include "stm32f4xx.h"
int main(void) {
// 使能GPIOA时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// 配置GPIOA的第5号引脚为输出模式
GPIOA->MODER |= GPIO_MODER_MODER5_0;
while (1) {
// 点亮LED
GPIOA->BSRR = GPIO_BSRR_BS5;
// 延时一段时间
for (int i = 0; i < 1000000; i++);
// 熄灭LED
GPIOA->BSRR = GPIO_BSRR_BR5;
// 延时一段时间
for (int i = 0; i < 1000000; i++);
}
}
在这个示例中,我们使能了GPIOA的时钟,将第5号引脚配置为输出模式,然后循环中控制LED灯的开关状态,实现LED的闪烁效果。
2、USART/UART(通用异步同步收发器)
USART(通用同步异步收发器)和UART(通用异步收发器)是STM32微控制器中常见的串行通信外设,用于与其他设备进行数据传输。
定义:
- USART:USART是通用同步异步收发器,支持同步和异步通信模式。它可以实现高速数据传输,并具有更多的配置选项,如时钟极性、数据位数、停止位数等。
- UART:UART是通用异步收发器,仅支持异步通信模式。它相对简单,适用于一些基本的串行通信需求。
特点:
- USART:
- 支持同步和异步通信模式,适用于不同的通信需求。
- 可以配置更多的参数,如波特率、数据位数、停止位数等,具有更高的灵活性。
- 适用于高速数据传输,如音频、视频等应用场景。
- UART:
- 仅支持异步通信模式,相对简单,适用于一些基本的串行通信需求。
- 配置相对简单,适合一些对通信速度要求不高的场景。
应用:
- USART:
- 适用于需要高速数据传输和复杂通信协议的场景,如与传感器、显示器、无线模块等设备的通信。
- 可用于实现多种通信协议,如SPI、I2C等。
- UART:
- 适用于一些简单的串行通信需求,如与GPS模块、蓝牙模块等设备的通信。
- 在一些对通信速度要求不高的场景下,UART也可以满足需求。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的USART外设进行串行通信:
#include "stm32f4xx.h"
int main(void) {
// 使能USART2时钟
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
// 配置USART2引脚
GPIOA->AFR[0] |= 0x0700; // 配置引脚为USART2的复用功能
GPIOA->MODER |= GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1; // 配置引脚为复用模式
// 配置USART2
USART2->BRR = 0x1117; // 波特率设置为9600
USART2->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能发送和接收
while (1) {
// 发送数据
while (!(USART2->SR & USART_SR_TXE)); // 等待发送缓冲区为空
USART2->DR = 'A'; // 发送字符'A'
// 接收数据
while (!(USART2->SR & USART_SR_RXNE)); // 等待接收缓冲区非空
char received_data = USART2->DR; // 读取接收到的数据
}
}
3、SPI(串行外设接口)
SPI(串行外设接口)是STM32微控制器中常见的串行通信外设,用于高速全双工的串行通信,适用于连接外部存储器、传感器、显示器等设备。SPI具有主从模式和多主模式,可以实现高效的数据传输。
定义:
SPI是一种串行通信协议,用于在设备之间进行高速全双工的数据传输。SPI通常由一个主设备和一个或多个从设备组成,通过时钟信号同步数据传输。
特点:
- 高速全双工通信:SPI支持高速的全双工通信,可以实现同时发送和接收数据。
- 灵活的主从模式:SPI可以工作在主模式或从模式,主设备控制通信时序,从设备响应数据传输。
- 多主模式:SPI还支持多主模式,多个主设备可以共享同一个总线,通过片选信号选择通信对象。
应用:
- 连接外部存储器:SPI可以连接外部存储器,如EEPROM、Flash存储器等,实现数据的读写操作。
- 连接传感器:SPI常用于连接各种传感器,如加速度计、陀螺仪等,实现数据采集和传输。
- 连接显示器:SPI也常用于连接各种显示器,如LCD显示屏、OLED屏幕等,实现图形显示和数据传输。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的SPI外设进行数据传输:
#include "stm32f4xx.h"
int main(void) {
// 使能SPI1时钟
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
// 配置SPI1引脚
GPIOA->AFR[0] |= 0x55500000; // 配置引脚为SPI1的复用功能
GPIOA->MODER |= GPIO_MODER_MODER5_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1; // 配置引脚为复用模式
// 配置SPI1
SPI1->CR1 |= SPI_CR1_BR_0 | SPI_CR1_BR_1; // 设置波特率分频为 fPCLK/32
SPI1->CR1 |= SPI_CR1_MSTR; // 设置为主模式
SPI1->CR1 |= SPI_CR1_SSI | SPI_CR1_SSM; // 禁用软件从模式管理
SPI1->CR1 |= SPI_CR1_SPE; // 使能SPI1
while (1) {
// 发送数据
while (!(SPI1->SR & SPI_SR_TXE)); // 等待发送缓冲区为空
SPI1->DR = 0x55; // 发送数据0x55
// 接收数据
while (!(SPI1->SR & SPI_SR_RXNE)); // 等待接收缓冲区非空
uint8_t received_data = SPI1->DR; // 读取接收到的数据
}
}
4、I2C(Inter-Integrated Circuit)
I2C(Inter-Integrated Circuit)是一种常见的串行通信协议,适用于连接多个设备到同一总线上,实现设备之间的数据传输和通信。I2C具有多主模式和多从模式,适用于连接各种外部设备。
定义:
I2C是一种双线制的串行通信协议,包括时钟线(SCL)和数据线(SDA)。通过SCL线上的时钟信号同步数据传输,SDA线上的数据线用于发送和接收数据。I2C总线上可以连接多个主设备和多个从设备。
特点:
- 双线制通信:I2C使用双线制(时钟线和数据线)进行通信,简化了硬件连接。
- 多主模式:I2C支持多主模式,多个主设备可以共享同一个总线,通过地址冲突解决机制实现通信。
- 多从模式:I2C也支持多从模式,多个从设备可以在同一总线上与主设备通信。
应用:
- 连接传感器:I2C常用于连接各种传感器,如温度传感器、湿度传感器等,实现数据采集和传输。
- 连接显示器:I2C也常用于连接各种显示器,如LCD显示屏、OLED屏幕等,实现图形显示和数据传输。
- 连接外部存储器:I2C可以连接外部存储器,如EEPROM、SRAM等,实现数据的读写操作。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的I2C外设进行数据传输:
#include "stm32f4xx.h"
int main(void) {
// 使能I2C1时钟
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
// 配置I2C1引脚
GPIOB->AFR[0] |= 0x44000000; // 配置引脚为I2C1的复用功能
GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1; // 配置引脚为复用模式
// 配置I2C1
I2C1->CR2 |= 42; // 设置时钟频率为42MHz
I2C1->CCR |= 210; // 设置时钟控制寄存器
I2C1->TRISE |= 43; // 设置上升时间
I2C1->CR1 |= I2C_CR1_PE; // 使能I2C1
while (1) {
// 发送数据
I2C1->CR1 |= I2C_CR1_START; // 发送起始信号
while (!(I2C1->SR1 & I2C_SR1_SB)); // 等待起始信号发送完成
I2C1->DR = 0xA0; // 发送从设备地址
// 接收数据
while (!(I2C1->SR1 & I2C_SR1_ADDR)); // 等待地址发送完成
I2C1->SR2; // 清除标志位
while (!(I2C1->SR1 & I2C_SR1_RXNE)); // 等待接收缓冲区非空
uint8_t received_data = I2C1->DR; // 读取接收到的数据
}
}
5、ADC/DAC(模数转换器/数模转换器)
ADC(模数转换器)和DAC(数模转换器)是用于模拟信号和数字信号之间的转换的重要外设。ADC用于将模拟信号转换为数字信号,而DAC用于将数字信号转换为模拟信号。它们在各种应用中起着关键作用,如传感器数据采集、音频处理、控制模拟设备等。
定义:
- ADC:ADC是模数转换器,用于将模拟信号转换为数字信号。它通过采样和量化模拟信号,将其转换为数字形式,以便微控制器或处理器进行处理。
- DAC:DAC是数模转换器,用于将数字信号转换为模拟信号。它通过将数字信号转换为模拟电压或电流输出,控制模拟设备的行为。
特点:
- ADC:
- 采样精度:ADC的采样精度决定了转换后数字信号的精度,通常以位数(比特)表示。
- 采样速率:ADC的采样速率表示每秒采样的次数,影响信号的准确性和响应速度。
- 输入范围:ADC能够转换的模拟信号的电压范围。
- DAC:
- 分辨率:DAC的分辨率表示数字信号转换为模拟信号时的精度,通常以位数(比特)表示。
- 输出范围:DAC能够输出的模拟信号的电压范围。
- 更新速率:DAC的更新速率表示输出信号的变化速度,影响模拟设备的响应速度。
应用:
- ADC:
- 传感器数据采集:ADC常用于采集传感器产生的模拟信号,如温度传感器、光线传感器等。
- 音频处理:ADC用于将声音信号转换为数字形式,进行音频处理和录音。
- 控制系统:ADC用于采集控制系统中的模拟信号,实现对系统的监控和控制。
- DAC:
- 音频输出:DAC常用于音频设备中,将数字音频信号转换为模拟音频信号输出到扬声器。
- 波形生成:DAC可以用于生成各种波形信号,如正弦波、方波等,用于测试和实验。
- 控制模拟设备:DAC可以用于控制模拟设备的输出,如调节电压、控制电机等。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的ADC和DAC外设进行模拟信号的采集和输出:
// 配置ADC
ADC1->CR2 |= ADC_CR2_ADON; // 使能ADC
ADC1->SQR3 |= 0; // 选择通道0
ADC1->CR2 |= ADC_CR2_SWSTART; // 启动转换
while (!(ADC1->SR & ADC_SR_EOC)); // 等待转换完成
uint16_t adc_value = ADC1->DR; // 读取转换结果
// 配置DAC
DAC->CR |= DAC_CR_EN1; // 使能DAC通道1
DAC->DHR12R1 = 2048; // 设置DAC输出值为一半
6、定时器/计数器
定时器和计数器是STM32微控制器中常见的外设,用于生成精确的时间延迟、PWM信号输出、定时中断等功能。
定义:
- 定时器:定时器是用于生成精确时间延迟的外设,可以在特定时间间隔内触发事件或执行特定操作。
- 计数器:计数器是用于计数脉冲或时钟周期的外设,可以用于测量时间间隔或频率等。
特点:
- 定时器:
- 多功能性:定时器可以用于生成延时、PWM信号、定时中断等多种功能。
- 灵活性:定时器通常具有多个计数通道和工作模式,可以根据需求进行配置。
- 精确性:定时器可以提供高精度的时间控制,适用于需要精确时间控制的应用。
- 计数器:
- 计数功能:计数器用于计数输入脉冲或时钟周期,可以测量时间间隔或频率。
- 多种计数模式:计数器通常支持不同的计数模式,如上升沿计数、下降沿计数等。
- 可编程性:计数器的计数范围和计数速率通常是可编程的,可以根据需求进行调整。
应用:
- 定时器:
- 延时生成:定时器常用于生成精确的延时,控制各种设备的动作和时序。
- PWM信号输出:定时器可以生成PWM信号,用于控制电机速度、LED亮度等。
- 定时中断:定时器可以用于生成定时中断,实现周期性任务的执行。
- 计数器:
- 频率测量:计数器可以用于测量输入信号的频率,如测量脉冲信号的频率。
- 脉冲计数:计数器可以用于计数输入脉冲的数量,如计数传感器触发的脉冲数量。
- 时间测量:计数器可以用于测量时间间隔,如测量两个事件之间的时间差。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的定时器和计数器外设进行定时中断和频率测量:
// 配置定时器
TIM2->PSC = 999; // 设置预分频值,时钟频率为84MHz,计数频率为84kHz
TIM2->ARR = 999; // 设置自动重装载寄存器值,计数周期为1s
TIM2->CR1 |= TIM_CR1_CEN; // 使能定时器
// 配置计数器
TIM3->SMCR |= TIM_SMCR_SMS_2; // 选择外部时钟模式
TIM3->CCMR1 |= TIM_CCMR1_CC1S_0; // 选择输入通道1
TIM3->CCER |= TIM_CCER_CC1P; // 上升沿计数
TIM3->CR1 |= TIM_CR1_CEN; // 使能计数器
7、中断控制器
中断控制器是微控制器中的重要外设,用于管理和响应各种中断事件,以提高系统的实时性和响应能力。
定义:
中断控制器是用于管理和响应系统中断的外设,它可以监视各种中断源(如定时器、外部IO、通信接口等),并在中断事件发生时及时响应,执行相应的中断服务程序。
特点:
- 实时性:中断控制器能够及时响应各种中断事件,提高系统的实时性。
- 灵活性:中断控制器通常具有多个中断优先级和中断向量,可以根据需求对中断进行优先级排序和处理。
- 可编程性:中断控制器的中断向量和中断服务程序通常是可编程的,可以根据具体应用进行定制。
应用:
- 系统实时性:中断控制器可以用于提高系统的实时性,及时响应各种事件并执行相应的处理程序。
- 外部设备控制:中断控制器可以用于管理外部设备的中断请求,如外部IO口、定时器、串口等。
- 多任务处理:中断控制器可以实现多任务处理,通过中断服务程序的切换实现多任务并发执行。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的中断控制器进行中断处理:
// 配置外部中断
EXTI->IMR |= EXTI_IMR_MR0; // 使能外部中断线0
EXTI->RTSR |= EXTI_RTSR_TR0; // 设置外部中断线0为上升沿触发
NVIC_EnableIRQ(EXTI0_IRQn); // 使能外部中断线0的中断
// 中断服务程序
void EXTI0_IRQHandler(void) {
if (EXTI->PR & EXTI_PR_PR0) { // 检查中断标志位
// 执行中断处理程序
// 清除中断标志位
EXTI->PR |= EXTI_PR_PR0;
}
}
8、看门狗定时器(WDT)
看门狗定时器(WDT)是一种用于监视系统运行状态的特殊定时器,当系统出现死锁或异常情况时,可以重启系统以恢复正常运行。
定义:
看门狗定时器是一种硬件定时器,用于监视系统的运行状态。系统在正常运行时会定期喂狗(即重置定时器),如果系统出现死锁或异常情况导致无法喂狗,看门狗定时器会超时并触发系统重启,以恢复系统的正常运行。
特点:
- 监视功能:看门狗定时器可以监视系统的运行状态,防止系统死锁或异常情况导致系统停止响应。
- 自动重启:当看门狗定时器超时时,会自动触发系统重启,帮助系统恢复正常运行。
- 硬件实现:看门狗定时器通常是硬件实现的,不受软件控制的影响,可以提高系统的可靠性。
应用:
- 系统稳定性:看门狗定时器常用于提高系统的稳定性,防止系统因软件bug或其他原因导致死锁或停止响应。
- 嵌入式系统:在嵌入式系统中,看门狗定时器可以用于监视系统运行状态,确保系统的可靠性和稳定性。
- 自动恢复:看门狗定时器可以帮助系统在出现异常情况时自动重启,恢复到正常运行状态。
代码示例:
下面是一个简单的代码示例,演示如何配置STM32的看门狗定时器进行系统监视:
// 配置看门狗定时器
IWDG->KR = 0x5555; // 解锁看门狗寄存器
IWDG->PR = 0x06; // 设置预分频值,看门狗定时器时钟为40kHz
IWDG->RLR = 1000; // 设置重装载寄存器值,定时器溢出时间为25s
IWDG->KR = 0xAAAA; // 重新加载看门狗计数器
IWDG->KR = 0xCCCC; // 使能看门狗定时器
// 喂狗操作
IWDG->KR = 0xAAAA; // 重新加载看门狗计数器
总结
在嵌入式系统开发中,定时器/计数器、中断控制器和看门狗定时器是至关重要的外设,它们为系统提供了关键的时间控制、事件响应和系统监视功能。定时器和计数器是用于生成精确时间延迟、PWM信号输出等的多功能外设。通过定时器,开发人员可以实现精确的时间控制,例如在通信协议中生成特定的时间间隔、控制外设的操作时序等。同时,定时器还可以用于生成PWM信号,用于控制电机速度、LED亮度等。
中断控制器是用于管理和响应系统中断的外设,可以提高系统的实时性和响应能力。通过中断控制器,系统可以及时响应各种中断事件,执行相应的中断服务程序,从而实现多任务处理、外部设备控制等功能。中断控制器的灵活性和可编程性使其成为嵌入式系统中不可或缺的一部分。
看门狗定时器是一种特殊的定时器,用于监视系统的运行状态。当系统出现死锁或异常情况时,看门狗定时器可以自动重启系统,确保系统的稳定性和可靠性。看门狗定时器在嵌入式系统中扮演着重要角色,可以防止系统因软件bug或其他原因导致系统停止响应。
合理配置和使用定时器/计数器、中断控制器和看门狗定时器可以有效提升嵌入式系统的性能和稳定性,为各种应用场景提供强大的支持。开发人员应根据具体需求和系统特点,灵活运用这些外设,以实现系统的高效运行和可靠性保障。通过深入理解和合理应用这些外设,嵌入式系统开发可以更加顺利和高效。
原文地址:https://blog.csdn.net/hh867308122/article/details/142758567
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!