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

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

  [复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Questions:为实现任务的快速响应,应用通常会设计外设中断,在中断函数内响应事件标志对应的回调任务。但大多外设均具备多个可引起中断的事件标志,如何实现回调任务的精确响应将变得尤其重要,本文档旨在介绍一种保障回调任务可被精确响应的方法。
7 j% ]+ \$ F( }4 L  Q3 Y
4 }' a  @1 C& \% x+ MAnswer:" }3 h: K8 z9 p& k# b
以下将以USART2为例进行阐述。- _* Q" Y' f& n% o1 D! _
& V2 ~9 r- _( ?6 `

) g3 q" z* c, \; }: y中断响应过程及注意事项$ T* J" _: k6 n' V$ |" e
1)        事件标志置位 " a) h9 b" Q8 Y3 g" f, n$ ]9 A$ J
当事件标志产生条件成立后,硬件会置位对应的事件标志。
! T( X$ ^% r" v6 u9 ^示例:当USART2接收数据缓冲器满时,会立即置位对应的RDBF标志。2 G) t1 G7 `" S' [9 k' c
注意:事件标志的置位发生在其对应的事件产生条件成立时,不受对应的中断使能状态影响。3 F. L6 U8 g8 g: l" k7 n
2)        中断服务响应
  n8 K8 @) F5 F) I* Y  T/ K当事件标志,且对应的外设中断处于使能状态时,硬件会通过外设中断通道向内核申请中断服务。
! m/ L& ]' E3 Y$ S1 l5 l, d! O& t% j示例:当USART2的RDBF标志置位,且RDBFIEN处于开启状态时,硬件会自动通过USART2中断通道向内核申请中断服务,同步置位USART2的NVIC pending位来指示有中断申请出现,以指示代码需要跳转到中断服务函数执行。
. T7 M8 p; w  c' j7 ~' M1 D3 `注意:外设中断处于失能状态时,对应的事件标志置位并不会申请中断服务。
$ |7 p! y5 k' M) W3)        中断函数执行1 [* R9 N: L8 ~- e
在符合中断响应优先级规则条件时,代码就会自动跳转执行中断函数内的回调任务。
# a3 z* `# G1 P  b* i( Q1 r" |由于同一个中断通道具备多个引起中断的事件标志,对应共用同一个NVIC pending位,且该pending位在代码跳转到中断函数后会被硬件自动清零。: T4 U8 p' g7 t& b6 e: Y7 P; B
注意:该NVIC pending位会跟随该中断通道内的任意被使能中断的事件标志置位而置位,其只记录有无,不会累加。并在响应中断函数时被硬件自动清除。
0 a1 ?) D6 p* W5 h7 C. P! k! i5 O为避免事件标志的回调任务被漏执行或误执行,软件必须要在中断函数内做好事件标志的区分处理。如下建议方法:/ h$ R% b: s" f- T& e" t) N
回调任务漏执行的避免方法% }4 D  Q: U' e: e% j. o  `
当同时使用同一外设的多个事件中断时,中断到底是由什么事件标志产生的须由软件按照如下区分:
  E  W% Z- [, L% b2 F& z8 j* D$ P在中断函数内,查询每一个事件标志的状态来决定是否响应对应的回调任务。( _% b; E' p5 n7 v& d$ u1 w% M
示例1:当同时使用USART2的RDBF中断和TDBE中断时,中断函数需如下设计
7 ^8 [1 X$ w: n" `: i- m- m  void USART2_IRQHandler(void)6 F' Q/ l: o+ _1 M! _$ ?8 q$ ^
{: e2 f$ x4 ^& o) D9 d& h
  if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)
6 z1 d- c* [2 ^- o& `! p; G8 D  {
$ y' ^7 w: G* a' D$ C    /* user code */9 Y7 Q& l' U( l  T/ a
  }
. E/ s) [, p' I& ?1 w3 b) Z
7 s9 |; B* e& |3 L- T. q- d- X  if(usart_flag_get(USART2, USART_TDBE_FLAG) != RESET)- v" e, c3 o: V% \

, j6 O! a1 E1 a" @% U  {2 ?1 |* X3 t& R) G! y3 M
    /* user code */- I: b2 ^) P$ ^6 ?8 q0 q" _9 {3 V
  }: ^5 p  s9 ^5 }  ~9 @3 B6 ~
}1 U& J+ l: A/ Y
$ P* j1 w; T- Y: a" f
可同步参考如下路径demo示例用法AT32Fxxx_Firmware_Library_v2.x.x\project\at_start_fxxx\examples\spi\halfduplex_interrupt
5 o: I) G  k3 Q回调任务误执行的避免方法
" f6 n" D4 Q0 C  o5 r; t2 ?+ d; e当分时使用同一外设的多个事件中断时,中断到底是由什么事件标志产生的须由软件按照如下区分:$ a; k6 q* P0 k: X1 k
在中断函数内,查询每事件的中断状态及标志状态来决定是否响应对应的回调任务。& O' F: M& J( B: o/ q. c) z$ K
示例1:当使用USART2的RDBF中断、并分时的使用TDBE中断时,中断函数需如下设计
% ?" Z6 R6 e* t& E4 Y0 O2 O- L0 Y7 J void USART2_IRQHandler(void)' `; m0 W+ g2 ?
{: Y. I+ W: z! W0 Z/ @
  if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)
6 B8 k$ M5 N* x2 M8 Y  {
7 P2 w4 m1 _5 \$ A& [    /* user code */! Y8 h# p  k* G. e
  }
) p2 r7 ?/ Y3 J- [1 I  if(USART2->ctrl1_bit.tdbeien != RESET)" u9 H0 M- s( ?9 r2 i) [# t2 \8 p
  {6 X2 e" v3 X6 r; X" @
    if(usart_flag_get(USART2, USART_TDBE_FLAG) != RESET)
1 M8 c. r$ F  H  ~* V. \    {, W; H# y# f+ m: v6 m8 j, w  R# ]
      /* user code */. _; _, o0 L2 a0 q9 _1 w6 Y
    }
. l% ?* ?$ a' N6 a! V: e  }
4 N- w0 t* `4 d2 G}; Q  G4 Z! B# K5 n1 Q- J; A$ M5 P
8 N1 B8 t0 M+ u* K
可同步参考如下路径demo示例用法AT32Fxxx_Firmware_Library_V2.x.x\project\at_start_fxxx\examples\spi\halfduplex_transceiver_switch# `  Y/ Z5 e) I3 ~6 m
4)        中断结束返回& g" W5 N9 u$ x/ D9 S
当中断回调任务执行完毕时,软件应该及时清除事件状态标志,随后代码会自动跳转回主函数。
  s0 S* k- ^4 W6 W+ }6 m

该用户从未签到

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-6-30 16:29 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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