使用CubeMX工具,对DMA进行配置。6 m. Y7 A- g: o, n* C
+ v8 h8 W7 N/ y, O
dma相关的配置比较简单,主要是adc配置相关的修改:: b- n5 Y7 C; H" a1 U
数据要设置成DMA循环模式ADC_CONVERSIONDATA_DMA_CIRCULAR;! @) O/ L2 F, S* r l! O9 i/ Q
溢出操作要设置为覆盖ADC_OVR_DATA_OVERWRITTEN;
1 G5 T! v! _% i% M, q, D9 ]主函数逻辑代码如下:
3 {( O1 N2 L- w- j/ s$ ~$ f- #include "sys.h"
! l) E* X7 ^/ t7 l - #include "delay.h"7 H$ y0 [) d8 Z0 j) e* U% _! M
- #include "usart.h"
; d& F4 K) p f8 Y6 R: p - #include "adc.h"- {) j% ^3 M( f0 E3 y# b
- #include "dma.h"
8 d2 J$ S7 ?( \1 M) Y - : N! z P1 u7 |- ^; \
- u16 buffer[128];
1 Z% s4 Z- r: e. |1 a, |% t, c - int main(void): r& @$ D, C3 D8 d& D0 J) K
- {" [4 K! Y. j7 Y
- u16 adcx;7 s) y, v& g' d d% o
- //Cache_Enable(); //打开L1-Cache
' t. g6 M5 l/ [# q3 P! d0 M - HAL_Init(); //初始化HAL库
6 Q8 a3 S0 X6 {* r* e - Stm32_Clock_Init(200, 2, 2, 2); //设置时钟,400Mhz1 E/ E0 t. l# w5 ]; D- M9 v
- delay_init(400); //延时初始化
2 x2 o4 V/ {2 ~. S5 V( m - uart_init(115200); //串口初始化4 g" h! D6 V8 U: |* x
- printf("hello\r\n");) ] U/ R) N f/ E/ J/ g
- MX_DMA_Init();# H" M: B, b9 e( m7 J2 U
- MX_ADC1_Init();
0 j/ F0 I9 M4 P- U - HAL_ADC_Start_DMA(&hadc1, (uint32_t *)buffer, 16);4 ?( D3 v2 s2 R
- while (1)$ [% {; f7 @& H
- {, N3 k4 L5 X: }4 B' U" H; R
- printf("\r\nvalue:");
, O, [3 M0 Q4 `+ e8 ?- W9 F3 ` - for (int i = 0; i < 32; i++)
_) w* v9 _1 x$ s* w, Z - {1 ^. e- a- K5 @; [3 T5 w$ W/ S
- if (i % 8 == 0) printf("\r\n");" `7 {, l3 s. T. F- K* q
- printf("%d\t", buffer[i]); //返回最近一次ADC1规则组的转换结果
" o0 e! J" a& j# E& ?) Z6 j" R - }
0 }8 M" J$ B, f, }+ H+ c; f - delay_ms(500);
6 R$ }4 |8 W! ~0 w, E - }
. K' k7 w/ R& ^# m7 F - }
; t( s8 }" a% D4 y
6 c2 Z* O7 B+ z5 T) q' X. Z- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
; P) J: P1 v6 k% S - {' s- S6 m) M* ^8 r
- printf("DMA transfer complete\r\n");
1 T2 j7 u$ G9 W - }
7 x7 V$ S) |6 i9 b Z l - void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)0 ]# C9 G' g# \- s/ `( L% [' {
- {
6 B# k6 Y: k' D5 Z - printf("DMA Half transfer complete\r\n");
/ Z6 w `; }6 f( q# I - }1 h, A5 l3 M+ b: z+ `' d, Y
- ( ^( Y; U* q. ]3 v' f1 V
- void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
% s; P* d; `, x: V2 m6 J% n2 E - {
7 s% h9 H+ O4 M' \9 I! G - printf("DMA transfer error\r\n");& y+ R8 ^$ ?# t/ `3 K# @9 W9 I D
- }% A3 q9 G( x& ^- W' ]) J
- $ Z8 P e o! ?3 h5 [& Y
- 9 K6 }" A( G2 S F- G& ]0 c
9 t0 d5 Z, y9 A2 E7 K- void Error_Handler(void)0 Y( A. _' y. K% v( Y; v9 a
- {
n, c0 o8 Q2 N* R( H+ w8 {2 L7 g - /* USER CODE BEGIN Error_Handler_Debug */- R: \1 \: R1 B4 @( R$ u; J
- /* User can add his own implementation to report the HAL error return state */
E: q! G4 @3 y6 s2 `+ J
1 P# v! L5 c* s- t" \- C0 |- /* USER CODE END Error_Handler_Debug */
8 M2 s" {5 ]4 y, D- ? - }
! g" k, P1 {3 g, w U6 x - 4 ~ A) i3 d: l, U
复制代码
/ _6 E9 F5 i, @. Z3 C- B* x" x5 t* q( L单次转换完成的效果:3 e7 r% z9 B! s: U V, i- k
( Z, e6 ~7 p% r+ w; G
& S& Y3 w9 T$ _" y6 {
2 w$ T+ K+ d2 C- R: E+ {————————————————4 p/ {) ^3 ~; I
版权声明:小盼你最萌哒- L% N- |. l7 n2 W3 s" X: w
- q4 m% T- ]6 X4 {
. f& o* _/ H% x1 N# X$ ^ |