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

【经验分享】STM32F7实现ADC等周期采集(定时器触发+DMA传输)采集完成后的中断设置

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。
' b% q  k  X7 x- ~' T4 ^如果我们设置好了传输完成中断,就可以实现了。
7 c' i7 Y) Y1 \* c& j. E6 S9 W在STM32F7中文参考手册中,有关于EOC的介绍:1 e  x2 H/ b- N) z6 g! t
20200421211806557.png

8 m$ j9 q- [6 i( q2 u8 }
9 [0 d2 }/ m$ {EOC有以下取值:
7 k5 S3 b4 f+ _) p  M) N* B
  1. /**
    4 m, L. J' y7 o0 ?
  2.   * @}
    % \! ^: a2 W( h2 |  L3 b
  3.   */ + Y& T) e/ U/ a% Y2 s
  4. ) h) e4 J1 u2 H" ?6 o8 `" G
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection- V: ?* X  b1 l
  6.   * @{' f# s, E0 Q. \+ q: v5 |% L
  7.   */
    & f, ^5 d. h; J
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)& C. q6 y& @& v; a/ f. w
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)& L+ ~0 H2 _+ x. x! N+ @
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
; I) p' [, O& z4 S4 ]4 g6 s$ ~
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;
+ U2 G8 H7 A7 c6 b7 [  d8 Q: d对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
4 x" \7 @, L) ?" ?至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……: [! l; Q7 Y9 ^( f/ @# j. q5 E3 C
8 b+ t, c6 g9 Q, a' B% h$ `1 ^
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
* E" X1 H/ ?- [1 x) |
; i1 W% p, Q! n7 dNVIC配置
  W( Z) `$ o' i7 o
不配置是没办法进行中断向量跳转的,这个不用解释。
9 _) K: S' q" m8 [5 n4 N( U# @& H! N' o) D
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    ! s( e7 h, z0 l* ]( [' k* ]" r
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码
- U1 f* X  v0 z8 P$ Z/ U
配置EOC类型0 G$ C- d1 l$ b3 g! M
选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。
" `9 u! }' Q7 v' ]4 O6 P2 D6 }# h$ s" t, }" W7 V* k- o! T5 `& r
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码
  |  n: e* [, F: y2 f1 Y1 G
使能EOC中断% _4 ^& h6 |& k( O+ t. x- A
在启动ADC之前,我们要打开EOC中断。3 p  Q: I6 M& L) A% X( a; P
4 s/ c! V( A6 ^# {
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码

* c- F! d- `% E8 z; [$ ~然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。
4 ?# k6 [1 `, Y4 h  J3 N. J
4 z$ u1 O6 x/ `$ Z5 L2 q
  1. void ADC_IRQHandler(void)
    , |6 \, F( R( \
  2. {+ d1 k7 |. I) m( p! |' z
  3.         printf("eoc\r\n");
    + ]' [- m. k, m  M4 C% ]& W
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);5 `( z2 o1 \& j# e
  5. }
复制代码

5 Y- R! J( v0 n) z. ~- W- g2 H0 ^" M& w

! i1 y& ^- T3 X% d. z) U) p
. R8 K& {3 I$ `4 Z' h% u) r
收藏 评论0 发布时间:2021-12-15 11:00

举报

0个回答

所属标签

相似技术帖

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