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

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

[复制链接]
STMCU-管管 发布时间:2020-9-27 14:08
STM32-中断系统, L& b2 K9 v# d/ V6 O$ [

  O; u* q. V9 r' n6 f- y内容概要:

* Y+ E8 }6 i# E/ M
' T, Y( [# y$ K2 _

STM32中断系统概述

外部中断控制器EXTI

按键中断实例

串口中断实例


* `6 ]4 r4 o+ Z* y! B2 h( M' m+ t% E" ZSTM32中断系统概述:
+ H, A* [6 l% g; m' |9 W/ S

内容概要:

中断的基本概念

嵌套向量控制器NVIC

中断及异常向量表

中断优先级


! M* i! d9 v9 y: ~7 g3 N

中断的基本概念:

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

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

中断处理过程:

进入中断:

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

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

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

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

退出中断:

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

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

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

    现场保存

1_meitu_23.jpg

STM32F0中断的体系结构:

2_meitu_24.jpg


! ~0 s2 p7 [7 Q

NVIC的主要功能:

中断管理  

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

支持嵌套中断

中断管理:

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

+ @1 ^3 a( S' F. L


/ V/ ~9 j, r' t/ |

3_meitu_25.jpg


/ C2 N6 H9 i# c; C+ k. [2 @

中断和异常向量表:

STM32F0中断和异常向量:      

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

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

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

向量化处理中断的好处:

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


: W; B9 h/ X0 R8 U2 r

4_meitu_26.jpg

  Y9 ?" D% M7 C3 Z8 ^4 |# L  y

5_meitu_27.jpg

$ k2 P# U' E2 k  f" y3 L  h

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

3 G% b5 C" c# {+ ]

嵌套中断:

STM32F0中断的优先级:   

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

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

    优先级越小优先级越高

7 X  s+ Q. U1 l8 p* \

6_meitu_28.jpg


+ m' \5 ?/ V3 D

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

6 s7 c9 j. a6 y  h/ g4 e


" n: E3 |, d. i% c7 v' V& y* |

外部中断控制器EXTI

内容概要:

外部中断控制器EXTI

系统配置控制器SYSCFG

外部中断/事件框图

外部中断控制器EXTI:

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

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

7_meitu_29.jpg


0 S, h9 ?$ n0 F8 U

系统配置控制器 (SYSCFG):


) L6 V! b/ r* ?0 e4 O; m

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

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

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

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

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

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

8_meitu_30.jpg


; j, K6 {) I& V

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

. C& i) V* ]" L2 B

9_meitu_31.jpg

10_meitu_32.jpg


( ]: a8 T6 {1 t' J7 `' S4 P5 H

外部中断 / 事件框图:

11_meitu_33.jpg

* u/ _2 {6 q! ?3 T2 S
按键中断实例
& b, I" _# Z8 U: X
' P; e! B9 I- B) v4 @

内容概要:

按键原理图分析

按键中断编程步骤分析

按键中断编程实例

按键原理图分析:

12_meitu_34.jpg

/ E3 h. B  S! l. ^  ]

( H2 {5 I) O7 T' J" O( y, ~" r

13_meitu_35.jpg

8 e$ t* r; r0 m! n5 y6 A) m' H

按键中断编程步骤分析:

1、使能相应的时钟

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

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

按键中断编程实例:

配置引脚功能:

14_meitu_36.jpg


9 w; M8 ^& k$ l

设置串口:


9 M: H$ U/ [2 R/ E! o9 m

15_meitu_37.jpg

8 ^' u& Q# e5 Y+ C' |

打开中断:

16_meitu_38.jpg

  `0 e4 {4 t: i

设置中断触发方式:

17_meitu_39.jpg


6 J, v6 |0 h5 P& A, b! N! f

导出工程:

18_meitu_40.jpg

. L) D0 W6 S1 I/ |6 t

19_meitu_41.jpg


1 ]* ^4 k8 y) G% D. z9 y

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

20_meitu_42.jpg

继续往下追相应的函数:

21_meitu_43.jpg


, p& M/ @4 T! P4 B& b) N' p: K

继续往下追:

22_meitu_44.jpg


" a# i* y+ q! J+ ^) ?7 W; A0 t

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

* B+ L8 H$ S% f4 n- P" a

23_meitu_45.jpg


3 C& g! g6 U/ q& f% k- t6 K

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

24_meitu_46.jpg


8 m  u$ p7 o% a' D' q* J( M

25_meitu_47.jpg


5 Y6 \) B+ f6 R( G串口中断实例

4 Q) C8 B$ C- {( F6 t+ M
% e- J0 J1 G! w( s* `- E

内容概要:

原理图分析

串口中断编程步骤分析

串口中断编程实例

串口原理图分析

26_meitu_48.jpg


; t* p# V9 v( b5 d

27_meitu_49.jpg


3 u, S( U3 D2 ^$ b, z4 ?

串口中断编程步骤分析:

1、使能相应的时钟

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

3、设置中断优先级

4、使能相应的中断

5、实现中断服务程序

串口中断编程实例:

引脚功能选择为串口功能

$ h9 y+ _, Y: p( r

28_meitu_50.jpg


  g. |+ z9 m$ f* g; N

设置通信协议

# b! D9 p. S  s* w5 {' n7 c

29_meitu_51.jpg

打开对应中断


& ?5 J& I3 S+ Q5 w$ f

30_meitu_52.jpg


) [1 Y+ `' U! k% ]+ I0 ~, N

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

! J% C/ ?7 T# D2 v

31_meitu_53.jpg

  |) B: |! t7 }0 L- Q$ M9 |


' q/ l+ K% D1 W6 V* r5 e6 B0 t6 k% p

串口接收中断的实现  


6 f$ G0 M; y& o+ y  q+ U

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


$ n0 j2 ~9 ?* l2 d

# t; k( I! d& k# T1 m# ]. O

32_meitu_54.jpg

( T3 y( l. J: w0 K; N& F+ ]

找到回调函数并改写

33_meitu_55.jpg

8 z3 H0 ?1 ?! s& b' O

改写代码如下:


7 v( z! w/ h' y: K

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

0 W/ ?+ G9 G6 l  W

, r0 Z/ Y5 \3 ~0 p4 ~4 a

35_meitu_57.jpg

9 t' ^4 o9 K  B, |- u

  1. uint8_t buf[10];
复制代码
0 s2 q" X- y) L$ n$ W: D8 i# J  ^: w
                                                                                     36_meitu_58.jpg
# A) [% C% @! C  `. o
  1. HAL_UART_Receive_IT(&huart1, buf, 1); //串口接收中断使能(这里设置的是接收一个字符就中断)
复制代码

( Z. e( b, I  Q! U% r

0 }9 W# a7 s* u  _0 s3 s& W+ Z; q. c6 R5 \
$ O* A' |" u( C5 v. e5 G

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


1 ?+ }, f" ]1 G. C% |  w
  1.   S7 z, ^0 R3 q6 Y0 x5 c# r) x
  2. ​​extern uint8_t buf[10];
    5 d3 Z  _0 S: Q; K; X: X2 r
  3. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    + E4 U7 I- z5 S. O
  4. {
    2 ?9 W# |2 B7 H* W" b* @# G) N- Q) h
  5.         if(huart->Instance==USART1)" D9 M# |) {* K* A$ q8 A
  6.         {
    : V) Z) Z) f" g8 h
  7.                 //HAL_UART_Transmit(&huart1, "receive success!\n", 17, 100);' G' r4 T5 ^; ]
  8.                 printf("receive success : %c\n", buf[0]);  //如果调用printf函数,则需要重新编写fputc函数& V9 I+ Y5 G0 t; R9 L
  9.                 HAL_UART_Receive_IT(&huart1, buf, 1);  //每次调用中断程序后都要重新使能
    & M/ u' b2 p7 [9 S8 A2 G. V
  10.         }
    0 H- x' r# {2 \- o0 ?1 t3 Y. v  S
  11. }
    6 B0 u+ |' d( |  D4 Y' N

  12.   F9 h' t7 W7 v; ~$ o3 \& m; D  g
  13. 重新编写fputc函数如下:
    6 _5 ?# z; E$ ^6 l( l/ P
  14. int fputc(int ch,FILE *f){        
    ) [  y' l6 l2 |  `; }9 R7 f
  15.     while((USART1->ISR&(1<<7)) == 0);        ( i8 c6 q: U5 \) N
  16.     USART1->TDR=(uint8_t)ch;2 Z% h/ ]9 [) u. C4 t$ t' q1 D; @# g
  17.     return ch;
    0 Q5 v" g- D3 v
  18. }
复制代码
( r( ]  H. j( J; |  }

测试结果:

38.png

串口发送中断的实现


9 L* r; o" Q  c, H, c5 M3 n

串口发送中断使能:

39_meitu_61.jpg


( x4 s0 X9 p# s7 ~% ]$ J
  1. HAL_UART_Transmit_IT(&huart1, "TX\n", 3);//串口发送中断使能
复制代码

* E* p  |) u- J- y

追加到回调函数:

40_meitu_62.jpg


, S7 h- |- l4 c3 ?2 _+ _+ L

41_meitu_63.jpg

重新编写回调函数:

42_meitu_64.jpg

9 |9 n1 O$ A  ~7 B# j& z

  1. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)) T7 w2 f3 q; C1 o
  2. {# `+ \/ M1 P$ z) i# W- _" b: ]
  3.         if(huart->Instance==USART1)//判断是否为串口1的发送中断
    * ?! }* }% l" h3 _2 {
  4.         {- |, K/ z) `/ X% k
  5.                 printf("tx success!\n");//如果发生中断,则打印一句话
    1 l- c9 D0 v# a2 \1 z2 V
  6.         }0 j1 e" W% \8 W" U
  7. }
复制代码
1 v% D* ]4 w+ t7 R

3 P8 e! f; ^6 b8 s! Q. {
. {* a' u- H$ `/ B' t

测试结果:

/ d7 A/ Y9 ?5 p  B9 L

' [4 i7 h  |  {$ u: ^8 q3 Z

43.png


, K, X% x9 N$ b7 M7 T0 I4 |, t1 M* M- }2 y, f5 ~8 o' d, O# \
34_meitu_56.jpg
37_meitu_59.jpg
赞 收藏 评论0 发布时间:2020-9-27 14:08

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版