找回密码
 注册
关于网站域名变更的通知
查看: 205|回复: 3
打印 上一主题 下一主题

外设事件中断响应流程及注意事项

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-4 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Questions:为实现任务的快速响应,应用通常会设计外设中断,在中断函数内响应事件标志对应的回调任务。但大多外设均具备多个可引起中断的事件标志,如何实现回调任务的精确响应将变得尤其重要,本文档旨在介绍一种保障回调任务可被精确响应的方法。
0 n! P6 A: C; f% t1 z
; e7 z) p( t+ D0 Q0 BAnswer:; n+ T. W  h% u- c
以下将以USART2为例进行阐述。
# u  l3 R, h; P' P1 L3 ], |. O' p. q$ e
& {- s+ y  G+ k& J
中断响应过程及注意事项: S0 o( v" Y7 G& }3 d: d
1)        事件标志置位
5 o6 c' t- D1 B8 H: {* b  ?当事件标志产生条件成立后,硬件会置位对应的事件标志。
6 s3 G& O4 Y9 [8 U示例:当USART2接收数据缓冲器满时,会立即置位对应的RDBF标志。$ z8 n: a! o+ ~7 @! v( L; y
注意:事件标志的置位发生在其对应的事件产生条件成立时,不受对应的中断使能状态影响。
6 I; C! @1 D* @# k! g2)        中断服务响应' S% a/ y$ _+ F+ J6 ~
当事件标志,且对应的外设中断处于使能状态时,硬件会通过外设中断通道向内核申请中断服务。& I& n7 J4 T- F. Y6 W
示例:当USART2的RDBF标志置位,且RDBFIEN处于开启状态时,硬件会自动通过USART2中断通道向内核申请中断服务,同步置位USART2的NVIC pending位来指示有中断申请出现,以指示代码需要跳转到中断服务函数执行。9 {) d, ~& o0 g9 l
注意:外设中断处于失能状态时,对应的事件标志置位并不会申请中断服务。
/ L; f) q" ]$ l( i3 g: b& J3)        中断函数执行
/ {. L) f# v: f在符合中断响应优先级规则条件时,代码就会自动跳转执行中断函数内的回调任务。
$ G* \6 [, \& f- n5 Y4 m! A由于同一个中断通道具备多个引起中断的事件标志,对应共用同一个NVIC pending位,且该pending位在代码跳转到中断函数后会被硬件自动清零。
0 P" s2 v( F4 C! f" J& _注意:该NVIC pending位会跟随该中断通道内的任意被使能中断的事件标志置位而置位,其只记录有无,不会累加。并在响应中断函数时被硬件自动清除。  b, k2 W' J8 M3 E; g* Z/ k( `. \
为避免事件标志的回调任务被漏执行或误执行,软件必须要在中断函数内做好事件标志的区分处理。如下建议方法:& [/ q; [" p# l$ \% C, E
回调任务漏执行的避免方法  A- L; f- N. T$ z8 w- K$ D" r& o
当同时使用同一外设的多个事件中断时,中断到底是由什么事件标志产生的须由软件按照如下区分:
4 x$ r: w: c! [3 ^5 Y2 \( t$ D在中断函数内,查询每一个事件标志的状态来决定是否响应对应的回调任务。; J# N: B- [) v( m3 _8 E4 D
示例1:当同时使用USART2的RDBF中断和TDBE中断时,中断函数需如下设计
! i& V8 t+ Y, {7 y& `& ]  y! M! K  void USART2_IRQHandler(void)$ `* L! F" Y; o2 M/ m
{
7 u' s! }- @! ^- `% a& C( b  n7 ^' `& o/ W  if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)  s( H8 ~5 A/ |. K) ~/ h+ W- D
  {
* s1 ~1 o, _# Q5 |. u9 q! ?$ ?& [9 }! Y    /* user code */
; {3 Z& b& |1 }/ S. [( u4 T  }
' V5 {: s8 a" B
+ n& y' a, }" K, G. J' J# u  if(usart_flag_get(USART2, USART_TDBE_FLAG) != RESET), y8 V" h6 s  Y4 E# O2 E

  M( `# T. H3 _. M: l* Z) B  {2 F+ z* V# g5 s7 a, T% H
    /* user code */
+ @0 c  d4 c! x2 }  }5 L( C- j7 P+ [5 N
}8 x1 d, N8 a8 _1 ?/ h8 K

# t7 l7 ~* [* _可同步参考如下路径demo示例用法AT32Fxxx_Firmware_Library_v2.x.x\project\at_start_fxxx\examples\spi\halfduplex_interrupt8 }' R6 U3 W; [9 ?7 y* _
回调任务误执行的避免方法
; ]* Z2 z1 d0 [% t当分时使用同一外设的多个事件中断时,中断到底是由什么事件标志产生的须由软件按照如下区分:. X, }! j. r% _+ e
在中断函数内,查询每事件的中断状态及标志状态来决定是否响应对应的回调任务。  G0 t; C8 H' M9 Q1 P, C( w0 Q! e
示例1:当使用USART2的RDBF中断、并分时的使用TDBE中断时,中断函数需如下设计2 v, P2 J, m- a4 D/ Z
void USART2_IRQHandler(void)3 z+ E4 T2 e) R9 |
{
! V7 y* Q, w+ \  if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)
4 a1 l3 T0 b) c1 w  {. J6 _6 r! \4 u8 ~2 Q% a2 q
    /* user code */
# u( x* u8 o- f! g# `  }" w  y0 h; C( w" U
  if(USART2->ctrl1_bit.tdbeien != RESET)
$ Q1 o0 e' g; R& H  {
' u6 M& u" c7 l1 D) g4 x; o2 s- ]$ r8 p    if(usart_flag_get(USART2, USART_TDBE_FLAG) != RESET)4 G6 H" R7 `' _$ h6 m
    {
9 O8 Y6 D6 r4 o; r2 |      /* user code */0 B: K3 p, @0 ?  V$ p% J
    }
9 O, l, X, c# R# N, a% g8 g  }
4 l/ M' m1 M: y& E9 ^8 O( c}
/ x0 w% ]2 i5 L( M% M: \/ U: }% Q* q: v
可同步参考如下路径demo示例用法AT32Fxxx_Firmware_Library_V2.x.x\project\at_start_fxxx\examples\spi\halfduplex_transceiver_switch& D& d, x, N" x; @/ `8 n. d
4)        中断结束返回/ J) Z( v; [* u1 ~
当中断回调任务执行完毕时,软件应该及时清除事件状态标志,随后代码会自动跳转回主函数。& y& j6 K% i+ h

该用户从未签到

2#
发表于 2022-7-4 10:21 | 只看该作者
谢谢楼主,学习到了

该用户从未签到

3#
发表于 2022-7-4 11:16 | 只看该作者
好好研究下,谢谢楼主讲解。

该用户从未签到

4#
发表于 2022-7-4 14:34 | 只看该作者
太好了,赞一个。我也来D一个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 05:36 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表