请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************
9 P( f* d3 c5 d7 ~* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()0 c& i) l+ P% l
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
% P! S. n, X$ ?3 W# N# k! S* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,- e9 ]* x0 {6 `1 w( `
* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART% M, H1 e/ Q4 z3 Q) y. x4 j) E
* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
3 K& ^3 H1 I6 l4 J* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止+ I, l* W! [& H  k6 U0 _% z8 p
* 串口依然发送,表明DMA传输是一个独立的过程。
$ y; c# ^! d3 f0 j: r2 I3 M( h* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理, t( e3 Y) y+ J1 S/ \9 _
* 作者:jjldc(九九)) t2 q+ U1 U% f/ Y5 w! Q$ d
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
" {* j6 ~/ x1 z, T7 V9 f! c*******************************************************************************/1 S. {  _  ^2 e& n
/* Includes ------------------------------------------------------------------*/' `  s* M0 c6 [. S: d/ M* O
#include "stm32f10x_lib.h"+ t* G' }* s% d7 }8 \6 a  i: \& C
#include "stdio.h"; d2 c1 r' @/ s/ u4 }
/* Private typedef -----------------------------------------------------------*/
% @; C- O4 F- ?5 A  r! h/* Private define ------------------------------------------------------------*/& ]  c! t' A. A, E
#define USART1_DR_Base  0x40013804
6 B7 p# ~, _; D! }! X/* Private macro -------------------------------------------------------------*/" w' l  |* z: ^; x; G6 {) ]; E
/* Private variables ---------------------------------------------------------*/$ n" Z' _2 v7 ^2 r
#define SENDBUFF_SIZE   10240
0 g" e' R" v: X1 @! x! uvu8 SendBuff[SENDBUFF_SIZE];" `) Q' H, {0 q4 H: `
vu8 RecvBuff[10];6 v7 p7 X- l- t3 M0 s2 @" }3 c
vu8 recv_ptr;& q# Q8 r5 i$ }" W( c4 j: o+ P; g6 S
/* Private function prototypes -----------------------------------------------*/) p0 H' e5 l9 d
void RCC_Configuration(void);0 ^$ p% `, S. b/ A
void GPIO_Configuration(void);6 h% J$ P5 F7 c* Z, q7 C  w# K
void NVIC_Configuration(void);- F8 p6 q8 m8 }9 \" [! C
void DMA_Configuration(void);
+ X6 z  @+ }% R9 i# ovoid USART1_Configuration(void);2 Y# u+ I: ?, h3 d7 c' u
int fputc(int ch, FILE *f);0 V3 r9 H! `+ s" j
void Delay(void);
1 [1 D. D7 e' a4 u$ P% u5 u* ~/* Private functions ---------------------------------------------------------*/
/ ?: O4 H7 c2 I' Q- X/*******************************************************************************6 H* Z: ?# p$ r# m4 }
* Function Name  : main
7 u- b  I6 z0 A5 |# g# p* Description    : Main program.
) U! O- J* V* @5 C  ?3 ~5 o* Input          : None
/ W9 x: p9 H) w( c5 U. w2 x8 H8 e* Output         : None
9 D  N, d: g) H! I. W9 Q! M. F# A* Return         : None
4 N# G7 P8 H" D, @' T*******************************************************************************/% R4 ^- ^  |" v
int main(void)
) T- N6 Q/ e0 _( z1 w  v{5 C) Z8 _4 g  ?' g' e2 E
u16 i;
, r$ ]! F9 W( J: w  n" R#ifdef DEBUG
1 }9 j9 h0 U* r& E! `debug();
2 e1 _) V& I& p0 ~#endif9 u5 k" h$ M9 _) j" e, N
recv_ptr = 0;
: T/ z$ j; V8 Q& ?3 bRCC_Configuration();
  n( Z8 |& p3 s7 W+ W' G, oGPIO_Configuration();
6 G: X) e$ S& t! N# c4 zNVIC_Configuration();8 e8 F! k' [/ f% v! Y: `
DMA_Configuration();
6 U6 y% P1 r, I9 D0 G. M7 U; g2 WUSART1_Configuration();) ^$ p- Y8 h3 |7 o" U) u9 K' M( N6 {& M& Z
printf("\r\nSystem Start...\r\n");' C/ Z& ^+ j. G
printf("Initialling SendBuff... \r\n");
: `1 D' x6 i4 p/ h, }for(i=0;i<SENDBUFF_SIZE;i++)
0 c: `$ V+ N; {6 y{$ t1 G; n) ^' j) g/ w4 ]
SendBuff = i&0xff;
7 U- d2 [. h8 I! F}
4 \; i; Y5 [, @, w0 D6 Lprintf("Initial success!\r\nWaiting for transmission...\r\n");
3 i: p% H3 S3 W; S4 P; Z//发送去数据已经准备好,按下按键即开始传输9 P& P9 z2 a& J% O$ i+ b( w/ h
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
/ b: [8 p8 v9 u" k5 `. R7 hprintf("Start DMA transmission!\r\n");  U- t- L8 Z3 v3 U1 i
//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
) E: Z' V) H5 E% K( S0 Q$ \USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
( r, E) M0 r" }( b//开始一次DMA传输!, J% B4 e+ @: c" _8 F* D
DMA_Cmd(DMA1_Channel4, ENABLE);. y5 K- Z. _  t
//等待DMA传输完成,此时我们来做另外一些事,点灯. C$ M' e: h) j% N, a
//实际应用中,传输数据期间,可以执行另外的任务
) G/ d: d5 \% z. R1 b" ywhile(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
8 d# i2 q! Y9 W5 |& o) A* x{
6 D  S* G% N1 G7 l" Y! m% zLED_1_REV;      //LED翻转
6 e8 F& ]. U( F- g. ^  b: @Delay();        //浪费时间
7 t5 x; v) G" [, ?; [7 A' Q. f}4 r$ e, z" N) o: X
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭
/ R% {( s3 K3 e. {//下面的语句被注释
" ~6 K5 V8 n% H7 v+ u$ Y( N//DMA_Cmd(DMA1_Channel4, DISABLE);
# _7 @4 K# h& V5 Mprintf("\r\nDMA transmission successful!\r\n");3 e( ?9 ?% q0 T1 J/ s
/* Infinite loop */
$ _* H" S2 |/ Z$ G. V: }. {* swhile (1)
7 Y8 J' g# G& x" Y  `+ ?* y2 L{
6 r( A1 O' `8 N. ?5 g/ n}  B# h: i% {1 d) T9 w0 {- h; z
}/ s3 G" @8 W$ ?7 N( _9 _( U' [
/*******************************************************************************
  r8 i7 `6 r8 K+ D6 o  T* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)
7 Z: p4 H, U' A* Description    : 串口发一个字节
  Y7 c& n) q3 v5 G8 G/ |6 T* Input          : int ch, FILE *f) n# s* C2 y1 F  |
* Output         :
( b/ A. ]4 P- g* w7 {  ?: ?* Return         : int ch/ R8 O. F# c$ C
* 这个是使用printf的关键! j9 ?6 O5 H( o* j- h
*******************************************************************************/
3 Y1 \  z: ]! r6 [5 q' m+ Sint fputc(int ch, FILE *f)
  i! X+ w  o! Q0 C% y7 k+ q! A{; f! I/ Z9 w' m2 S& N' U9 [
//USART_SendData(USART1, (u8) ch);: s) k9 E# P' x0 \; {7 a
USART1->DR = (u8) ch;! `1 ~6 z7 _" l$ g7 a/ G
/* Loop until the end of transmission */
0 A$ b; e4 M! H2 k3 Kwhile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
! r3 Y- G- X7 W" |; W7 e{0 y( d" x+ z, L2 f* O- a8 ~/ k4 ]
}
! P. ]( T! d5 _$ k( ~6 v9 a$ wreturn ch;
( y* Z. U6 h8 Z. _- {" x; q}
( Q3 c9 Z6 C; s/*******************************************************************************) W8 ~7 R6 p$ }$ J4 ~5 z$ f. h
* Function Name  : Delay: }* l- |$ [0 S% @, \1 r
* Description    : 延时函数
3 Z8 d* p. _7 t1 h, f' E/ j* Input          : None+ S* M" y+ k9 ?$ l; J' H5 |# y
* Output         : None
8 \1 J/ f, U0 A0 }; c! Y* Return         : None+ g; g; v4 q* [" u  g5 J: W
*******************************************************************************/6 M2 \0 v% C; |  x9 M% n
void Delay(void)
+ ^+ C, q+ k% D6 b{: ~) O( g0 t. W4 S* N8 `1 G
u32 i;" N# ^' g( }! I0 q: p9 E- p
for(i=0;i<0xF0000;i++);
, h. d" {3 a( _2 w7 ]. O& ]# k2 areturn;: o) [( i# Q/ L- }0 }5 Z/ c; U
}
2 ~( V8 b9 [# J$ w/*******************************************************************************
8 x$ z8 m: P, q# Q3 D" e" i* Function Name  : RCC_Configuration
/ d- c3 L' g0 Q' u+ Z  u$ q0 y* Description    : 系统时钟设置
, t# B/ f# y. O0 v! b* Input          : None
( p& {1 s, w7 @- H; m$ C; D: |& U* Output         : None3 y8 H, Q0 F9 W5 _5 S& x
* Return         : None
: b* h9 E  j: N1 t: n*******************************************************************************/
/ I3 P# s: s' R) C$ ovoid RCC_Configuration(void)0 g" o5 ]# H& ]' G2 ^' O  q% C3 Z1 Q
{! M: |( ?/ G, ~3 w
ErrorStatus HSEStartUpStatus;
, ]+ E9 A( T5 m) {8 g2 J; Z//使能外部晶振
8 [& P* O. d! Q6 |6 x: JRCC_HSEConfig(RCC_HSE_ON);
0 k) \: B; d3 P  i) m//等待外部晶振稳定( p% `+ j8 N* h7 `2 z5 p  R9 U
HSEStartUpStatus = RCC_WaitForHSEStartUp();
( C/ |8 p* {8 u. B. z3 }  G//如果外部晶振启动成功,则进行下一步操作  Z0 f7 u' m& y/ T8 S- x
if(HSEStartUpStatus==SUCCESS)# K. ]) o$ W2 Q( \3 ]; g* z2 @
{- A) {9 ?0 k3 A4 d5 N- ]$ I/ e
//设置HCLK(AHB时钟)=SYSCLK
9 P# S8 d$ B9 q8 d# K  KRCC_HCLKConfig(RCC_SYSCLK_Div1);8 _1 |  i8 ]3 l$ V4 U+ w: q3 v" H
//PCLK1(APB1) = HCLK/2
+ c/ t& Q( _8 y  K0 P% wRCC_PCLK1Config(RCC_HCLK_Div2);% t, D% N; u6 `8 t. `4 M4 |
//PCLK2(APB2) = HCLK
9 G4 \7 M  T& rRCC_PCLK2Config(RCC_HCLK_Div1);1 `! K6 U6 n. i
//FLASH时序控制' [9 i) U+ H% n* e" |: y3 |
//推荐值:SYSCLK = 0~24MHz   Latency=0
7 K: f/ E7 o( I: ~/ v0 R//        SYSCLK = 24~48MHz  Latency=1
( f! r: j$ a8 @//        SYSCLK = 48~72MHz  Latency=24 u9 `- ^9 A- v2 b* J4 d0 X
FLASH_SetLatency(FLASH_Latency_2);" `  N& |2 ]- s* b; t1 P$ E
//开启FLASH预取指功能
' L' e. q# T' U! W+ [9 q6 A6 [, ZFLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);5 ]5 }1 W! ~( D# @" V( A1 L
//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz! r9 J3 |* ]& {; @
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);, i2 R+ `9 O" s
//启动PLL
; D- C. s2 N7 S% \; P, I4 Z: QRCC_PLLCmd(ENABLE);# k9 U' E$ [# Y- P+ h# q2 q
//等待PLL稳定  q- E. a' _; A; k$ T! |3 x/ V
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);) J8 Q0 r" z( X5 V8 n3 P' e- f
//系统时钟SYSCLK来自PLL输出
3 Q. Q3 d8 W# n  ^. E6 ~7 z* D% lRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/ R* ~$ ~9 ^4 f: t" v; V//切换时钟后等待系统时钟稳定2 ^: W4 H! _6 Q
while(RCC_GetSYSCLKSource()!=0x08);
0 {% C% ]; y- Z- S  f" k! V* s# l/*' x- r, U1 ~( R) s+ K
        //设置系统SYSCLK时钟为HSE输入: Q6 m) Y& l" Q0 D6 ?3 n  ?8 b
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
/ `! b5 C4 o+ z6 C/ e        //等待时钟切换成功
4 h6 w; w' I8 ?+ X, |9 V        while(RCC_GetSYSCLKSource() != 0x04);; Y$ p9 B- o" e. B2 d' |+ t/ s
        */  e/ C: d+ j3 Y) U( N# z
}
5 B3 ^+ ?: |/ V* B! E//下面是给各模块开启时钟
5 E8 L& x& [* t, E//启动GPIO& A' ^. P7 X3 c7 T1 m
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \* q2 R( P6 H3 w# W8 a  b
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
5 _. O  j+ P" j1 b5 Y" Y) wENABLE);
; _4 _1 N6 _# a$ D# L& R1 J//启动AFIO
8 R; [% }$ i4 N0 ~9 H! ]RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
3 G" E" A# A6 Y4 |- x) ]//启动USART1
1 o1 n9 s; ^5 l" gRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);+ H+ P. w- q* n& ?' I8 G! E) o# B: v
//启动DMA时钟6 d. C1 f! H) V% W
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);4 k8 m* I! O+ ]  S! u$ I
}7 \, h' |# [6 P
/*******************************************************************************
, A/ K, {+ K1 M; s. @& R  n$ J) t* Function Name  : GPIO_Configuration& ^# ~( b1 m3 q0 R- j
* Description    : GPIO设置: a8 E" Q% d  _$ `
* Input          : None
" R7 F3 F2 @! T* Output         : None+ j# Z8 j: a3 T; Z; l! B% g
* Return         : None
" ]3 j! Y) O( Y, {5 h& F*******************************************************************************/
% G, q/ J7 N9 uvoid GPIO_Configuration(void)
& g* p% N. f- \" o6 f/ s{
8 v! ?9 n- n1 g8 z; n+ EGPIO_InitTypeDef GPIO_InitStructure;
1 j( m: u& E8 ~; y//PC口4567脚设置GPIO输出,推挽 2M& v& L( w5 J: ?
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
! r  L* E0 v- Q$ [) bGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;5 ]! |7 _7 `$ M. U$ e4 a1 ]3 i- h5 _* x
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
$ \" g  T* O1 Q: F" LGPIO_Init(GPIOC, &GPIO_InitStructure);' n6 k/ w. `' }1 d& Z# N6 m' T. {
//KEY2 KEY3 JOYKEY
6 l# X3 G( ^: K6 E//位于PD口的3 4 11-15脚,使能设置为输入
2 u0 q, |: r& }: AGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\; O$ L9 @8 o& i' U; Y$ B
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;9 K: h/ d7 a3 ?2 C
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;: M% B, F7 D( j. m- [
GPIO_Init(GPIOD, &GPIO_InitStructure);
; _) A2 G; G9 U/ v$ e" m//USART1_TX8 e0 X- `  w2 V# f- E! b; r" ^) i
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- R: x4 v) C6 u- p  Z0 I  Y, \6 kGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; y+ W7 K1 z7 M  @! B
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;! y- s' B, h# p$ v( P! r
GPIO_Init(GPIOA, &GPIO_InitStructure);
* i( p3 y6 U" x//USART1_RX. b8 M' O0 Y( }
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;! T* z9 w2 \2 Y- E
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;1 A$ [) F8 z* i4 J
GPIO_Init(GPIOA, &GPIO_InitStructure);
/ ^, @6 o: b4 W: g}0 \' c* ~' B7 d
/*******************************************************************************
6 Q$ D( q/ T/ D! K7 m* Function Name  : NVIC_Configuration
  W- r; s! n& a" Z8 }/ ~* Description    : NVIC设置" |' B; w. A6 f/ t8 f
* Input          : None
8 {' r0 g7 n0 u! b* Output         : None( z# m: }4 Q% K) c" @
* Return         : None# C) ]$ s& O9 s. |( [. D, T3 M
*******************************************************************************/. g% ^. h2 o. H$ z2 L! C& {
void NVIC_Configuration(void)2 H2 e2 w2 d4 a- ^. \
{
. X9 u' z( l6 \# f% d' `NVIC_InitTypeDef NVIC_InitStructure;
4 n) j3 N' |- _5 o$ E#ifdef  VECT_TAB_RAM, D) O  _0 M) M! `; ^! j
// Set the Vector Table base location at 0x20000000  a$ X4 }7 w( U* B
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
, g0 _+ U: v3 D) j. \+ D. d#else  /* VECT_TAB_FLASH  */2 n, z! b+ q" Q8 [5 J
// Set the Vector Table base location at 0x08000000
) G. {8 F) F4 P9 {8 P2 nNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
# |0 P+ ]* z, r#endif
% y' C$ b6 @3 a/ h3 f# A//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
/ t% e1 P; C7 _  K5 x) S# iNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
) s( q3 G$ y% p4 q//串口接收中断打开   2 k+ }5 U0 r. b8 I; Q0 s. M
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;$ U& b9 t0 X5 D6 C2 {2 R( Q0 U! d, \
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;5 i' |0 b( m0 r8 D
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
* C# w( P0 Y3 gNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
" g/ K/ H8 U4 L8 B  ZNVIC_Init(&NVIC_InitStructure);
4 n0 h/ k) `! Q* ~7 C0 u) j5 E. x}
, O- }) Y) V" ~$ ?9 n/*******************************************************************************
6 _; H8 F, p6 I) q  Y& ?6 ?( v* Function Name  : USART1_Configuration- t. T4 o3 \( n: V# [* G
* Description    : NUSART1设置/ e0 o( S4 a8 ]7 T$ C" S
* Input          : None
  P* g7 F: Q7 }- f4 J2 {' g* Output         : None( @) O% F' l; G- h  l; I2 E# G
* Return         : None
0 O% Z4 v/ B( j6 U" M3 W*******************************************************************************/3 y! `; J+ Z  ~- x5 U1 v$ w0 S% _
void USART1_Configuration(void)$ z# S  a; I% ~$ u$ T
{% u% ^2 R/ }( n9 ]+ \
USART_InitTypeDef USART_InitStructure;
( n$ Y3 H9 v& E% N2 DUSART_InitStructure.USART_BaudRate = 9600;; X- L0 g% |/ L1 v% V
USART_InitStructure.USART_WordLength = USART_WordLength_8b;/ M3 F5 J0 @: ^
USART_InitStructure.USART_StopBits = USART_StopBits_1;( w( ?9 H9 k& t/ E+ ^
USART_InitStructure.USART_Parity = USART_Parity_No;  R+ [& m* o, J. a* t. I+ c
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
2 j# o1 @) i0 t4 j  Q' eUSART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
5 k) P* H/ @, a& M/ f" ~USART_Init(USART1, &USART_InitStructure);
1 n' ^* ~! z" g$ W$ zUSART_ITConfig(USART1, USART_IT_RXNE, ENABLE);' q2 {4 [5 U  d* Y
USART_Cmd(USART1, ENABLE);1 I) u$ }+ P* E8 e; s$ v
}. [: |! x$ h4 ?( ~5 m" c
void DMA_Configuration(void)
( E8 z6 j# o$ b/ Y% \5 A1 z0 \& C{
/ Z3 M6 i( C7 t$ y5 fDMA_InitTypeDef DMA_InitStructure;
+ g% [3 T/ m1 P//DMA设置:) A2 i4 h, L- N4 ]
//设置DMA源:内存地址&串口数据寄存器地址" R' w2 j3 t" O6 l! J+ k9 ?
//方向:内存-->外设
9 r! T4 \! W1 }  M* r9 l//每次传输位:8bit
6 P# ?' k% [. m//传输大小DMA_BufferSize=SENDBUFF_SIZE0 e" j/ S6 x5 P, _$ S
//地址自增模式:外设地址不增,内存地址自增1- v* D" P8 u6 a+ P1 R
//DMA模式:一次传输,非循环
/ X  t4 ~. v! ?- \% c' |1 P4 f//优先级:中# P. z) }2 v6 {; Z0 Y- Z
DMA_DeInit(DMA1_Channel4);
' t7 k$ k: k/ FDMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;& E' k* A) A' i% L6 c& ~
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;$ G( w0 z' @" j3 z
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;: R* R/ d% p' L) q7 ?
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
4 R: n/ \  |0 d- LDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
! }- L2 u# M1 DDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;3 O3 T  p! Q. q0 k
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
$ _! x0 `, x" UDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;: ~; o- U# Z( T: w
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;! \/ s2 m6 |$ |4 o
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  T/ I: ]0 @: R% y2 x
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
9 U% [( W2 [) G7 E! i7 y( yDMA_Init(DMA1_Channel4, &DMA_InitStructure);
+ w! \2 G% q. H, b}
0 D5 x4 a, g6 ~/ |7 A5 g
收藏 评论0 发布时间:2022-1-18 19:42

举报

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