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

Nucleo-32F042K6 DMA采集ADC

[复制链接]
电子星辰 发布时间:2018-6-20 11:10
本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
6 H  ~- u$ Z$ `2 N7 R( o& N3 v% R
这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。6 n: Y  W) |4 Z3 U  q8 u' P9 b+ S

' Y3 C, e& v2 S' F: y5 X首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
0 N" M! N' y$ `" ~$ l 新建工程.JPG ! r# Y& i0 }5 l* S6 Y
( p* U4 Z) ?% y2 s# Q; Q
选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
$ U' D' I- o, }) h( R 初始化选择.JPG
( l' N7 u) C5 E( ~: ]
+ N) b7 R7 F6 R$ t* ]' L4 ^3 |“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。
' t, R' n* b4 K# {0 g# K 串口pinout.JPG
2 i& E5 H! e7 I2 a ADCpinout.JPG
2 M0 G9 p! Z; N. Y9 w+ t 芯片pinout.JPG 4 r5 p9 V' e$ w/ p9 T! J# u3 @7 C1 I
0 x$ h/ O* r7 K# ]2 W
“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。) Z1 d# u( V! |3 z/ h2 }6 Z+ N
时钟设置.JPG
* w9 ~7 W: T! q/ f: N8 C$ u0 e; t# G1 m1 o, ]
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。
# I% j- Z& [4 A! t' J 串口参数设置.JPG
. e. b+ Z% x& [( }ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
. S" M6 `5 E, _. |' L: ]! ? ADC的DMA设置.JPG
0 \, O. O: @/ ]5 Q' S* I ADC参数设置.JPG ' A' }- o+ ]5 ~2 ^& r, u1 p

# V0 D2 l6 l$ z: ^+ b; L+ m9 s最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。
4 s% h( m3 }) [$ x 工程设置.JPG 工程设置2.JPG
+ m2 ?; i7 V0 Z" M- Z( P& `至此Cube设置完成5 ^9 a4 w( b' O: }( I* s) y4 F

, B0 x2 n: M+ C附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。
  1. /* USER CODE BEGIN 0 */
    ) L4 |! x/ \; W' n1 k
  2. /* ADC variables */) B$ t8 ^, x: t4 o) R
  3. __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值, o* x  K& R7 [6 U% j. Z! Z
  4. __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
    4 r4 |  {7 Q, h" X3 \4 S
  5. /* USER CODE END 0 */
    ' O. T7 ?$ K3 [! k' C. v

  6. 4 n: _$ H  t# P8 P- ?
  7. int main(void)
    2 o: F& n  U6 b/ Z2 h: B
  8. {
    , \: t; N7 o$ `4 y
  9.   /* USER CODE BEGIN 1 */* B' U7 P- m, K
  10.   uint16_t out_en_cnt=0;
    % G0 S6 |5 d3 z) M# ^: n: ]
  11.   /* USER CODE END 1 */+ g9 t% m, e* K' }
  12. . r. T0 u2 W% p9 G/ k/ N: c
  13.   /* MCU Configuration----------------------------------------------------------*/
    " E) I. h5 g  Z) a

  14. ' d3 }( g$ j. F5 X
  15.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  O9 T) _8 y) r2 @0 c6 n$ k3 I8 {
  16.   HAL_Init();
    ! V1 a5 e2 e, P7 E- w7 _7 i
  17. / E" v$ ~& ?% }' s
  18.   /* USER CODE BEGIN Init */" e/ {! l" D& b! }' ~

  19. ' b1 `, }: _: \8 C' A# |$ m
  20.   /* USER CODE END Init */! i/ K" h% V) M7 K) B

  21. & d6 ?* T& U1 T1 M2 G
  22.   /* Configure the system clock */
    . ]3 ?: g# I; r
  23.   SystemClock_Config();
    1 w" [, l2 [/ k# I9 ?* r# C% V. B$ g

  24. : P4 ]9 ~1 m. Z
  25.   /* USER CODE BEGIN SysInit */2 z( u7 N2 z) g( T0 y% X
  26. & b% S  m# Z5 d9 w9 K& |
  27.   /* USER CODE END SysInit */% k" X8 I' z) ]" _
  28. " }4 ]: p) y! c* W* m9 _" _9 `/ E
  29.   /* Initialize all configured peripherals */6 `" w" n/ A( ?* {9 C" F
  30.   MX_GPIO_Init();
    & w) g7 ?' w, y% x4 k1 R
  31.   MX_DMA_Init();0 y% d6 c$ [1 B" S% L/ U+ T% Y
  32.   MX_USART2_UART_Init();
    , h6 k3 i2 y6 {& G
  33.   MX_ADC_Init();+ N2 T1 v/ C5 p( V/ e1 J
  34.   /* USER CODE BEGIN 2 */' e4 \/ |0 b) _
  35.   HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
    3 D7 w& n: ?: n) f, Q
  36.   HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断  n- r: V/ U. {( D4 w1 f7 \
  37.         HAL_Delay(30);//等待第一轮ADC数据采集完成. A% J8 @6 y; m% z; \7 D
  38.   /* USER CODE END 2 */8 V; _# t! L7 E  f' q

  39. 6 }6 R' i: @, s
  40.   /* Infinite loop */3 s& I7 ^* Z7 p5 a: l8 V
  41.   /* USER CODE BEGIN WHILE */* O# S) [' w5 @* j* c
  42.   while (1)
    8 ^3 W' w" T) e
  43.   {
    0 q; V: g& j3 V  }* E, ]( ^9 m
  44.                 HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
    6 a: ~. p5 K- m7 o% w) ]$ V
  45.     adc_getvalue();
    0 W8 \# s& M/ V; w
  46.                
    : D$ q, x' V% N: R$ _
  47.     if(++out_en_cnt == USART_TIMES)0 `& o1 f6 @# V# k7 ]6 l
  48.                 {& Z' U: A4 F% m( Z1 [/ }: e, _
  49.                         out_en_cnt = 0;0 u( C6 L+ @+ X7 Z
  50.                         HAL_Delay(500);
    3 I8 f9 H( }. Y# p. j" [
  51.                         printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);( x4 Z& U% O0 z& U
  52. }
    $ d9 Z1 @2 O' _
  53. }
    8 F+ Q$ u1 k" V$ s" h1 h* V( i
复制代码
& H" w) g% P1 ]. K$ E  y4 ]
最后,附完整工程。
. T. J- x6 m1 }" v+ r/ t1 y, r# y) R# N

9 x2 P  i& [+ X/ `1 I$ h8 }7 E! i

Nucleo-32F042K6 DMA采集ADC(MDK).rar

下载

4.99 MB, 下载次数: 909

收藏 2 评论9 发布时间:2018-6-20 11:10

举报

9个回答
zero99 回答时间:2018-6-20 11:20:07
学习了
STMCU-管管 回答时间:2018-6-20 14:35:04
很详细。学习了!
时光虫子 回答时间:2018-6-20 15:52:58
Cube软件用的爽啊,开发效率高
电子星辰 回答时间:2018-6-20 16:03:38
时光虫子 发表于 2018-6-20 15:529 h  O+ s3 |5 |$ q
Cube软件用的爽啊,开发效率高
4 o( N9 e' ]. X3 g3 S
cube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。
wolfgang 回答时间:2018-6-20 22:28:45
不错的内容,继续努力~~
andey 回答时间:2018-6-21 13:17:11
提示: 作者被禁止或删除 内容自动屏蔽
samhong 回答时间:2019-1-30 00:54:18
学习了,学习了!
alvad 回答时间:2019-4-19 17:09:04
学习了。很不错
sqhxx 回答时间:2022-10-26 11:18:52
收藏2 R( D( G: h6 ^8 B2 G, y

所属标签

相似分享

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