使用CubeMX工具,对DMA进行配置。2 }0 U- ^1 o9 j. ~% o8 I8 o
4 Z3 W/ \: ~9 H3 @
dma相关的配置比较简单,主要是adc配置相关的修改:
4 e: J2 C# D( o数据要设置成DMA循环模式ADC_CONVERSIONDATA_DMA_CIRCULAR;
4 x# y% q, i% `2 q溢出操作要设置为覆盖ADC_OVR_DATA_OVERWRITTEN;' D" f) ?5 f2 k* o; o& ]
主函数逻辑代码如下:
$ F8 i0 x$ N8 N+ b2 c! L- #include "sys.h"
. h% G! N6 Z0 K* U - #include "delay.h"
/ l; Z3 i! S' F: m+ d) ^3 d4 P* i5 S - #include "usart.h"
) E5 F! P5 a ^( X3 @/ | - #include "adc.h"9 w% D, v$ S$ k* @" J
- #include "dma.h"/ v6 P7 G3 o! X, [# w0 ?
- ; F1 d; o+ X! L) g8 `) I5 k* a
- u16 buffer[128];. Q# C& _1 z# j
- int main(void): \, u0 I; V% x/ O
- {" z* I5 U' p- k' ?% b, u( ^( W
- u16 adcx;
( d2 m4 O1 M2 M* L - //Cache_Enable(); //打开L1-Cache7 y% X W0 {, ~
- HAL_Init(); //初始化HAL库
$ m4 L. T( M a$ I. j9 a: h# }8 Y - Stm32_Clock_Init(200, 2, 2, 2); //设置时钟,400Mhz% {3 R, e, D- m
- delay_init(400); //延时初始化
+ Q+ [$ x6 t/ ~ - uart_init(115200); //串口初始化3 t! {7 b0 j# O/ e: I( |7 j
- printf("hello\r\n");0 [+ `4 G; n, P, n* S
- MX_DMA_Init();
1 x4 ^2 F) t: M6 A d - MX_ADC1_Init();4 \. Z* M4 U( p6 P; [
- HAL_ADC_Start_DMA(&hadc1, (uint32_t *)buffer, 16);
8 p) X4 l0 q' j+ ?2 f - while (1)& r I" K1 g. t* G6 \& S7 o$ A4 e
- {2 y, f0 p6 Q2 G* Y& m6 p
- printf("\r\nvalue:");! \, c) z3 d1 e9 d- [
- for (int i = 0; i < 32; i++)
& @% t# U d7 c! ?2 g6 y - {
/ e; O2 }2 f5 V* k2 k( B3 z - if (i % 8 == 0) printf("\r\n");/ }4 A2 C: m+ E
- printf("%d\t", buffer[i]); //返回最近一次ADC1规则组的转换结果
' ?* D: X5 u% p1 R0 y- E/ O, P - }
5 O" }3 P4 N+ w% U5 ? - delay_ms(500);
+ t9 X' L% x( R - }
& r" W+ h* o- s3 T - }( M0 }2 h9 P6 X8 G3 [2 r
- 3 T; s) }7 ]5 b5 r& I `; s
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc), H/ t7 j* O' K; E' E# {
- {9 W& x7 w9 f6 F# O$ \4 i5 a* L
- printf("DMA transfer complete\r\n");
8 y y' `' \! E$ w- v% k$ E5 {3 B - }$ R, U( q2 u# |3 ~
- void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)& O) g, Z& y& [4 N
- {9 C- X6 }; Q4 V- ~. H+ Z
- printf("DMA Half transfer complete\r\n");
$ Y }, ]3 L4 O7 I" s - }4 Z! }3 h$ A9 C8 Q: T3 \
7 F; l0 B. r* U( \- void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
! X' J" X: X# \* `6 p" t/ R$ \0 |" K - {
2 s2 W$ c0 ?3 X+ _% V - printf("DMA transfer error\r\n");
) h' N. }; O( P: J4 c6 b - }9 L6 O$ o- m$ m
4 I# A, m% x+ I7 S) g3 X3 U X! a: \* K
# J( @4 N* `- \! @3 L7 Z8 ?
' c; C. S' B) A T- void Error_Handler(void)3 o% O: e) O" @
- {+ E3 C( M b! x& Q `
- /* USER CODE BEGIN Error_Handler_Debug */
8 ~) D7 P4 L4 E6 k" b* c - /* User can add his own implementation to report the HAL error return state */
* c( `( o; n+ ~8 U* _
, ^6 T5 e5 G x) y- /* USER CODE END Error_Handler_Debug */
! j8 c, a. X6 l8 P. a5 t - }
& i6 @- B5 y& F: x - # C2 Q- |8 g! H2 l
复制代码
' Z+ g3 Q$ C. m; v单次转换完成的效果:& G2 P+ w( Q- {$ u" b: E, D
, r1 t5 C$ R8 |9 s* Z
9 i! g Y' M% K) z1 \) v
* O/ A$ j. U3 ^. J————————————————
+ ?7 Y, }8 U1 A9 k: P版权声明:小盼你最萌哒 _! |( ` o1 S/ ]8 c
, @( I: ~' R; u6 S, m
7 a' H: a o' g. x1 A/ z |