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

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

[复制链接]
STMCU小助手 发布时间:2021-12-15 11:00
虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。" ~% `- c# O; o9 C# }  ?
如果我们设置好了传输完成中断,就可以实现了。" z* T. A0 z! b& N9 H5 O
在STM32F7中文参考手册中,有关于EOC的介绍:
2 l; G' J& D& K+ r# h: N
20200421211806557.png
7 F$ n/ Y3 F/ j) t

0 H" T# ~6 _! P2 k. n8 REOC有以下取值:3 f" {) @8 ^: U1 v; q9 r4 \
  1. /**
    + B' r- ~! g7 n6 X" ^( l2 Q
  2.   * @}, t* k9 J6 B2 b( O# j; S/ z
  3.   */ ) c- C% J+ f3 }, q

  4. 8 N/ u/ W' M* b2 s( a# m' x
  5.   /** @defgroup ADC_EOCSelection ADC EOC Selection6 h% Z8 V# h+ j" p+ n
  6.   * @{
    # M1 G) y2 P" ~; M& P* ^
  7.   */
    * i. k9 ]6 N5 \0 H
  8. #define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)! ?9 N8 N) q9 F# d7 w  q$ q
  9. #define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)$ _& A( d: ?4 @9 P, n
  10. #define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */
复制代码

% R1 W8 X! V' h" F$ @对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;0 [! d" p; f; l. s9 F2 _! P& M
对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;& E# x/ t+ R1 O0 S6 I; [8 z
至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……( Z, C* s5 x* X6 C3 i8 W: |5 }

; x* c6 S0 N: @& N5 D+ L在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:
: h1 s6 L  n" @' L  Z) q4 T- ]) z" i! X/ k. t9 S
NVIC配置
* V7 p0 W0 Q/ s' I2 ^
不配置是没办法进行中断向量跳转的,这个不用解释。: S2 ]9 H% I! N' `

+ K8 v( b8 A$ f  U0 |$ |, o
  1.      HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    & X" Q. Q1 Z( H6 _1 X
  2.      HAL_NVIC_EnableIRQ(ADC_IRQn);
复制代码

* Q' n  z$ }/ H+ _4 R2 f# R& z配置EOC类型
; t" F, c" N" _+ U4 z" b/ D0 R选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。
1 D3 K; m; C+ s+ m- _7 m: o! Y/ d+ L0 @( }) Y% d) I
  1.         ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;
复制代码
) a. ]+ N: i# z/ R7 }
使能EOC中断" b: m$ F. @. X. i, Y
在启动ADC之前,我们要打开EOC中断。
( M9 P( Q) I; o# v8 [* o3 d6 T! v' ?  H# w2 a
  1.         __HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );
复制代码

8 p2 W- Z  ~1 _" G+ k然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。& R. y2 q- H# t" X9 A, F; ^

# r6 K6 H8 D& D7 J6 ~) F6 `
  1. void ADC_IRQHandler(void)3 |* s0 q' _1 e; J' a
  2. {
    ) S+ F4 v; n: F/ Z
  3.         printf("eoc\r\n");
    4 x" {/ U, E# _
  4.           HAL_ADC_IRQHandler(&ADC1_Handler);: y7 R/ i# X2 `$ u& B( G& N
  5. }
复制代码
8 K! k$ ^0 d, E5 W9 l" [+ B% J7 |  e' G; Y

  ~0 C+ }9 _. K, U1 I: }, A
, X3 `& r5 H# l2 X. B+ U  o  P# j! ~, _# Q  B: v  g0 S/ U# V
收藏 评论0 发布时间:2021-12-15 11:00

举报

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