【无标题】


前言

中断是嵌入式系统中一个非常重要的概念,同时也在嵌入式系统中发挥着巨大的作用。在普通51单片机中,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断。但在STM32中,中断的数量大大增加,同时配置和使用也相对复杂。串口是一个泛称,UART、TTL、RS232、RS485都遵循类似的通信时序协议,因此都被通称为串口。此篇文章主要讲解STM32中以STM32F103为例的外部中断和串口的配置及使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、外部中断

1.外部中断的概念

外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。

2.STM32中断系统

外部中断概述

这里我们首先 STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
从上面可以看出,STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计,GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。下面我们看看 GPIO 跟中断线的映射关系图:

在这里插入图片描述

外部中断类型

IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数
在这里插入图片描述
从表中可以看出,外部中断线5~ 9分配一个中断向量,共用一个服务函数外部中断线10~15分配一个中断向量,共用一个中断服务函数。

GPIO外部中断的配置

在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的:

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

该函数将 GPIO 端口与中断线映射起来,使用范例是:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

将中断线 2 与 GPIOE 映射起来,那么很显然是 GPIOE.2 与 EXTI2 中断线连接了。设置好中断
线映射之后,那么到底来自这个 IO 口的中断是通过什么方式触发的呢?接下来我们就要设置
该中断线上中断的初始化参数了。
中断线上中断的初始化是通过函数 EXTI_Init()实现的。EXTI_Init()函数的定义是:

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数

  GPIO_Init();                                              //初始化IO口为输入
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);       //开启IO口复用时钟
  void GPIO_EXTILineConfig();                               //设置IO口与中断线的映射关系
  EXTI_Init();                                              //初始化线上中断,设置触发条件等
  NVIC_Init();                                              //配置中断分组(NVIC),并使能中断
  EXTIx_IRQHandler();                                       //编写中断服务函数
  EXTI_ClearITPendingBit();                                 //清除中断标志位

二、串口

1.串口的概念

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

2.STM32串口通信基础

UART:通用异步收发器
USART:通用同步异步收发器

大容量STM32F10x系列芯片,包含3个USART和2个UART

UART异步通信方式引脚连接方法:
-RXD:数据输入引脚。数据接受。
-TXD:数据发送引脚。数据发送。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

UART异步通信方式特点:
1.全双工异步通信;
2.分数波特率发生器系统,提供精确的波特率;
3.发送和接受共用的可编程波特率,最高可达4.5Mbits/s;
4.可编程的数据字长度(8位或者9位);
5.可配置的停止位(支持1或者2位停止位);
6.可配置的使用DMA多缓冲器通信。
7.单独的发送器和接收器使能位。
8.检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
9.多个带标志的中断源。触发中断。
10.其他:校验控制,四个错误检测标志。

串口通信过程:
数据接收过程:
在这里插入图片描述

数据发送过程:
在这里插入图片描述

3.串口的配置方法

串口操作相关库函数(省略入口参数):

void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断

void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位
RCC_APB2PeriphClockCmd();//串口时钟使能,GPIO时钟使能
USART_DeInit(); //串口复位(这一步不是必须的)
GPIO_Init(); //GPIO端口模式设置
USART_Init();//串口参数初始化
NVIC_Init();
USART_ITConfig();
//开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
USART_Cmd();//使能串口
USARTx_IRQHandler();//编写中断处理函数
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);//串口传输状态获取


总结

以上就是今天要讲的内容,本文仅仅简单介绍了STM32中以STM32F103为例的外部中断和串口的配置及使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值