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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。
' I) A; M8 ]8 [( j0 u3 H( ]  U, J如果我们设置好了传输完成中断,就可以实现了。
5 ]. `6 E# X* Q7 m" r1 N在STM32F7中文参考手册中,有关于EOC的介绍:
  N- t7 x4 s4 E: c1 v
20200421211806557.png
5 k6 g# Y# A& n' B- a

' o" x  e, h+ P: aEOC有以下取值:
$ E" {) w1 e) x% d9 R
  1. /**2 ?% V( Y$ C' G
  2.   * @}
    + U1 E; ]5 ?4 E- C. Y
  3.   */
    + Y2 J. z' P8 p$ e( W# u% B: }

  4. / ]! \% _, c  `+ M
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection- e* o: n, r2 p" S- X# I
  6.   * @{% E, G' G3 B4 c- z6 w7 _
  7.   */ ; m! y4 w, D0 X  w% X8 R( i
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)! H: m2 k% F! p* E9 s# ?, s
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)
      d! l2 x3 X# P( E
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
0 \/ p1 C( k( e
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;
4 |4 ~- q1 l, m5 I# e对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
& @0 e7 ]0 R$ b. E+ X+ \) H至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……
* Q7 \  p! D5 k1 ~9 z9 Z+ _* S& u! R% C0 a% T$ t; P3 r* t
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
9 E3 Q4 L+ `( ^6 Y. F8 V4 K$ V+ f1 s" r9 ]' ]5 b  M% m
NVIC配置

8 e! o. M5 Z4 D( m, c不配置是没办法进行中断向量跳转的,这个不用解释。
, j6 r* x* ?; q
4 s( E4 c" X0 G; I* d/ A
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    0 I5 E( ?8 n5 H: v$ U
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码
0 K% R+ H9 {* T* G
配置EOC类型# Q" @- v6 @9 E9 j3 u$ X3 H( @
选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。2 p* R0 a5 a! H& [
$ ^  y4 j# p) N4 b7 w  L
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码

9 D0 S9 e0 ^9 S+ \3 f使能EOC中断) v+ s0 P8 l; r+ d$ c7 s
在启动ADC之前,我们要打开EOC中断。
5 e7 Q7 X$ r6 P: \3 X) H) L. k, l, @6 ~$ k$ J* j& Y# k2 u: G
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码
% [# H- V8 T$ B, ~. q- ?
然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。
( ]. Y% ]+ ~9 z6 i: H6 e$ \( h% y% n" O& _) e5 X% x
  1. void ADC_IRQHandler(void)5 J0 ?; X/ A5 V7 ?' |; [  ?
  2. {
    ) P4 _$ t( t# g
  3.         printf("eoc\r\n");
    + a6 ?3 f/ [- S& G" Q
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);# e1 a$ a6 ?+ ]$ Q: }
  5. }
复制代码
( s, {$ R; r. G% s  s) R" I
4 h+ @. v* ]7 b; T; Q
4 J, p/ @1 v: E7 Z9 Q

0 d% p! b8 E2 D" g+ N
收藏 评论0 发布时间:2021-12-15 11:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版