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

【经验分享】STM32的DMA演示,USART

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************
% _' g! f/ f8 l" _+ w  l* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()  |2 x4 s4 Y+ K  s+ [; V$ }
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
% k4 f# D( z$ \) N# {1 `* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
+ N( K+ L8 ?/ m: g* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
. D3 ~( R( l& b$ C: K! r* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
1 B) \* w" o: M% ]+ C, p* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止7 c# f2 f" A1 x7 U& r
* 串口依然发送,表明DMA传输是一个独立的过程。
2 Y, y2 u: t. y& G% o$ C* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
7 W  \  q3 Q+ s7 X, l- D. ~* 作者:jjldc(九九)4 c& _, @' O9 ?; G, l
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
" Y9 E( {- Z5 W  ~9 I; [0 S*******************************************************************************/0 x5 v( U9 t9 J6 c
/* Includes ------------------------------------------------------------------*/
, I+ I! T. d/ o7 ]#include "stm32f10x_lib.h"" p6 g5 q4 D, I; W, l
#include "stdio.h"
( C/ M! E. g9 Z; Z4 E- _/* Private typedef -----------------------------------------------------------*/6 W) o% G( ?7 x) V6 K0 E) H
/* Private define ------------------------------------------------------------*/5 h4 X( g% [) q( @
#define USART1_DR_Base  0x400138041 l; W9 F2 x  w
/* Private macro -------------------------------------------------------------*/0 f8 x- |+ ~; x
/* Private variables ---------------------------------------------------------*/, r: F" \  D* _3 N, v
#define SENDBUFF_SIZE   10240" z0 P3 n  f2 u) a- O: y( P5 l. F% ]
vu8 SendBuff[SENDBUFF_SIZE];
" ^& N5 @3 X$ e2 R1 [; W4 Xvu8 RecvBuff[10];4 v$ M. F( f+ Y
vu8 recv_ptr;
" v  Q' n' |( [$ P& r$ ?# l8 Z3 |/* Private function prototypes -----------------------------------------------*/
+ d& y/ J2 D8 u/ ]8 a. Z' ~void RCC_Configuration(void);+ ]3 N; }; p& L5 G- x) y2 `
void GPIO_Configuration(void);
3 j# t! L! K7 x6 ^0 f$ H5 E- |void NVIC_Configuration(void);
! |- K6 `# n; H4 p; k9 hvoid DMA_Configuration(void);
5 r3 x2 i# Z( S/ ivoid USART1_Configuration(void);
. z$ U4 D% t: t. i( m: Zint fputc(int ch, FILE *f);
5 K9 I$ Y3 Y. j2 W2 ~" Ovoid Delay(void);
3 Z0 D7 L, G2 C' T* ]/* Private functions ---------------------------------------------------------*/0 A- ?+ l- n' T8 g2 M
/*******************************************************************************
# G8 u, ]9 J1 a/ o9 G7 d* Function Name  : main  f7 I0 q$ m: }8 f& c
* Description    : Main program.
& f5 H* {2 a5 D' {  s1 i* Input          : None
& D! \  y# S- b7 K9 {* Output         : None6 c. a5 P+ y. G. b6 N
* Return         : None
0 Z( D1 [, f7 }*******************************************************************************/
. T* R3 R, ]3 I4 oint main(void)
& ?; ]6 L3 ?* \" z{
0 Q8 I# K/ `  a9 Iu16 i;
0 a3 Z/ p9 C* I. C) K" V& E#ifdef DEBUG
3 p2 c. s' V+ d9 Y: ^% Jdebug();
  z$ P: U; V8 J) {1 \, H" i3 l#endif8 P$ A: J* d1 `: N9 E& B: S6 P
recv_ptr = 0;
, W2 p" D! ^- E# ~% l$ G# R. IRCC_Configuration();5 B; q: L# A- R8 U
GPIO_Configuration();
& }1 \9 E5 X0 `7 H% i1 jNVIC_Configuration();
8 m: f1 a1 F( {" ODMA_Configuration();! n. Z9 S& q, y3 d( d. G
USART1_Configuration();
0 K6 N9 @0 j6 U" [) yprintf("\r\nSystem Start...\r\n");
3 B3 o" u8 z, @- }printf("Initialling SendBuff... \r\n");
' h6 V' k% q# ~8 g& h( g% |for(i=0;i<SENDBUFF_SIZE;i++)! m/ o9 |( T$ }! Y& V. f
{0 s1 @% Y# [/ D1 ^
SendBuff = i&0xff;+ e, L. q& W) B1 `
}
1 e0 e& B5 v  {9 {8 bprintf("Initial success!\r\nWaiting for transmission...\r\n");
6 ^1 l( w% x+ ?) q9 m//发送去数据已经准备好,按下按键即开始传输/ m) `$ [. Y+ p  q( }
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
) R% `* M. V( aprintf("Start DMA transmission!\r\n");4 w9 O" y" a- }0 o
//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
3 u1 q& Y" p& w$ cUSART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
$ S( b9 b  O. v% S' w//开始一次DMA传输!
! e; R) F6 {, |  j* L" ]& qDMA_Cmd(DMA1_Channel4, ENABLE);
- D8 U5 e, C: ?3 q//等待DMA传输完成,此时我们来做另外一些事,点灯4 J9 j5 \# S8 C% j1 k2 I
//实际应用中,传输数据期间,可以执行另外的任务
" h: S4 B, M% b. ~- M- kwhile(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)& N% p* V  d) M% }4 B' y
{5 o, L* M. \( ^9 h5 e. Q4 \/ m: `
LED_1_REV;      //LED翻转. r0 v$ r( d( a  N% ~# D
Delay();        //浪费时间
2 [& D" o6 V5 g' z$ {0 q' y}4 o" R( @+ P9 K6 v) o# O% e! s
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭" v) G5 O) f2 W8 |  x4 n. [- Q' l
//下面的语句被注释) D, b. P2 H* l) K* `
//DMA_Cmd(DMA1_Channel4, DISABLE);
4 ^( |. i+ N$ _printf("\r\nDMA transmission successful!\r\n");6 j) E3 m1 U0 X# f
/* Infinite loop */
1 O$ p: s; t. ]3 Lwhile (1)
: o+ o' _, D; L- f. ~, U4 w: i. C  z{
3 p, l( d& g2 S6 p}
3 L& t2 h+ R& L# H8 R5 I}
( _. S- F/ N( g! E. Y# t3 K/*******************************************************************************9 a# Z& t/ |7 q0 C5 {( B
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)9 G( R: V. s: B5 G. Y$ k2 h) ^
* Description    : 串口发一个字节9 W6 p* W: ^7 b- D& q2 v
* Input          : int ch, FILE *f" V. ~- e2 e2 I* B, G# Q7 ]' T' D0 l
* Output         :
; _0 O; z. B" U7 w4 w* Return         : int ch4 U5 V, z0 q! t5 w
* 这个是使用printf的关键
# c8 Q7 J; G. X2 i& I( {( p3 }*******************************************************************************/, {) X! o4 q) P
int fputc(int ch, FILE *f)
/ [4 f( K0 ?2 A+ T$ N0 n, ^{4 J. a. z. Y4 `# V4 T
//USART_SendData(USART1, (u8) ch);+ f" g# S5 s/ ]' b+ s8 Z* V0 e
USART1->DR = (u8) ch;
! @& U) z* E1 v' w( }7 o2 d/* Loop until the end of transmission */
% J& @2 U& o; a# A- e1 Q) B1 h; [while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
- B( n* [7 x' }5 P0 k7 y0 q* w; t{7 {) \$ W; B1 G% C( \
}. X2 Y% E* B. g- i* K
return ch;& p) @  [3 W  F7 W
}
* }( [/ y( o+ X  S" v/*******************************************************************************' M7 ?/ U; i, {
* Function Name  : Delay4 o- c+ F" u& Z2 p. B% ]
* Description    : 延时函数4 H6 B# J1 S# D* H& h) R% X
* Input          : None
6 b$ F/ W3 A# {4 f* Output         : None
& m  L' ]! W% _! U* Return         : None, m, A8 C' h% |! X' X+ I
*******************************************************************************/$ n$ q0 ^5 S9 @
void Delay(void)
- f  H4 m$ B3 C{( ~* J1 t( n: T( ]) ?9 i6 I
u32 i;5 r8 B, R/ V. Z4 b
for(i=0;i<0xF0000;i++);6 V+ [7 ^9 W( @5 m6 x6 d3 p* j0 ?
return;
  M6 A4 P; r) L$ p: O$ G}% f( e6 B/ a7 @
/*******************************************************************************6 c* f/ n% m$ w1 e1 _; l" l& c
* Function Name  : RCC_Configuration
# q+ |* x1 ^# X9 Z& `6 N* Description    : 系统时钟设置; K$ b$ W. c" p0 g# C, X# Z8 \
* Input          : None; I0 [/ l# E' ?# J+ L
* Output         : None
3 F7 @  ]) }5 ?( u* Return         : None0 [7 |7 P# X+ w' G
*******************************************************************************// u/ l  \* G  I3 H
void RCC_Configuration(void)
1 C! Y5 D+ X- K* C{
7 X& T# @/ t1 ?! w/ jErrorStatus HSEStartUpStatus;
/ v5 b5 j- ?/ z$ E) ~8 \3 j//使能外部晶振9 I8 x$ H) I* N4 s0 |- n
RCC_HSEConfig(RCC_HSE_ON);+ y/ Q" q, z6 V% f" @
//等待外部晶振稳定2 |- ?8 M8 t" p, W% A. i+ l$ d
HSEStartUpStatus = RCC_WaitForHSEStartUp();: L% O- p- B+ i2 o& E7 Q
//如果外部晶振启动成功,则进行下一步操作% A& p/ R" ^* P5 h- h  A2 H, G
if(HSEStartUpStatus==SUCCESS)
2 `; b5 [2 Z8 l1 U& J1 H  d{
! j0 b$ K: D3 h3 N; R//设置HCLK(AHB时钟)=SYSCLK
! s' V! L& q! e& u/ [6 uRCC_HCLKConfig(RCC_SYSCLK_Div1);
+ H: E$ w5 c* {0 @+ E+ }2 x3 O//PCLK1(APB1) = HCLK/2
7 E& S; U! {) w3 J4 l% f% tRCC_PCLK1Config(RCC_HCLK_Div2);5 I. W  }' s1 ^" i0 i# u
//PCLK2(APB2) = HCLK
2 A9 q/ ]7 B& H/ mRCC_PCLK2Config(RCC_HCLK_Div1);5 C; a3 d. e5 l
//FLASH时序控制# I& E1 S" p1 s- h0 N+ c/ G% E
//推荐值:SYSCLK = 0~24MHz   Latency=0
. O% X6 b! ?/ m! a//        SYSCLK = 24~48MHz  Latency=1; N; H! f4 K( ~' H
//        SYSCLK = 48~72MHz  Latency=23 j3 b" K! C7 w3 D! X
FLASH_SetLatency(FLASH_Latency_2);
1 g7 Y1 e2 e, t//开启FLASH预取指功能
5 v7 C# ^+ f3 e" S' hFLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/ O4 _" g. y7 v5 \' Q* O, \
//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz4 o: X. e. B, y# k+ L
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
! K5 ]% }7 Z5 Q. D/ y, P//启动PLL8 `) m% U& a  j% }
RCC_PLLCmd(ENABLE);6 s' ~  l5 Q7 I2 G
//等待PLL稳定
6 A3 N" N" E* T: Y9 r  a) Uwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
# q! x! O- |3 J2 F, q5 ?//系统时钟SYSCLK来自PLL输出
( S$ L+ T% r. ~- A+ P% DRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
; N4 [/ m5 f( W% E& G//切换时钟后等待系统时钟稳定# D5 {, _& x5 q( g
while(RCC_GetSYSCLKSource()!=0x08);. [( d5 c+ Z3 z2 z
/*! M" Z0 w3 Q7 g
        //设置系统SYSCLK时钟为HSE输入; w5 p7 t  B9 W
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);7 B( ]* t/ B, k8 R' T
        //等待时钟切换成功5 K6 V- i& k7 `
        while(RCC_GetSYSCLKSource() != 0x04);
' }* R9 u$ \) \/ G        */3 P1 s- H. S* O: R1 Z
}6 v' F2 N6 P, l1 X+ l  K
//下面是给各模块开启时钟
8 C, J6 j: D. N5 {' k//启动GPIO) s. B/ G- C+ M0 D8 x
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
6 m6 N! t) [! O* ERCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\5 s7 Y0 s& w. e5 l5 M! ?  y* z8 E
ENABLE);
6 u6 |# ]% Y- ^/ e+ j9 p! b//启动AFIO( j( {* z' u$ ]/ H3 O3 j$ j
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);7 |$ W. x$ [, E2 z' {0 m& n
//启动USART19 w1 F; I2 h! l1 Y) [9 v: ?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
8 I' N0 k2 |! e& [$ a7 J//启动DMA时钟
$ b5 n# t: r! D) b% V/ A6 MRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);. L* a5 P3 L8 y6 W" y. j6 ]! f
}/ i: W' _6 }( \2 V# J( l' d
/*******************************************************************************
8 {  \4 f) n5 A( s8 ^$ C* Function Name  : GPIO_Configuration
- ~- j6 x4 ?+ L$ _# A* R" z3 J* Description    : GPIO设置6 P5 A* Q* S" v0 ^( n: a5 f
* Input          : None$ t' c+ e/ B' ~7 q/ K/ A. X3 B$ Y
* Output         : None
7 Z! @# ^# z1 {* Return         : None! m' r" B$ B/ N- ]) Q. t6 g! b
*******************************************************************************/" h4 ^. |4 N. l$ C# A
void GPIO_Configuration(void)
+ W+ O! D1 J, A1 V4 I* j{
5 ]$ K7 F  W- f; h9 i1 ?( Y7 RGPIO_InitTypeDef GPIO_InitStructure;- F! c. I1 L3 S) H6 d& e1 n7 c
//PC口4567脚设置GPIO输出,推挽 2M( \! Q$ `7 u6 `/ x% T
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
1 p1 ]7 T" ~1 l, k; y5 ?. [GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;, @& v! j3 [3 N  i6 J9 f, D
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;% b1 k2 u7 \8 e
GPIO_Init(GPIOC, &GPIO_InitStructure);
3 R6 P- v) |% Y) D//KEY2 KEY3 JOYKEY4 R. k. F- \& d
//位于PD口的3 4 11-15脚,使能设置为输入3 x6 U: b, e' ~
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\8 ^5 e+ J) `3 }* L8 O
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
8 ^4 h1 s" s. m7 ZGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
% c5 k* j  A4 J; ]6 a  {GPIO_Init(GPIOD, &GPIO_InitStructure);1 |. f2 R& W7 O. t) c$ U
//USART1_TX: u& U5 u' c4 q! _
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
% M3 ~7 x! c1 g+ g5 F5 xGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5 m' `& P7 I9 G( p; nGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
# a9 P4 h7 u0 a1 d. O5 jGPIO_Init(GPIOA, &GPIO_InitStructure);
  W: y' N/ ^8 p# u//USART1_RX" l3 A% v9 N% o: x
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+ B. |& B% i  ?3 K8 ?% E# EGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- r- Q: M  Q  \- FGPIO_Init(GPIOA, &GPIO_InitStructure);
# a. a* i+ r; \1 f}% o3 L( F  k3 I% g
/*******************************************************************************
0 V" e) a/ X& \  `$ T* Function Name  : NVIC_Configuration( }0 T, P% Q0 T( ?: R0 |
* Description    : NVIC设置
! f4 R* h$ Y1 @% l: x* Input          : None
1 t3 I9 C  k8 _' e* A* Output         : None8 V* M" S+ e6 n' l( F8 y: J1 T6 D3 M
* Return         : None
0 E; s) I9 r  M: r! x9 i9 W& x3 U1 ]*******************************************************************************/
) S% C4 B$ e7 `; c7 [void NVIC_Configuration(void)- f5 J) t: c4 M: H( z
{2 f( z: [2 _( u( d8 C
NVIC_InitTypeDef NVIC_InitStructure;
; `9 j7 K/ V) c: A0 F1 d#ifdef  VECT_TAB_RAM& G8 Q! {- C7 g) I7 G
// Set the Vector Table base location at 0x20000000  u9 ?/ \5 N/ \  [3 Y- l/ _
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);6 [+ R# p. P+ {  m1 [0 O4 o
#else  /* VECT_TAB_FLASH  */
2 X2 T9 C5 o: i; y// Set the Vector Table base location at 0x08000000: G2 \& ~1 F/ _: t  c' a
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);9 ]2 W4 T" t- n7 w3 ^5 |3 V4 q) m
#endif+ a3 g, w6 `7 E% d1 C9 _9 @
//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级* t# ?; C1 c8 W" C) w, N
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
" c  S; N: `$ s7 ~: ^//串口接收中断打开   7 I* G. M, S' f7 w$ `
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;+ `* [- n' d9 W1 O8 L1 ~  r
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
5 Q  I$ D% a! c" INVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
8 Q, N+ O$ H) L0 Z3 F. a6 CNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;! V* W0 h. p  I3 t( i# G2 S
NVIC_Init(&NVIC_InitStructure);+ G8 v" o7 N- [+ y
}
" H6 N- P7 b* C. N/*******************************************************************************
" f& X  R( F: B8 p* Function Name  : USART1_Configuration, n* x' z$ D, H2 G% ?; S+ j- ~
* Description    : NUSART1设置9 ~& q( S" d. ^) ?5 a. E
* Input          : None8 B* ^9 l( j$ T6 K. ]
* Output         : None
; L, O* P1 ~$ e, [" D* Return         : None
0 h% x) P. w4 L% V" Z*******************************************************************************/
  Y3 o7 Y$ B4 T, P  }2 ovoid USART1_Configuration(void)
$ u$ R! X3 S( F1 D& N2 y8 ^% P2 G{
" `$ N' N) o- @' `# S  S4 mUSART_InitTypeDef USART_InitStructure;
5 Z, b! [+ {% P0 S9 s# \USART_InitStructure.USART_BaudRate = 9600;
6 o& D* O+ T0 a3 m; n2 i' aUSART_InitStructure.USART_WordLength = USART_WordLength_8b;6 n) G$ i& R- \/ p8 q# y) H: o
USART_InitStructure.USART_StopBits = USART_StopBits_1;9 U2 ~. i* h7 M! Z) E* b: V! c, q
USART_InitStructure.USART_Parity = USART_Parity_No;
# j& e; `* p; mUSART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
8 n$ F/ e/ t, `USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;% s) W6 ^" I0 I) z: B: y; F4 [2 i
USART_Init(USART1, &USART_InitStructure);- M- W5 w" b; H% B
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);; O  v/ x* \% }# Y( h
USART_Cmd(USART1, ENABLE);+ a/ J  L; l; M
}
! O7 s! J0 T0 z6 yvoid DMA_Configuration(void)  ^, i! y# y: ?5 d3 K4 u
{( P, [: Q' e: X3 D2 e
DMA_InitTypeDef DMA_InitStructure;
" x, Y+ P" `8 ~* {, @3 s  S4 P. V& q//DMA设置:- J1 w. `( ?% v
//设置DMA源:内存地址&串口数据寄存器地址0 ?0 t) p% `" J' H
//方向:内存-->外设
( z3 `: e" c6 r# y/ L//每次传输位:8bit
% ]  t! K+ ?/ d& i% b$ U* C6 w% t0 n//传输大小DMA_BufferSize=SENDBUFF_SIZE
8 \# t. M- V" z- y* }//地址自增模式:外设地址不增,内存地址自增14 N+ }  A3 j$ p' a: o* Z
//DMA模式:一次传输,非循环
4 I4 w& N  J: s. |! `. r& ]//优先级:中, l, C# [* F6 n) p2 E* c4 W
DMA_DeInit(DMA1_Channel4);5 t2 N2 Y/ c; [8 G; f# A4 r' `
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;* U  V. y6 z; D! D. Z4 A4 j
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
. e7 u9 e3 F% V1 |" V* C* Q/ @DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
* n* E/ `5 h. y' `. W( _' |DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;6 X9 L( i$ q* |3 o  O- |
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
. }- l+ N" t2 e7 p) A9 vDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
# O- A7 O+ W  y4 ~# y2 c2 WDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
9 p- \- F! a5 _$ G) bDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;: g) t- g1 W" x8 J% d
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;3 [; l" ?3 g) U7 n6 I/ T
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
& Y* o& v- m3 l# ]# ?4 CDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;8 o5 S6 J' R, F: ^0 ^  _4 ^
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
0 @9 T& H  G- ^. h4 g}
) r0 u1 E0 ?& |( V, Q; \& @
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似分享

官网相关资源

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