【STM32】关于STM32的USART和NVIC中断

本文详细介绍了STM32中的USART模块,包括其工作原理、数据传输方式和在STM32微控制器中的应用。同时,讨论了NVIC中断控制器的配置和中断优先级管理。要充分利用这些模块,需深入理解配置方法,优化工作模式和中断设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I. 介绍USART

USART是一种通用同步/异步收发器,用来在微控制器与外部设备间进行数据传输。USART可以实现串行通信,支持全双工通信,可同时发送和接收数据。它在很多领域都得到了广泛的应用,比如通信、显示、控制等。

USART的优势包括:

  1. 高速传输:USART可以以高速传输数据,支持多种波特率。
  2. 灵活性:USART支持同步和异步模式,并可以配置为不同的工作模式。
  3. 可靠性:USART提供了校验功能,可以验证接收到的数据的完整性和正确性。
  4. 发送接收控制:USART可以通过软件控制数据的发送和接收。

然而,USART也存在一些不足之处:

  1. 硬件资源占用较多:USART需要占用较多的硬件资源,包括引脚和中断资源。

  2. 需要额外的电路:USART通常需要外部电路来提供时钟源和电平转换。

II. USART的工作原理

在这里插入图片描述
其中最重要的部分为图中阴影部分,其他部分为接口和控制部分。

在串口通信中,数据的传输有两个过程:发送和接收。

  • 发送数据时,数据会被传输到发送数据寄存器(TDR),然后通过发送移位寄存器按位传输到TX引脚上。每次发送一个字节的数据,发送移位寄存器会从右端开始逐位发送,这表明串口通信是低位先行。

  • 接收数据时,数据以数据帧的形式由RX引脚接收,然后送入接收移位寄存器。当接收移位寄存器接收到一个完整的字节数据后,整个字节数据会传输到接收数据寄存器。在接收数据过程中,数据以二进制的形式从左端输入,每接收一位,数据就向右移动一位。到最后,数据恢复到原来的二进制位顺序,这就是为什么接收时数据不会改变的原因。

USART的通信模式:

  1. 同步模式:在同步模式下,传输的数据与通信信号的时钟同步,通常需要外部的时钟源。同步模式下的数据传输速度较快,但对硬件资源要求更高。

  2. 异步模式:在异步模式下,传输的数据的时钟与通信信号的时钟不同步。异步模式下的数据传输速度较慢,但硬件资源要求较低。

USART的数据帧结构:

数据帧是指一次数据传输中的数据单元。USART的数据帧通常包含起始位、数据位、校验位和停止位。起始位标识了数据传输的开始,数据位是实际的数据内容,校验位用来验证数据的完整性,停止位表示一次数据传输的结束。

USART的数据传输方式:

USART的数据传输可以分为两种方式,即中断方式和轮询方式。中断方式是通过中断来处理收发数据,可以实现异步传输。轮询方式则是通过轮询标志位来判断数据是否传输完成,适用于同步传输。

III. STM32的USART模块

STM32是一系列由STMicroelectronics公司推出的32位微控制器系列。它们具有高性能、低功耗和丰富的外设功能。STM32的USART模块是其中一个外设模块,可以用来实现与外部设备的串行通信。

STM32的USART模块概述:

STM32的USART模块是一种高性能的通信接口,可用于与其他设备进行同步或异步数据传输。它提供了多种功能,包括波特率配置、数据格式配置、硬件流控制等。

STM32的USART模块的特点和功能:

  1. 支持多个USART接口:STM32微控制器通常提供多个USART接口,可以同时与多个外部设备进行通信。
  2. 强大的波特率生成器:USART模块提供了一个灵活的波特率生成器,可以根据要求生成各种波特率。
  3. 支持多种中断源:USART模块可以产生多种中断,并提供了中断优先级控制。
  4. 提供DMA支持:USART模块可以通过DMA进行数据传输,减轻微控制器的负担。

IV. 应用USART模块的例子

使用USART模块发送和接收数据:

下面是一个使用STM32的USART模块发送和接收数据的示例代码:

#include "stm32f4xx.h"

void USART1_Init(void)
{
    // 初始化USART1的引脚和寄存器配置
    // ...
}

void USART1_SendChar(uint8_t ch)
{
    // 等待发送缓冲区为空
    while (!(USART1->SR & USART_SR_TXE));
    
    // 发送数据
    USART1->DR = ch;
}

uint8_t USART1_ReceiveChar(void)
{
    // 等待接收缓冲区非空
    while (!(USART1->SR & USART_SR_RXNE));
    
    // 读取接收数据
    return USART1->DR;
}

int main(void)
{
    USART1_Init();
    
    // 发送数据
    USART1_SendChar('A');
    
    // 接收数据
    uint8_t data = USART1_ReceiveChar();
    
    while (1);
}

使用USART模块进行数据传输:

下面是一个使用STM32的USART模块进行数据传输的示例代码:

#include "stm32f4xx.h"

void USART1_IRQHandler(void)
{
    if (USART1->SR & USART_SR_RXNE)
    {
        // 接收到数据
        uint8_t data = USART1->DR;
        
        // 处理接收到的数据
        // ...
    }
    
    if (USART1->SR & USART_SR_TXE)
    {
        // 发送缓冲区为空,可以发送数据
        // ...
    }
}

void USART1_Init(void)
{
    // 初始化USART1的引脚和寄存器配置
    // ...
    
    // 使能USART1的接收和发送中断
    NVIC_EnableIRQ(USART1_IRQn);
    USART1->CR1 |= USART_CR1_RXNEIE | USART_CR1_TXEIE;
}

void USART1_SendChar(uint8_t ch)
{
    // 发送数据
    USART1->DR = ch;
}

int main(void)
{
    USART1_Init();
    
    // 发送数据
    USART1_SendChar('A');
    
    while (1);
}

V. 介绍NVIC

NVIC是嵌入式系统中的中断控制器,它用于管理和控制中断。它的作用是根据中断的优先级,完成中断的挂起和响应,协调各个中断的工作。

NVIC的优势包括:

  1. 灵活的中断管理:NVIC可以管理多个中断,根据优先级来控制中断的执行。
  2. 高效的中断处理:NVIC可以快速响应中断,并实现快速的中断切换和处理。
  3. 降低系统负载:NVIC可以设置中断的优先级,使得较低优先级的中断不影响较高优先级的中断。
  4. 硬件支持:NVIC由硬件实现,可以提供高效和稳定的中断支持。

然而,NVIC也存在一些不足之处:

  1. 硬件资源限制:NVIC的中断优先级是由硬件决定的,因此对于某些特殊应用,可能无法满足其要求。
  2. 中断处理复杂性:当存在多个中断时,需要合理设置中断优先级,以免引发优先级翻转等问题。

VI. STM32的NVIC模块

STM32的NVIC模块是一种用于管理中断控制器的软件模块。它提供了一组寄存器和函数,用于配置和管理中断的优先级、触发条件及中断的响应。

STM32的NVIC模块概述:

STM32的NVIC模块是一种高性能的中断控制器,可以管理多个中断,并提供了灵活的中断优先级配置。

STM32的NVIC模块的特点和功能:

  1. 中断优先级:STM32的NVIC模块支持多个中断优先级,可以根据应用需求进行配置。
  2. 中断触发条件:NVIC模块支持多种中断触发条件,可以根据中断源的不同配置相应的触发条件。
  3. 中断挂起和响应:NVIC模块可以根据中断优先级自动调度中断,实现对不同中断的挂起和响应控制。

VII. 应用NVIC模块的例子

使用NVIC模块管理中断:

下面是一个使用STM32的NVIC模块管理中断的示例代码:

#include "stm32f4xx.h"

void EXTI0_IRQHandler(void)
{
    // 处理中断
    // ...
    
    // 清除中断挂起标志
    EXTI->PR = EXTI_PR_PR0;
}

void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStruct;
    
    // 配置中断优先级
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

void EXTI_Config(void)
{
    // 配置外部中断0的触发条件为上升沿触发
    EXTI->IMR |= EXTI_IMR_MR0;
    EXTI->RTSR |= EXTI_RTSR_TR0;
    EXTI->FTSR &= ~EXTI_FTSR_TR0;
}

int main(void)
{
    // 配置NVIC
    NVIC_Config();
    
    // 配置外部中断
    EXTI_Config();
    
    while (1);
}

使用NVIC模块配置和优化中断:

下面是一个使用STM32的NVIC模块进行中断优化的示例代码:

#include "stm32f4xx.h"

void TIM2_IRQHandler(void)
{
    // 处理定时器中断
    // ...
    
    // 清除定时器中断标志
    TIM2->SR &= ~TIM_SR_UIF;
}

void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStruct;
    
    // 配置中断优先级
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; // 比其他中断优先级低
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

void TIM2_Config(void)
{
    // 配置定时器2
    // ...
    
    // 使能定时器溢出中断
    TIM2->DIER |= TIM_DIER_UIE;
}

int main(void)
{
    // 配置NVIC
    NVIC_Config();
    
    // 配置定时器2
    TIM2_Config();
    
    while (1);
}

VIII. 结论

USART和NVIC是STM32微控制器中的两个重要模块。USART模块用于串行通信,支持高速传输和多种工作模式;NVIC模块用于管理和控制中断,支持灵活的中断优先级配置。

为了最好地使用它们,建议:

  1. 详细了解USART和NVIC的配置和使用方法,包括寄存器的设置和中断的处理。
  2. 根据具体的应用需求,合理选择USART的工作模式和波特率,并优化中断的优先级配置。
  3. 使用官方文档和示例代码作为参考,确保正确和稳定地使用USART和NVIC模块。
  4. 进行详细的调试和测试,确保USART和NVIC模块的功能和性能符合要求。

通过充分理解和应用USART和NVIC,我们可以实现可靠和高效的串行通信和中断管理,提升嵌入式系统的性能和稳定性。
关于USART和NVIC的内容还有很多,大家可以多阅读数据手册加以学习理解!
(以上均为本人的粗浅理解和引用,如有错误,烦请各位指正!)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值