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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。
  R# q; w, ]# }+ K. L5 L如果我们设置好了传输完成中断,就可以实现了。
1 A; ^. K- N' _* e5 X在STM32F7中文参考手册中,有关于EOC的介绍:
$ @3 J, D0 b; A, U3 q6 a
20200421211806557.png

2 D* ?+ h, k: x3 r, x8 M6 f2 F8 G% R% ~4 s$ c
EOC有以下取值:
0 O: f' i+ l3 E# t
  1. /**" C# [  C7 @1 ^: D
  2.   * @}' v$ o  J  u& J' r
  3.   */ 1 L  [( Z- a0 S$ y
  4. " `8 h- e: y% M( _$ i2 H( q1 c* I
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection% V  V* A2 d# Q: D+ H* E: L% h* ~
  6.   * @{
    ' ?1 ?& W  o9 S) M" [( ~- I. x
  7.   */
    2 m+ b) l: w, C2 u
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)0 ]: u3 B# M5 u) M4 O
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)
    . e" _% h5 R7 p
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码
0 M0 v9 |7 }5 n" Z- C; b
对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;6 o4 Z" W5 ]9 k
对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;/ N$ a# c) |0 m( Y: o& q- O
至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……
) N0 M6 H" \" N: p( `% g3 D- Y- [& w2 S6 g$ E$ F
在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:* Z, E' r; K* ]3 D! O
& k% o$ g+ m6 I6 d1 F( U6 z2 C$ ]
NVIC配置
9 x% F3 b5 M. Y0 `! j  q, f/ ~+ A- R& i8 Z) Z
不配置是没办法进行中断向量跳转的,这个不用解释。
- t8 L% j+ a" ~! w5 Q) z1 P1 D
1 T3 W& y4 L/ s0 m: `4 H9 j- f3 n
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);$ j. ]$ O" u% g
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码

1 d! ]9 y5 d* |% s" g配置EOC类型
# r& I/ X+ N/ R$ h& j' @; T6 E1 E选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。
, u! ]3 P) P. U1 H9 R
4 G$ p' P9 r+ b# f% O
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码

) ^' p& t& k/ a) D- R8 I使能EOC中断
9 X, O) `) H. O; o在启动ADC之前,我们要打开EOC中断。
4 D' y4 ]) |" C2 N
: `! n) O2 r1 ?) Y4 o. m4 j" \0 X
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码
1 W" R% I0 E% T/ d- t1 K
然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。
- }- l( k# v9 t/ S' Y0 r! k5 w/ p5 h; B) D# b' j8 |$ C+ O
  1. void ADC_IRQHandler(void)
    2 h! `& ~' N. w( y9 B
  2. {$ q2 k7 e  `$ @7 Y) f+ `8 P5 B
  3.         printf("eoc\r\n");
    2 F( d: y) j; I$ s  e  `
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);1 B4 o5 p9 ]3 Y- q
  5. }
复制代码

) ?9 ?! D2 `# f. _- i. g8 @$ `) H3 l+ C% @
* s( {9 j; Q7 ^( H& f6 R

9 S9 @0 x( e% J9 l
收藏 评论0 发布时间:2021-12-15 11:00

举报

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