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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************( N( d2 x2 c$ ?8 T1 Y( ~9 P( W
* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()3 D/ z1 ^. F" _7 n3 Z$ z- @) S
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
/ |1 G/ ?" _0 B1 `/ W* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,- M9 p9 ~  h4 M5 R7 o! l) I+ @  l4 T
* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART" w; O& j3 o- N! w
* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
2 p, D+ Z% f: k- }+ g* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止
; ?( m* U" e) e  ~& |9 z* 串口依然发送,表明DMA传输是一个独立的过程。
; ^* |4 }. J7 V; q3 w* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理- x9 P" z9 p$ |4 U0 v
* 作者:jjldc(九九)- `: H6 f. p& d% L# g
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
: j' ]" G3 e* ~+ b0 a" i+ z*******************************************************************************/# c9 V# q4 P( p0 _5 e. h6 y" \
/* Includes ------------------------------------------------------------------*/# `1 R4 q1 |7 e' R) k* D% P' ~
#include "stm32f10x_lib.h"& T& j! Q- R; x8 I' \0 S2 p! R
#include "stdio.h"
8 w& J+ H# T, i4 J/* Private typedef -----------------------------------------------------------*/) J7 b% C$ |9 A9 j4 k. P. i9 p
/* Private define ------------------------------------------------------------*/
  V9 D3 `2 x* Y; V7 e9 s. D! y" _! |#define USART1_DR_Base  0x40013804+ o9 m4 X8 A, [; g0 m0 `0 e" k
/* Private macro -------------------------------------------------------------*/
6 G) ?. y" X! H- R/* Private variables ---------------------------------------------------------*/. [) i) J4 N# a( e6 |; u2 w
#define SENDBUFF_SIZE   10240
+ S8 D+ P7 o! T# G! Cvu8 SendBuff[SENDBUFF_SIZE];6 [" K" S7 ?! l8 Z0 H; s% D. Z
vu8 RecvBuff[10];
6 N) g3 k1 ?& B. F; @4 l8 C0 J$ S8 [vu8 recv_ptr;/ o5 G% v' f1 M! Q
/* Private function prototypes -----------------------------------------------*/( `  N# h/ P  y: C
void RCC_Configuration(void);& F' _$ E3 ]1 ]7 p
void GPIO_Configuration(void);
7 S1 ?( N% c6 f+ E7 L; V. Zvoid NVIC_Configuration(void);
) @- e( ^+ t, r/ K9 s$ Zvoid DMA_Configuration(void);
2 t2 G& O0 d# D+ W- {+ j& f0 b. Cvoid USART1_Configuration(void);
- i  p* y( w6 \; aint fputc(int ch, FILE *f);
# x9 J4 B$ `' p6 l( {. d/ o7 {7 Wvoid Delay(void);
' B# W$ H' h' `% G" y. P* z/* Private functions ---------------------------------------------------------*/" z- f: [9 L& }9 m8 v0 s) Q8 |
/*******************************************************************************( O! |5 }+ v& A
* Function Name  : main
/ l% u$ W+ L6 l5 a- e* Description    : Main program.  \' c  p5 @, y, G$ t' V
* Input          : None; Z5 T" Z8 e2 Q0 ]% L; `) a: Q
* Output         : None
; ], j+ ^' c8 L% e- g* Return         : None
6 F1 B4 p7 F- O  N3 x*******************************************************************************/( G  M' @& K+ T% R3 M# C7 b$ q
int main(void)9 ]! l. K% |: ]8 K
{
1 F+ T6 j& J( Q! o) a; V! l/ n8 ]u16 i;2 I' I6 U3 {3 o; {7 U# l; ~
#ifdef DEBUG" M# L6 h* N5 i+ M/ V' D; g
debug();' V* e. G% M: x% M; U& |
#endif
3 m5 c* z1 u9 c+ c5 s9 arecv_ptr = 0;2 Z- }" O- _# _6 ^9 o: j, I
RCC_Configuration();( ^3 h- k# N: S* d
GPIO_Configuration();. }) S1 L4 ?0 T6 [1 h
NVIC_Configuration();
7 `9 I6 z/ J% O% R) c% {DMA_Configuration();
4 A, E- g9 r/ _3 G# \, u# B; DUSART1_Configuration();
; C9 y6 C( X* n$ {. v# g; k. W* dprintf("\r\nSystem Start...\r\n");
) {+ o5 U4 j  dprintf("Initialling SendBuff... \r\n");
2 h  z3 |5 }' s0 afor(i=0;i<SENDBUFF_SIZE;i++)
2 v/ \6 ]7 P" I+ M{. V" |0 L# m' O- l
SendBuff = i&0xff;
$ O, ?! M4 g2 s  F}/ b% F. B1 C8 ?, [# z
printf("Initial success!\r\nWaiting for transmission...\r\n");
$ H( q+ S0 c2 q% ^& i//发送去数据已经准备好,按下按键即开始传输* H- y, N; S" }3 K( T( e
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));9 k5 o( |. x: t; H: w% @
printf("Start DMA transmission!\r\n");; |4 L- }1 c% e6 M+ K+ y- P
//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
! p2 ]4 y2 _% R) DUSART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
& j3 @; |% k+ W/ }7 A//开始一次DMA传输!
  i. U; v  V1 [9 h  gDMA_Cmd(DMA1_Channel4, ENABLE);7 w+ G$ a# y- s
//等待DMA传输完成,此时我们来做另外一些事,点灯
. k4 G9 U0 P* w5 j1 Q& O) y, K//实际应用中,传输数据期间,可以执行另外的任务
, A; N) y; E) @- r- ]: m6 z* rwhile(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)& l5 W, @5 t4 J- c7 x  C3 H5 M
{2 n0 t) D% P% n" O' k( j
LED_1_REV;      //LED翻转
, `0 U  M! ?3 K7 D9 aDelay();        //浪费时间* {) l$ I  z  o- @
}) X% v9 h1 R# {& L3 T
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭
( Y, ]2 e. n- T: Y+ o//下面的语句被注释; T7 R  l! x/ x$ e; R# R! _
//DMA_Cmd(DMA1_Channel4, DISABLE);
3 r% G: A5 Q$ S1 oprintf("\r\nDMA transmission successful!\r\n");
5 A- e, K) ~- Y) \/ \3 q2 O; V7 w: N/* Infinite loop */
( ]3 V+ ^! Z( awhile (1), V. S; r' f; L* _8 O# r
{
* E# f+ z5 F! v/ x5 b}
- I, Q, U' D0 g1 G4 x7 ?' G% c}; l0 x$ T1 r6 ~* I9 j4 p. j* V
/*******************************************************************************9 @/ H- ~8 @+ a6 `. b$ w
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f), m! n  A- S- g6 e
* Description    : 串口发一个字节
  }! i, I5 S& J* Input          : int ch, FILE *f) ~7 f, M0 ^1 t4 q' q
* Output         :0 }+ x! z; G3 X; A& q3 i1 g: k
* Return         : int ch
0 J7 H0 ^& R- {, K+ U* 这个是使用printf的关键
. U6 V4 G5 b8 X*******************************************************************************/
/ P0 K& L2 d1 w0 C. }int fputc(int ch, FILE *f)
7 l% Y2 P$ V9 T, p: i{- b  \- B# \5 F) z) x6 k
//USART_SendData(USART1, (u8) ch);9 Q# H1 d. `8 e
USART1->DR = (u8) ch;- W7 Q2 P. ~) t! {3 {4 |; C, L
/* Loop until the end of transmission */( S0 u1 ^+ [# g! a6 w
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
: ^3 |0 M; q* P{
" L% C0 q- n* r5 c- b0 }}
. C" T# q1 ^! e" m7 K4 D3 E* nreturn ch;7 \6 _( Q3 B# j0 K
}
+ f! g% m" R4 L; }) d  ?9 [/*******************************************************************************
7 l2 Q: [# q" G3 d5 C( o0 t* Function Name  : Delay
2 I0 Q+ a) Z  g3 F9 l* Description    : 延时函数
6 V8 M5 M2 }( M! o  p; @# }  w* Input          : None- s! }( A: P7 ]2 d  i- O! B5 s
* Output         : None
9 u" p/ a4 H# [5 v+ t) j8 f1 J  N* Return         : None2 u% K0 c% ^7 }& v: [
*******************************************************************************/
3 v. E+ b$ g, A3 d5 J9 s$ m( ^void Delay(void)
* k  X& g3 e$ H% I; g* }' r{# R7 R9 d6 b% g
u32 i;
1 H# [0 L2 K% `9 e% a) Qfor(i=0;i<0xF0000;i++);& S9 j/ y7 t# q" Y7 w) @* Y
return;
) f( e) l4 }6 o% ]' C  j5 {}
/ b4 c8 K. @8 I+ W/*******************************************************************************
7 q0 x1 O: S6 G$ z0 T# y' A2 p* Function Name  : RCC_Configuration
$ o- k; D) x' I8 U3 b; p0 b* Description    : 系统时钟设置
, l8 o% Q7 B6 D, d2 C* Input          : None, ?  T; U0 B3 o
* Output         : None
6 X! U1 _' ]0 G! z. u* Return         : None
2 `# i! V" A, G) c5 m& ?*******************************************************************************/- X* R/ Y2 K2 A( Z
void RCC_Configuration(void)
; U4 D- Y0 j3 x, @{
" ]6 b6 A& h# v4 ^7 t4 V+ qErrorStatus HSEStartUpStatus;
  _( x! Q# T' v( }# ?  r. m. i( `: }5 S//使能外部晶振
! y3 q0 F7 Z4 H. z+ iRCC_HSEConfig(RCC_HSE_ON);2 n- ~- v2 D4 Y# p! B
//等待外部晶振稳定2 u( S& @/ x* B4 I/ m6 w
HSEStartUpStatus = RCC_WaitForHSEStartUp();
  I0 K3 s& f" J  k1 E//如果外部晶振启动成功,则进行下一步操作
5 Q5 p3 E9 W" A$ \4 a7 @) Sif(HSEStartUpStatus==SUCCESS)  Y. V; [, v0 S! A  M" F, }' k- V# S" L
{( @+ b# t( u/ ^6 O5 t) C7 j) t
//设置HCLK(AHB时钟)=SYSCLK, J  O6 g' b3 l6 u& R
RCC_HCLKConfig(RCC_SYSCLK_Div1);6 L4 o' V8 u. q1 A" p! d2 O/ Q
//PCLK1(APB1) = HCLK/2  j" b1 @2 J2 w
RCC_PCLK1Config(RCC_HCLK_Div2);) Z$ k/ ?% `6 L& w
//PCLK2(APB2) = HCLK! \6 c) y# _; Q# F3 N/ f( I1 p0 R
RCC_PCLK2Config(RCC_HCLK_Div1);: e( x$ Q4 J; F& k! @
//FLASH时序控制
2 X1 r& P3 x7 R$ j9 s//推荐值:SYSCLK = 0~24MHz   Latency=0( i' R9 }, c7 z2 I
//        SYSCLK = 24~48MHz  Latency=1
& Y% V0 D6 t- o* A) j1 X//        SYSCLK = 48~72MHz  Latency=2
( j9 K/ \' k# G$ p' W2 f( \5 dFLASH_SetLatency(FLASH_Latency_2);
: n! `) K+ F; j$ l//开启FLASH预取指功能# l: `; b5 P' |9 c4 W5 \
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
: X0 q+ ]: g- g7 z) q9 ?! t0 [//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
1 {4 y5 `& u4 i3 r7 C+ hRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);$ }) O7 N5 m* S: L4 I
//启动PLL4 l% m& h! g3 w" D" ?' f
RCC_PLLCmd(ENABLE);
' Q, l4 e0 B" r2 Y0 O//等待PLL稳定
, r8 Q+ M0 L7 x" |while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
: k1 p. z3 [0 X# Q. ~8 a+ T) `//系统时钟SYSCLK来自PLL输出$ v1 b' H( R' W- L$ s" R: F5 u* Z- j
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
. A5 }: v+ d, v, g//切换时钟后等待系统时钟稳定: q+ E- X9 r+ F/ P
while(RCC_GetSYSCLKSource()!=0x08);
4 A" S, X$ \! _/** N1 s4 e7 ^4 D( u# `% S0 J
        //设置系统SYSCLK时钟为HSE输入
9 T( |5 H6 D9 W        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
, {0 W5 Z7 a$ P0 E4 C: S' T. |        //等待时钟切换成功& ~9 q' Z. N  |" j) P  v
        while(RCC_GetSYSCLKSource() != 0x04);
- q6 [" \. J0 S9 J: x6 _! H        */$ g7 d7 s- k5 o& V  e
}! W8 t1 d0 _$ w/ P0 L+ F2 h
//下面是给各模块开启时钟+ D" L4 ~+ W& c9 u: [2 o# i4 H
//启动GPIO6 J6 e8 N2 ~2 L9 Z  c$ d, L' l
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
" }3 `1 [) v3 q- Z4 D2 Y( J$ SRCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
$ P% q  z" [  K& `% S5 V( sENABLE);
* R' S! i6 J$ u/ }3 u" J; h( _//启动AFIO3 Z4 t5 C6 S$ u( ~( m, ?0 t/ `
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);' ^- J5 i* }* Z4 n/ }% {
//启动USART1
- x0 i9 M+ r  ~RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);3 `% q& A2 ^, G/ x9 b  w1 V8 o; b
//启动DMA时钟7 {( u5 R: _( w1 E5 h$ Y  q. Q
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
0 j/ P7 ?# M( L* H}. b/ D$ B* h8 {- i  o1 |2 l0 {
/*******************************************************************************
$ ]! t4 C( w, e# A, ]1 b1 Q$ L* Function Name  : GPIO_Configuration
2 q' P% }& _8 |7 N* Description    : GPIO设置/ y0 x! [* K# j* J% c8 o: R5 m
* Input          : None( `9 s7 ]* q: x7 L2 u/ V
* Output         : None, j. Y" ], _1 Y* V" u0 q; }( L5 u( u! N
* Return         : None
# A! T, W! ~1 o*******************************************************************************/- v' W2 D7 C3 S0 @# D
void GPIO_Configuration(void)
5 X7 E; b5 ]8 @. D% H( l# X{
  c$ S7 \5 O3 ~+ MGPIO_InitTypeDef GPIO_InitStructure;; k; |8 @: q; v  [2 Q3 Y5 W: o
//PC口4567脚设置GPIO输出,推挽 2M: i* |8 H- P8 f3 P1 O( D
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
: }; ?. [4 c0 l7 y) U, uGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
) K* ^3 V- p+ ?& DGPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
1 ?# D" C% y; k! b- V& p- aGPIO_Init(GPIOC, &GPIO_InitStructure);9 K9 i( b$ O, H
//KEY2 KEY3 JOYKEY
' U/ T! {* o5 R, }: \& `" J//位于PD口的3 4 11-15脚,使能设置为输入  P$ I  c$ C0 W
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\5 s9 ~- E0 p$ Z) A7 z" u! f
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
3 ^/ x2 D; D; u  SGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
( h$ Z$ ~4 v" W5 }: \GPIO_Init(GPIOD, &GPIO_InitStructure);: {+ l/ l/ h) A1 C8 `4 J
//USART1_TX  h  Q+ l3 ^9 r" P3 k2 r
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
/ }# w& y9 _% }' X0 z' {GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
! @( E" S3 A4 V1 lGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;$ W1 g( f+ h) }# v2 O, \
GPIO_Init(GPIOA, &GPIO_InitStructure);8 V+ |2 r/ z) s  O5 W
//USART1_RX2 C- k3 T6 R9 L( k; r! Z8 N, S
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;2 L% V- B' R8 t! }) z" f
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;5 a7 r% k% e+ o5 x( p3 K
GPIO_Init(GPIOA, &GPIO_InitStructure);
; [$ O+ z  V$ Y6 [: \2 c  H" g}
! m1 t$ \4 V! C, n0 Y6 N7 d/*******************************************************************************
4 x! B' y8 s! e. q* Function Name  : NVIC_Configuration' L( q& ^  ^5 N6 P1 k5 D
* Description    : NVIC设置
! p+ d/ B* c3 N% z. a" s) ]. N* Input          : None
) R3 i5 z' N( M+ [* S* Output         : None) E& P! Q. B( q. }+ ]
* Return         : None
# u3 T6 [! c$ m' g8 l*******************************************************************************/$ A0 X- n. U8 \: S
void NVIC_Configuration(void). A- k2 Y: ]& g+ f9 B
{
1 n/ C5 f2 k% t. C% l, x& MNVIC_InitTypeDef NVIC_InitStructure;% O2 v- l$ H; f4 H8 l9 J
#ifdef  VECT_TAB_RAM# p7 V* i: R3 b  i- O+ u  z
// Set the Vector Table base location at 0x200000007 n) _" f8 {# L* I1 n) W! c, m
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);4 W3 U( t: M0 \- k" Q" j0 [+ j
#else  /* VECT_TAB_FLASH  */6 @# [9 W1 X1 ?. |' n, ^- v' {1 q( D
// Set the Vector Table base location at 0x080000007 {4 |; y; K1 I8 z
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
3 t2 Q: B  Q' h* v5 R  V#endif' h. ]1 M+ g( G1 |+ m& j
//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级+ D- }6 Q$ @/ I+ H
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
0 y- C/ v( o3 x* V/ d) ~6 r//串口接收中断打开   
* E0 v/ q1 l' d5 SNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;9 y9 r: b' G5 {: y8 b7 L! q. S
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
$ z: X9 T" h8 p# G0 }! gNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;& H3 S6 ]! R1 r' g7 h2 v/ R
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
7 }& N7 m: h5 g. jNVIC_Init(&NVIC_InitStructure);
  }! w0 H7 g; w/ Q}
1 ^/ a: g5 h# {+ A/*******************************************************************************
6 k% w0 t' x" W3 V7 ?4 ~* Function Name  : USART1_Configuration
0 i! P. z. v9 v! [0 c& |5 I" [5 \* Description    : NUSART1设置
8 `4 y: [# b% D! d- L$ d% A* Input          : None+ t" @: n) Q+ u" b: o5 |" D
* Output         : None
- f% I4 g1 E6 R6 `3 H. y0 Q* Return         : None
3 _6 D3 J7 p- H3 U$ P. g' h*******************************************************************************/
( X! U- ^! v6 V3 N9 Z  q1 P1 w# b0 `void USART1_Configuration(void); E- M' I8 {4 \
{! G5 t% a! {; _/ z- z' m( p2 |( H0 }
USART_InitTypeDef USART_InitStructure;
7 w5 N3 ^" R6 n, V, SUSART_InitStructure.USART_BaudRate = 9600;
  }, z# D! u4 V! u$ qUSART_InitStructure.USART_WordLength = USART_WordLength_8b;$ `" [0 ]8 m, d
USART_InitStructure.USART_StopBits = USART_StopBits_1;
) Y5 n3 u8 f9 F; B6 M* ~USART_InitStructure.USART_Parity = USART_Parity_No;
! O) [) j: c0 K* @USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/ }1 p- D& ^3 R! T
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
" a7 `; H3 A! b$ L: G/ XUSART_Init(USART1, &USART_InitStructure);6 C# W$ N7 h- a- I
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
! {2 ]1 O- R$ u9 ?+ ?% ~USART_Cmd(USART1, ENABLE);
1 _! _8 P! `. j1 V* @- m}
/ ?1 V! I' \4 k7 M$ _$ pvoid DMA_Configuration(void), l# p0 X" S  [1 b8 h
{
, z3 V7 C1 [8 h- z! g4 D. ~9 FDMA_InitTypeDef DMA_InitStructure;: D, R  G' B& E3 \* p
//DMA设置:+ H2 `! T+ x4 E* O
//设置DMA源:内存地址&串口数据寄存器地址& l/ M* ?5 Q7 t5 b7 n0 @9 M
//方向:内存-->外设; U2 {1 Q7 Z3 Y$ I+ Q
//每次传输位:8bit8 I* Y& `( J1 D  Z( n* H
//传输大小DMA_BufferSize=SENDBUFF_SIZE5 L4 `1 n/ F% W& K3 y' U" S% {
//地址自增模式:外设地址不增,内存地址自增1! L# C/ p6 G! T  F' r
//DMA模式:一次传输,非循环
0 {# w2 p# D4 z& @' @//优先级:中
9 a1 |4 U; D/ O+ J# F$ GDMA_DeInit(DMA1_Channel4);
) s5 F( p& X% D+ DDMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
7 g/ S, M9 L. yDMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
+ K7 T, i0 s: R' \: J7 [DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;7 Q  O& p; K! T
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
5 m5 i1 b8 L: v/ A! T& vDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
9 l) u" f7 i2 V0 {DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
3 N8 _" I, T- l* j1 q/ gDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;+ Z3 G% I3 y# K% i
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;$ y: S7 D  M! U/ T+ U) X% W4 i( g. C
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;; m- `3 l$ C/ e! J  q! ]+ R- Q
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
: i" \" l4 _# cDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/ m6 I/ ~1 Y! B0 VDMA_Init(DMA1_Channel4, &DMA_InitStructure);! h  s4 |' ~% _' m# y0 U
}
+ ?& [" a$ A7 n
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似分享

官网相关资源

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