你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU 发布时间:2020-9-27 14:08
STM32-中断系统

内容概要:


STM32中断系统概述

外部中断控制器EXTI

按键中断实例

串口中断实例


STM32中断系统概述:

内容概要:

中断的基本概念

嵌套向量控制器NVIC

中断及异常向量表

中断优先级


中断的基本概念:

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

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

中断处理过程:

进入中断:

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

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

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

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

退出中断:

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

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

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

    现场保存

1_meitu_23.jpg

STM32F0中断的体系结构:

2_meitu_24.jpg


NVIC的主要功能:

中断管理  

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

支持嵌套中断

中断管理:

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



3_meitu_25.jpg


中断和异常向量表:

STM32F0中断和异常向量:      

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

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

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

向量化处理中断的好处:

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


4_meitu_26.jpg


5_meitu_27.jpg


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


嵌套中断:

STM32F0中断的优先级:   

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

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

    优先级越小优先级越高


6_meitu_28.jpg


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



外部中断控制器EXTI

内容概要:

外部中断控制器EXTI

系统配置控制器SYSCFG

外部中断/事件框图

外部中断控制器EXTI:

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

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

7_meitu_29.jpg


系统配置控制器 (SYSCFG):


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

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

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

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

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

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

8_meitu_30.jpg


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


9_meitu_31.jpg

10_meitu_32.jpg


外部中断 / 事件框图:

11_meitu_33.jpg


按键中断实例


内容概要:

按键原理图分析

按键中断编程步骤分析

按键中断编程实例

按键原理图分析:

12_meitu_34.jpg



13_meitu_35.jpg


按键中断编程步骤分析:

1、使能相应的时钟

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

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

按键中断编程实例:

配置引脚功能:

14_meitu_36.jpg


设置串口:


15_meitu_37.jpg


打开中断:

16_meitu_38.jpg


设置中断触发方式:

17_meitu_39.jpg


导出工程:

18_meitu_40.jpg


19_meitu_41.jpg


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

20_meitu_42.jpg

继续往下追相应的函数:

21_meitu_43.jpg


继续往下追:

22_meitu_44.jpg


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


23_meitu_45.jpg


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

24_meitu_46.jpg


25_meitu_47.jpg


串口中断实例


内容概要:

原理图分析

串口中断编程步骤分析

串口中断编程实例

串口原理图分析

26_meitu_48.jpg


27_meitu_49.jpg


串口中断编程步骤分析:

1、使能相应的时钟

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

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

串口中断编程实例:

引脚功能选择为串口功能


28_meitu_50.jpg


设置通信协议


29_meitu_51.jpg

打开对应中断


30_meitu_52.jpg


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


31_meitu_53.jpg



串口接收中断的实现  


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



32_meitu_54.jpg


找到回调函数并改写

33_meitu_55.jpg


改写代码如下:


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



35_meitu_57.jpg


  1. uint8_t buf[10];
复制代码

                                                                                     36_meitu_58.jpg

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




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



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

  11. 重新编写fputc函数如下:
  12. int fputc(int ch,FILE *f){        
  13.     while((USART1->ISR&(1<<7)) == 0);        
  14.     USART1->TDR=(uint8_t)ch;
  15.     return ch;
  16. }
复制代码

测试结果:

38.png

串口发送中断的实现


串口发送中断使能:

39_meitu_61.jpg


  1. HAL_UART_Transmit_IT(&huart1, "TX\n", 3);//串口发送中断使能
复制代码

追加到回调函数:

40_meitu_62.jpg


41_meitu_63.jpg

重新编写回调函数:

42_meitu_64.jpg


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



测试结果:



43.png



34_meitu_56.jpg
37_meitu_59.jpg
收藏 评论0 发布时间:2020-9-27 14:08

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版