欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

物联网之STM32开发四(中断系统)

程序员文章站 2024-02-22 12:03:28
...

STM32-中断系统

内容概要:

STM32中断系统概述

外部中断控制器EXTI

按键中断实例

串口中断实例

STM32中断系统概述

内容概要

中断的基本概念

嵌套向量控制器NVIC

中断及异常向量表

中断优先级

中断的基本概念

 处理器中的中断:在处理器中,中断是一个过程,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中止当前程序的执行,转而去为处理紧急的事件,待处理完毕后再返回被打断的程序处继续往下执行。中断在计算机多任务处理,尤其是即时系统中尤为重要。比如uCOS,FreeRTOS等。

意义:中断能提高CPU的效率,同时能对突发事件做出实时处理。实现程序的并行化,实现嵌入式系统进程之间的切换。

中断处理过程

进入中断:

     处理器自动保存现场到堆栈里

     {PC, xPSR, R0-R3, R12, LR}

     一旦入栈结束,ISR便可开始执行

     晚到的中断会重新取ISR地址,但无需再次保存现场

退出中断:

     中断前的现场被自动从堆栈中恢复

     一旦出栈完成,继续执行被中断打断的指令

     出栈的过程也可被打断,使得随时可以响应新的中断,而不再进行    

    现场保存

物联网之STM32开发四(中断系统)

STM32F0中断的体系结构

物联网之STM32开发四(中断系统)

NVIC的主要功能

中断管理  

支持异常及中断向量化处理  

支持嵌套中断

中断管理

Cortex-M0处理器中,每一个外部中断都可以被使能或者禁止,并且可以被设置为挂起状态或者清除状态。处理器的中断可以电平的形式的,也可以是脉冲形式的,这样中断控制器就可以处理任何中断源。

物联网之STM32开发四(中断系统)

中断和异常向量表

STM32F0中断和异常向量:       

    Cortex-M0内核可以处理15个内部异常,和32个外部中断。      

    STM32F051实际上只使用了6个内部异常和28个外部中断。

当异常或中断发生时,处理器会把PC设置为一个特定地址,这一地址就称为异常向量。每一类异常源都对应一个特定的入口地址,这些地址按照优先级排列以后就组成一张异常向量表。

向量化处理中断的好处:

    统的处理方式需要软件去完成。采用向量表处理异常,M0处理器会从存储器的向量表中,自动定位异常的程序入口。从发生异常到异常的处理中间的时间被缩减。

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

注:中断和异常的区别:中断是微处理器外部发送的,通过中断通道送入处理器内部,一般是硬件引起的,比如串口接收中断,而异常通常是微处理器内部发生的,大多是软件引起的,比如除法出错异常,特权调用异常等待。不管是中断还是异常,微处理器通常都有相应的中断/异常服务程序。

嵌套中断

STM32F0中断的优先级:    

    3个固定的优先级,都是负值,不能改变  

    四个可编程优先级,用两个bit位表示,00,01,10,11  

    优先级越小优先级越高

物联网之STM32开发四(中断系统)

注:不同优先级的中断同时发生,优先处理优先级编号较小的那个 同样优先级的中断同时发生,中断向量号较小的那个优先响应。

外部中断控制器EXTI

内容概要

外部中断控制器EXTI

系统配置控制器SYSCFG

外部中断/事件框图

外部中断控制器EXTI

在 STM32F05x 中,共有最多 28 中断 / 事件线可用:

GPIO 口连接到 16 个外部中断 / 事件线

物联网之STM32开发四(中断系统)

系统配置控制器 (SYSCFG)

该器件具有一组配置寄存器。系统配置控制器的主要用途如下:

● 在部分 IO 口上启用或禁用 I2C 超快模式 (Fast Mode Plus) 。

● 重映射部分从 TIM16 和 TIM17 , USART1 和 ADC 的 DMA 触发源到其它不同的 DMA 通道上。

● 重映射存储器到代码起始区域。

● 管理连接到 GPIO 口的外部中断。

● 管理系统的可靠性特性。

物联网之STM32开发四(中断系统)

SYSCFG 外部中断配置寄存器 1-4 (SYSCFG_EXTICR1—4)

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

外部中断 / 事件框图

物联网之STM32开发四(中断系统)

按键中断实例

内容概要

按键原理图分析

按键中断编程步骤分析

按键中断编程实例

按键原理图分析

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

按键中断编程步骤分析

1、使能相应的时钟

2、配置GPIO管脚为中断功能

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

按键中断编程实例

配置引脚功能:

物联网之STM32开发四(中断系统)

设置串口:

物联网之STM32开发四(中断系统)

打开中断:

物联网之STM32开发四(中断系统)

设置中断触发方式:

物联网之STM32开发四(中断系统)

导出工程:

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

追入向量表中对应的函数:

物联网之STM32开发四(中断系统)

继续往下追相应的函数:

物联网之STM32开发四(中断系统)

继续往下追:

物联网之STM32开发四(中断系统)

需要重新编写的中断处理程序:

物联网之STM32开发四(中断系统)

重新编写中断处理程序并添加必要的头文件:

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

串口中断实例

内容概要

原理图分析

串口中断编程步骤分析

串口中断编程实例

串口原理图分析

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

串口中断编程步骤分析

1、使能相应的时钟

2、配置GPIO管脚为串口功能

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

串口中断编程实例

引脚功能选择为串口功能

物联网之STM32开发四(中断系统)

设置通信协议

物联网之STM32开发四(中断系统)

打开对应中断

物联网之STM32开发四(中断系统)

在中断向量表中找到对应的向量,往里面追

物联网之STM32开发四(中断系统)

串口接收中断的实现  

找到串口接收模式下的函数,继续往里面追

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

找到回调函数并改写

物联网之STM32开发四(中断系统)

改写代码如下:

main.c中定义一个全局变量用于存放字符串,并将串口接收中断使能:

物联网之STM32开发四(中断系统)

uint8_t buf[10];

 物联网之STM32开发四(中断系统)

HAL_UART_Receive_IT(&huart1, buf, 1); //串口接收中断使能(这里设置的是接收一个字符就中断)

在usart.c中重新编写回调函数:

物联网之STM32开发四(中断系统)

​​extern uint8_t buf[10];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)
	{
		//HAL_UART_Transmit(&huart1, "receive success!\n", 17, 100);
		printf("receive success : %c\n", buf[0]);  //如果调用printf函数,则需要重新编写fputc函数
		HAL_UART_Receive_IT(&huart1, buf, 1);  //每次调用中断程序后都要重新使能
	}
}

重新编写fputc函数如下:
int fputc(int ch,FILE *f){	
    while((USART1->ISR&(1<<7)) == 0);	
    USART1->TDR=(uint8_t)ch;
    return ch;
} 

测试结果:

物联网之STM32开发四(中断系统) 

串口发送中断的实现

串口发送中断使能:

物联网之STM32开发四(中断系统)

HAL_UART_Transmit_IT(&huart1, "TX\n", 3);//串口发送中断使能

追加到回调函数:

物联网之STM32开发四(中断系统)

物联网之STM32开发四(中断系统)

重新编写回调函数:

物联网之STM32开发四(中断系统)

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//判断是否为串口1的发送中断
	{
		printf("tx success!\n");//如果发生中断,则打印一句话
	}
}

测试结果:

物联网之STM32开发四(中断系统)