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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。+ e4 }0 s1 \& ^6 B- e6 s; T8 b
如果我们设置好了传输完成中断,就可以实现了。
7 b8 u- I0 ^+ }0 k0 ~8 [$ \# f  d在STM32F7中文参考手册中,有关于EOC的介绍:, E$ |- [  M* {  P" n
20200421211806557.png
& @- v$ H/ x' C% l! H2 c9 ?$ z& i
' _+ s( y- n2 E
EOC有以下取值:
/ r4 b) P; s9 j
  1. /**% [& `) C" @2 E" S
  2.   * @}
    ; f" D. ?3 O% _* Z8 s4 i" O) N
  3.   */
    # _$ y. ]+ g# _$ G7 v4 X8 l

  4. , ^* @5 {' l2 u1 N, W8 A! L
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection
    6 q! c  ?- z) }; X
  6.   * @{
    & m  j" M2 ?) O0 g$ s' z
  7.   */
    1 h7 q5 ^( z/ ?9 A
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)5 l8 w0 G* v* X9 @1 N) ^+ p
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)
    ) a9 V% k% P  x$ V2 p+ J
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
5 o! e2 \% k' Q; N# x
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;9 R* ]# D4 h7 |4 L1 Z& D
对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
3 Y6 j( w" z' f, {" E8 d至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……& J2 j1 G" e" L
- {4 H7 a( ?/ U9 h+ y8 ]
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
8 e( w( s3 z$ q" P) V) _
3 q% S3 m! |3 jNVIC配置
+ ^7 e0 o) T1 |1 X# |* q- ]. K- E3 H
不配置是没办法进行中断向量跳转的,这个不用解释。
8 f4 L! j3 u& u9 K7 h2 f" R
# X; t% s! `5 q/ A, l  f2 \! w
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);# F$ V7 o6 c0 }- {# e7 @, ?
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码

; V$ R3 V# W+ Y4 S" R配置EOC类型
: V2 E! g4 G9 C+ s4 y4 _选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。& W$ ?  K6 m# _6 u
3 I6 F; p3 f' G0 i& W
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码

* q7 Q1 c+ f  P) ], J使能EOC中断# i, x5 ^- Q4 Y( s& J4 L( j) T- A
在启动ADC之前,我们要打开EOC中断。
3 N# P9 O0 i* f" p+ P
! Y. B! L: }' `) G* s3 G  ?+ e
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码

5 Q" E1 m, a9 G* t2 E0 {2 t然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。1 H$ `) W& D2 H

% M0 t. b" Z2 _" }" I, a, b
  1. void ADC_IRQHandler(void)
    4 T# o2 U9 E% t$ ~" m9 V1 L( y
  2. {& o+ i. b9 ~  u! E$ ?2 i
  3.         printf("eoc\r\n");
    0 T* y" m  U) g  m
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);
    5 w9 h% I" c- j# i& c  Y9 O
  5. }
复制代码

# t$ U6 W  Q. A7 o0 g8 I% }' m5 Y1 W& E/ l- c9 Z
; x$ c" h; R& f; A

7 Q3 ^1 b3 u  C5 `5 M+ `$ V. _
收藏 评论0 发布时间:2021-12-15 11:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版