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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。
( u/ e2 B+ Y4 [' r8 G5 w如果我们设置好了传输完成中断,就可以实现了。
2 I0 n$ S. S9 n1 P% c0 n在STM32F7中文参考手册中,有关于EOC的介绍:; e. D- w( c7 o
20200421211806557.png
0 @! Y+ q& i4 H% Q* I% C+ k' p
+ d+ P( R: y2 J" a. p" e8 B" X
EOC有以下取值:( \# l7 f' ]5 x/ p/ H
  1. /**1 v3 U4 u6 N# ?2 u: F
  2.   * @}
    " @2 [$ ?2 K" G5 \
  3.   */   M+ F8 Z5 H4 G4 {

  4. 5 ?3 E- s0 C! m+ `
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection
    6 b* u' D. c" o4 b6 \8 [- x3 R$ k
  6.   * @{- ]* v+ V' g& D6 \
  7.   */
    % M8 [9 J! x! v1 H9 J+ E' o
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)
    ! _+ f' y. d4 C& g& z( d% c4 d, M
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)
    , h& o' K9 U4 r9 O  |0 k: l
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码

2 t2 r+ X; B0 ^+ i2 i3 a6 k对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;
& K! b" V8 p; E: s4 ]+ B! q对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
0 i! r* N  c7 y& R0 p7 Q至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……
/ O5 y: @- q: l8 ]: y$ s$ i9 P' i4 W
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:( c3 H" y- h* y& H0 l
$ C, k- ]7 d9 u! Q5 F# u& k
NVIC配置

/ j/ i1 c8 N4 o' U3 N7 a* t不配置是没办法进行中断向量跳转的,这个不用解释。
$ R- |8 e5 w# v% x. ~6 w" Z
( e! C8 X9 B  u8 V7 h' |: Q  P
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);8 o) L* J3 h& k) {
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码
4 F( F: _+ {" q7 n& P' G: U/ i7 |
配置EOC类型3 C4 T" N0 t: q. f; S
选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。
) M0 Q& R; B% n5 k, ]$ [9 \; \
5 L, q0 K7 i  W- A+ I  c# T
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码

- k+ @! D! @6 Q1 f0 B9 H# t使能EOC中断' w) a# F% w+ \
在启动ADC之前,我们要打开EOC中断。
( d3 X0 L1 x+ \( D$ X
) T; m8 A1 ~4 J  J( N# a! i
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码

) n* s6 M8 }5 x- d然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。
$ `" Z( F! m. D$ I2 D. i0 |& _' t0 D2 |. G
  1. void ADC_IRQHandler(void)
    - F# L  ~  R) I  Z8 G  A5 C: N
  2. {
    ; |$ ~4 M/ m$ v6 o$ I; h
  3.         printf("eoc\r\n");1 j4 _, O6 @' |- w
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);
    ( t  ?7 L( t- o( u
  5. }
复制代码
1 d2 |9 c# V3 y
, v' v8 }2 r7 `
6 |; L% @8 C/ ]! n

$ U& E; V7 |; w% K/ F$ d
收藏 评论0 发布时间:2021-12-15 11:00

举报

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