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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。
3 _3 \' d5 W1 R如果我们设置好了传输完成中断,就可以实现了。
! |# f0 `2 B' e" S; }; Q在STM32F7中文参考手册中,有关于EOC的介绍:
+ ^0 g9 w# U  A) |' @/ w; g
20200421211806557.png

' j# _1 u+ s! I! v( o' d3 C& `0 `5 q! b/ J2 {, m
EOC有以下取值:
* c; m+ ?% C, R# ^  P
  1. /**5 ~# k9 s+ p! Y2 E
  2.   * @}1 ]9 C, w, r% l& a! z: ]+ f4 Y! w' H  u
  3.   */
    6 N0 a) r; W! m% ?/ }& O
  4. , d7 r1 q8 K$ M
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection
    " [& H( f2 M! K2 u$ Q: z# N
  6.   * @{/ X6 x. [. d" N, Q  i! A& M; v# k
  7.   */ : L7 b( A2 w: }; Y9 h( b7 ?
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)
    4 R3 Z" \! z' h" @& S4 S
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)/ T( a" w# S8 b
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
' K: A' k- T9 h& D7 x
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;$ u: K+ K  J4 Q5 [, w+ [( Q0 p
对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
1 y+ f2 O. l' q$ R7 @, `至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……
- D5 x  @# A8 ^/ A# S- n; j8 `) ]
7 y) G  r- v% |在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
  l. K5 j# B- O# O. V4 p$ ]2 e. l/ W5 S1 z( h: t. w
NVIC配置

$ \4 I- u" g6 _不配置是没办法进行中断向量跳转的,这个不用解释。
9 z; I5 W% y* q* Z! \- ~/ H
6 e: F0 U: s: ]
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    7 _3 |  t9 x. `
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码

/ I, s' ^. `* J* Y- u, l7 k配置EOC类型" V5 v' U# M0 ?5 }0 ^
选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。# L$ R% G" D% ]* h$ o
1 J+ i1 n1 E8 L" J, n% n
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码

. B$ |3 a6 R1 N( Y$ n2 j9 C" D使能EOC中断( C" L% a: j- ~: K
在启动ADC之前,我们要打开EOC中断。
3 k) A- J$ L7 ~/ C+ F7 B# E" O' X9 }" E* u
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码
+ m1 x! U: E* T( x1 }/ M
然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。1 h& I; y0 J* Q5 M! a
( G* ]3 V& y8 O
  1. void ADC_IRQHandler(void)# @0 {- V- l& O4 g
  2. {
    # ?" z  H6 h. F. Z
  3.         printf("eoc\r\n");
    + I3 L) x" l; b0 _0 z' r  P
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);, Y4 Q7 i1 q9 q) \, Z8 s; O
  5. }
复制代码
- ?/ W/ P) _$ ^8 ]2 r9 f
# T& X* Z3 |# ~- x

' V  Y  U0 H3 W/ Y( F6 T* P6 s4 S$ a2 B3 n1 D/ f7 i4 }% F
收藏 评论0 发布时间:2021-12-15 11:00

举报

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