本博客为实验室第三次作业。

中断

  中断的定义:中断是计算机方面特有的名词,指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

中断的执行流程:

ESP32 中断冲突_stm32

外部中断  

外部中断的定义:外部中断指的是由外部引发的中断,具体到STM32就指的是由外设引发的中断,即外部中断源。


外部中断通用I/O映像




ESP32 中断冲突_stm32_02


STM32单片机的每一个GPIO都可以被设置为外部中断输入,根据引脚序号的不同可以将外部中断分为不同的组,分别为PA0-PG0为EXTI0组,以此类推,PA15-PG15为EXTI15组,共16组,并且每一组中同一个时刻只能有一个中断源工作,所以,STM32单片机最多允许同时有16个外部中断。外部中断的分配方式如下表所示:

GPIO引脚

中断标志位

中断处理函数

PA0~PG0

EXTI0

EXTI0_IRQHandler

PA1~PG1

EXTI1

EXTI1_IRQHandler

PA2~PG2

EXTI2

EXTI2_IRQHandler

PA3~PG3

EXTI3

EXTI3_IRQHandler

PA4~PG4

EXTI4

EXTI4_IRQHandler

PA5~PG5

EXTI5

EXTI9_5_IRQHandler

PA6~PG6

EXTI6

PA7~PG7

EXTI7

PA8~PG8

EXTI8

PA9~PG9

EXTI9

PA10~PG10

EXTI10

EXTI15_10_IRQHandler

PA11~PG11

EXTI11

PA12~PG12

EXTI12

PA13~PG13

EXTI13

PA14~PG14

EXTI14

PA15~PG15

EXTI15

其中5-9,10-15采用并线,所以STM32EXTI结构如图所示

ESP32 中断冲突_ESP32 中断冲突_03


另外还有四条 EXTI 线的连接方式如下:


● EXTI 线 16 连接到 PVD 输出


● EXTI 线 17 连接到 RTC 闹钟事件


● EXTI 线 18 连接到 USB 唤醒事件


● EXTI 线 19 连接到以太网唤醒事件 ( 只适用于互联型产品 )


外部中断的配置:

初学者会觉得外部中断的配置是一个相当繁琐的过程,因为配置外部中断需要将上图所示的四个部分全部打穿

配置外部中断一般的步骤为:

开启IO口时钟,初始化IO口为输入。调用函数:

GPIO_Init();

2)开启IO口复用时钟。调用函数:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

3)设置IO口与中断线的映射关系。调用函数:

GPIO_EXTILineConfig();

4)初始化线上中断,设置触发条件等。调用函数:

EXTI_Init();

5)配置中断分组(NVIC),并使能中断。调用函数:

NVIC_Init();

6)编写中断服务函数。调用函数:

EXTIx_IRQHandler();

7)清除中断标志位。调用函数:

EXTI_ClearITPendingBit()。

NVIC优先级分组

NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

ESP32 中断冲突_c语言_04

串口

定义:串行接口简称串口,也称串行通信接口

划分标准:

同步串行接口(英文:Synchronous Serial Interface,SSI)是一种常用的工业用通信接口

 异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。

和USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器

Other

波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称为波特率。

  波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。


  单工:只能一个方向传输。
  半双工:可以两个方向传输,但需要分时复用。
  全双工:两个方向传输。

串口配置的一般步骤:

1.串口时钟使能:先使能GPIO时钟:

RCC_APB2PeriphClockCmd();

2.GPIO端口模式设置 GPIO_Init(); ——模式设置为GPIO_Mode_AF_PP
 

GPIO_Mode_IN_FLOATING;

3.串口参数初始化
 

USART_Init();

5.开启中断并且初始化NVIC (如果需要开启中断才需要这个步骤)

NVIC_Init();
USART_ITConfig(0);

6.使能串口:

USART_ Cmd();

7.编写中断处理函数:

USARTX_IRQHandler();

8.串口数据收发:

void USART SendData();//发送数据到串口,DR
uint16 tUSART_ ReceiveData(;//接受数据,从DR读取接受到的数据

9.串口传输状态获取:

FlagStatus USART_GetFlagStatus(USART_TypeDef*USARTx,uint16_t USARTL_FLAG);
void USART_ClearlTPendingBit(USART_TypeDef*USARTx,uint16_t USART_IT;