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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。7 v9 A2 s2 k3 M3 C, {
如果我们设置好了传输完成中断,就可以实现了。9 s# L+ s5 Y: h- y" V
在STM32F7中文参考手册中,有关于EOC的介绍:
  t% n& c% \8 A: w" ~  C1 h
20200421211806557.png

# N& i) Q2 N7 z: D: h& z% V6 X
5 w/ X. B. K$ J, I# |  tEOC有以下取值:, f9 z4 K  p1 ^; H4 ~% o, D. Y7 `
  1. /**
    7 a& m- c" p# j/ E3 T: Y
  2.   * @}. i6 l$ m, N* v: K# `
  3.   */
    & l/ s) ]# U" G) o

  4. % j8 q. i" o" R, u: `
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection
    ! l8 q2 O2 U4 d! A
  6.   * @{" ^7 C" p# h" z! y4 U' t% E
  7.   */
    / e- i' J/ z5 n9 R9 v/ g
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)$ U+ M% y: x' h! l  a
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)# g+ @" y  R! T# H
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
# {! [9 c) k: n# [+ w
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;
8 K1 Y% E" L( a' a2 Y: w; ~, p# n对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
) ~: [% k0 h, y) V至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……# C  o* x  J+ y1 R
, t  w+ c7 h8 C+ S1 H
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
7 d% \# X$ F( V6 V3 Q  z; m  T
* \; Z& p1 E+ z* Q4 sNVIC配置

. Y0 l+ h' `& e4 n9 F) t/ o& {2 x不配置是没办法进行中断向量跳转的,这个不用解释。
$ R7 [/ E  H4 |) g7 M
3 ?% z2 I2 K9 R( w
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    ( r' Q6 \$ o8 t$ y1 |
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码

0 |7 O1 [+ ?4 e5 `  D. Z配置EOC类型5 E. X, p& D2 r8 N* a' @+ j0 N
选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。
) T3 h0 h8 U# t6 D+ S1 Q( Z" h4 Y) m' B2 O3 @9 P5 x$ D. B8 B8 n
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码

0 w% ^. v" {, z, C6 `, E- I+ R使能EOC中断$ {; {2 L0 C8 ]0 ]3 U, X4 t
在启动ADC之前,我们要打开EOC中断。7 t. U) D3 Z) D! r* y3 `. E2 k  r
& h1 z/ {3 y: v8 `; h4 r
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码
. m  J& g/ o1 V% g2 f& |
然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。9 U" d8 }; l/ I6 G" G& `
" o' ^! N( r: j( n0 p
  1. void ADC_IRQHandler(void)
    - v4 k* m% }1 \8 I  W
  2. {) H. i0 _1 I. u1 A
  3.         printf("eoc\r\n");
    3 r) e' E- O! Y5 t
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);. M9 \: R' j2 X# l
  5. }
复制代码
/ p& V5 H. I" p

. e5 |, U7 Y  D( h' ^. c
; [6 t: Z, g+ M2 W0 N* D& ~& Z& ~$ N* \8 W' R! y. H- r. h7 \
收藏 评论0 发布时间:2021-12-15 11:00

举报

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