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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。/ P0 _* X& Y# V* C( ?9 i
如果我们设置好了传输完成中断,就可以实现了。
2 d5 b" E; @1 m: G$ E& }在STM32F7中文参考手册中,有关于EOC的介绍:
7 v) K1 I2 l  l  ?4 O3 c
20200421211806557.png
- Y5 j. D, O% q8 e; E* A& e
' f3 }/ }* T% L5 g' }
EOC有以下取值:/ c- q/ }1 a) t  v6 V& N; k
  1. /**
    4 E: Y( e# n( Z( Z0 C1 y
  2.   * @}0 G3 P; c% g7 C  M9 k1 u
  3.   */ 9 W) A+ S( D8 X0 L0 F+ X( j
  4. ( v4 e; S6 z4 s2 s9 U; m) Z8 d& q' q* @
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection
    / X* P  k; h6 y! C# s$ U% l; L' q
  6.   * @{$ \+ I' l$ e& x$ Z2 H/ I6 ]
  7.   */ : @, u: V/ T# i4 w/ E( ]) l: o
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)
    0 ]  a) K- o4 [# L2 y. r& a
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)
    * @  ]+ c5 ^/ u; F, y- o% s9 k& B
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
* t$ P  P: ]0 B
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;
) i$ {9 ]+ @6 X. r' p对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
+ V/ q: ^2 B/ E至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……7 }1 t. h7 R9 n7 y  L/ N6 E
0 m( @) c# c* x7 G: x
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
& w9 t7 ]/ e4 H& R* |
9 k, C  S. C" z2 ?" D( {NVIC配置
1 f4 H( R+ p9 n1 I
不配置是没办法进行中断向量跳转的,这个不用解释。0 K/ K3 @- A/ u3 }  z4 @% m" t

8 X* w3 a7 d6 ]: C0 W3 L
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    2 ]' E" W, y6 k. i1 `
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码

7 `& l  C3 ?9 w: @7 h配置EOC类型  x. e" F+ H4 D& a, d9 n
选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。
; O: Q& j  T3 i* i' b: b, P% g' H; v$ F3 o* F0 c: f* K
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码
: S4 |( \. E6 b2 k; U- T# B" e
使能EOC中断9 c* L7 s- e9 k. n* A# n' v: P
在启动ADC之前,我们要打开EOC中断。2 _/ [2 p" |" J! K

8 u3 G. `  O3 m$ f
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码

3 o: [6 F& h/ w" _' b: u然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。' Y. O8 w: d" Z/ E8 g/ h" S
5 ~* `5 E8 R& e5 ~* Q
  1. void ADC_IRQHandler(void)# ~( V/ u% i3 k( m. L
  2. {
    2 [/ k# A- a; M* j, U
  3.         printf("eoc\r\n");# @$ P, \9 t; j- r3 K5 T
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);
    0 ^3 G1 j" \) N' ^
  5. }
复制代码

" Q; Y+ G9 A) Y( e
+ M+ |( B7 Q  E1 [, j$ `* l  L+ @! T8 A- F2 x

4 C/ {) [- L7 V3 e+ ]
赞 收藏 评论0 发布时间:2021-12-15 11:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版