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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************9 ~6 p* P. z$ h1 N/ a
* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()3 l8 {3 E2 A6 K) _* a* O
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输1 i. Y) q8 X0 Q
* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,* {  J" o- }6 j9 q, n9 C
* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART! A3 W# Q. K# h  s2 |8 [- q
* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可- ?, \1 M+ e% O
* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止4 n2 [9 ^6 o' |& W9 t2 b
* 串口依然发送,表明DMA传输是一个独立的过程。
5 }2 l1 J/ ]0 [5 d8 n* L. v* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
4 W5 D; n; \7 ?* N2 |* 作者:jjldc(九九)
6 q$ C' |( E9 e3 Q/ V* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT68 E6 x! j+ \) C- L8 T: [; o
*******************************************************************************/% \0 h2 x9 b0 T- V! J# O$ Y1 T
/* Includes ------------------------------------------------------------------*/" P$ y; p2 H- H/ R: P3 I$ Y6 ^
#include "stm32f10x_lib.h". D2 e, N7 w- u& J
#include "stdio.h"- w$ r6 d' O6 X" ?4 _; t
/* Private typedef -----------------------------------------------------------*/( _2 ^, U* [. r' A
/* Private define ------------------------------------------------------------*/
" Z, v9 e( W; _7 E; I) [+ ]#define USART1_DR_Base  0x40013804
- {$ r' Y- t5 n5 S+ ~2 l* u, E/* Private macro -------------------------------------------------------------*/
) Q% v) y& @' Y6 }, }' e9 W/* Private variables ---------------------------------------------------------*/' e# h" l) _% {1 s% m! s
#define SENDBUFF_SIZE   10240# s: h) j0 w$ ?6 ]  T
vu8 SendBuff[SENDBUFF_SIZE];( ]7 h5 G5 u' Y& C
vu8 RecvBuff[10];
) S* f% s; Y; z; y9 u$ }9 x5 Fvu8 recv_ptr;8 A& {3 v/ k' S( n- S
/* Private function prototypes -----------------------------------------------*/4 ?. u, I# T/ \2 M6 @* G, x: A( c
void RCC_Configuration(void);
+ e8 T" ?; C9 _" n+ ~4 @void GPIO_Configuration(void);
, _# |9 r. j2 }8 Y( rvoid NVIC_Configuration(void);4 |+ e# [1 p  ^/ q
void DMA_Configuration(void);
+ k8 f) ]0 N1 t# O- C5 `8 Fvoid USART1_Configuration(void);
3 V9 j9 }6 @/ P  l; m( O9 ?9 I  nint fputc(int ch, FILE *f);
. u7 T9 i, n6 pvoid Delay(void);
% I) ], S$ s9 I  R/* Private functions ---------------------------------------------------------*/5 Y. U9 T$ j% e3 @$ L$ L
/*******************************************************************************
$ l  w% Y2 Q3 n! K0 U1 n* Function Name  : main
+ X0 n, f! h( T* Description    : Main program.
7 u1 e( S" b5 x  V* Input          : None
& v4 y% k3 I- I4 X8 t* P5 d8 ?* Output         : None0 i# l# [2 F) f/ b( z( P
* Return         : None5 y& h% K  K7 d' n8 s( q" p. U- T7 K
*******************************************************************************/
0 A6 m8 e9 R/ h! b5 @" d; a& v. }int main(void)
2 V$ L/ h1 B7 I! }4 ^{% j) V" N" |2 n6 S
u16 i;0 a. L# D+ O/ N: ]5 C- B) N
#ifdef DEBUG) _& K* U& N; k& S4 f+ b# j
debug();4 h9 g4 s) N( s& N2 J7 ]$ P3 {2 }
#endif
2 C! R  W3 i1 L  v/ b& R7 r2 vrecv_ptr = 0;
& u- x6 I; G3 fRCC_Configuration();( _+ q7 W. U& \: |7 d( L
GPIO_Configuration();
: a) J9 E% L% FNVIC_Configuration();
- `$ n3 M  g8 z6 a4 T) ?# U, \* M4 f9 yDMA_Configuration();0 x" u1 U) S  Q6 v1 W5 ?3 C0 U  N
USART1_Configuration();) a- ]' y# m0 z( _+ H
printf("\r\nSystem Start...\r\n");
3 L; a% T/ D) e: k4 E# wprintf("Initialling SendBuff... \r\n");  _- F! B; T! Q9 K7 o1 L  P4 L
for(i=0;i<SENDBUFF_SIZE;i++): T$ g; K( Q+ p+ i& w6 T6 r
{
* z* S+ z% P; T2 CSendBuff = i&0xff;6 ~0 e: g' Q+ E' O& t
}; x% ~( r8 i" _0 p5 A1 }+ z+ K
printf("Initial success!\r\nWaiting for transmission...\r\n");* h" }! q6 U# }7 e) x. p  O& V8 n! b3 {
//发送去数据已经准备好,按下按键即开始传输
6 |5 m3 N. L4 _0 ?( Owhile(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
' O% {! c3 b% _1 U7 ~. C. o" l2 s. j+ wprintf("Start DMA transmission!\r\n");
. J/ f6 A: B' a- y4 z//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作" J/ I% ]* u- j- \0 F: x
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);8 F+ Z" d% c( C& q9 Z4 n' I/ E
//开始一次DMA传输!
' j! {" M# _, F0 V" x- b$ Q7 o( RDMA_Cmd(DMA1_Channel4, ENABLE);
$ \- R% e* Y# s//等待DMA传输完成,此时我们来做另外一些事,点灯
/ H; s2 _6 V. U//实际应用中,传输数据期间,可以执行另外的任务$ y2 H1 V3 j7 I% r" ^
while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
2 C% a# f9 D# `3 k" L) a1 ?{
* N: r. C; C' y3 I' ?/ ULED_1_REV;      //LED翻转
% L9 I9 G! z5 K  IDelay();        //浪费时间/ Y2 P8 }9 f' g1 R
}
# V9 u$ L% R3 {0 u0 w3 U9 I) ?//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭* E' w: X1 `8 I" J# v9 w
//下面的语句被注释  `; l$ {/ y7 l6 @" t# c/ e+ t1 I; T7 L# t
//DMA_Cmd(DMA1_Channel4, DISABLE);
" L' j# [: x8 K; H+ hprintf("\r\nDMA transmission successful!\r\n");4 g$ d* T3 u3 S0 g7 e6 [
/* Infinite loop */+ T+ \* s/ [9 y7 ?5 ^& k- ~
while (1)
; V( l# G  e+ J4 A% [{
# m4 z. o* U2 X: Q3 {/ D}, D1 `3 J/ N8 G% d( s7 N
}
' \2 e" b+ p: q2 Z% L/*******************************************************************************) ?* G: A$ K, z. Y9 X
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)3 w; o* U6 n1 W- G
* Description    : 串口发一个字节: M( Z$ n& L$ u4 w* E! L
* Input          : int ch, FILE *f3 p& j1 N/ J& x2 j4 ^: w5 ]
* Output         :/ k+ P7 Y% ]" X1 r& m3 A3 r
* Return         : int ch
) h% p1 x# i- I& z* 这个是使用printf的关键! A3 k, \0 y6 m$ `6 ?. W
*******************************************************************************/3 D7 U* j& t! |0 y% x5 j7 D" c
int fputc(int ch, FILE *f)
. Z& V3 r& S& c6 U- h" i{
3 ^, n# S+ y! G% N4 G$ {8 `//USART_SendData(USART1, (u8) ch);2 ?0 k  x: b* K6 J
USART1->DR = (u8) ch;
5 W# _9 V; H7 U+ G% ^/* Loop until the end of transmission */6 a  s4 T' q( f, s# D' m, R
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET). a' e1 j6 G0 U
{
3 h2 J6 p2 t; x, }$ w}
: o. W" V- @7 f: N" c" Nreturn ch;
: z( K2 o* O4 U9 i! J1 s9 m/ T4 b}
0 o7 L' E$ f& G% z3 |/ m5 w/*******************************************************************************
$ Y2 Z# N. a$ B. y5 p* Function Name  : Delay3 i$ k- ~, _- }
* Description    : 延时函数- R0 \/ B! B: w! J7 F( V
* Input          : None- x( O. O( R$ E
* Output         : None
8 y5 Y5 J: F3 Z& e1 o* Return         : None1 V/ J$ b9 R( P; n
*******************************************************************************/
0 T0 I) b6 `) E3 |( z& k, y0 W% v8 Evoid Delay(void)4 i' z# t! [5 A& X  U4 v
{
- @# P& l# P1 t" bu32 i;
* `% P& @9 b2 E- i# Vfor(i=0;i<0xF0000;i++);1 X: f: S) e1 o+ \8 J) B0 `
return;
) c4 w) F( ?. }* V}; z! L& m) _0 i  A, d2 q
/*******************************************************************************5 T- J9 \% T- ^( A1 s
* Function Name  : RCC_Configuration& p6 a. k- Q. I: M
* Description    : 系统时钟设置
; {- T: I6 m. f* Input          : None. R; y# i0 b/ L) I, i' L: I
* Output         : None, G& |3 a6 p- P
* Return         : None# J6 Z# Y! Z4 X% y! y& m
*******************************************************************************/
+ W0 b/ q: n5 n, Y7 k& Y- a$ R  c6 {7 Lvoid RCC_Configuration(void)- G+ L. R' z0 W
{8 s( z& y9 e# R% m6 E) y
ErrorStatus HSEStartUpStatus;1 F( e# U  u# R& A* X' x
//使能外部晶振/ M+ E: g* i2 ]0 ?6 m6 e
RCC_HSEConfig(RCC_HSE_ON);/ f  w' {3 y4 v$ Z
//等待外部晶振稳定
- H3 v2 s  E9 E5 mHSEStartUpStatus = RCC_WaitForHSEStartUp();
7 h, F, V' \$ v1 [$ K+ m, q+ N2 k4 p//如果外部晶振启动成功,则进行下一步操作) N2 Z: T+ |( d/ g4 c; \: l* h
if(HSEStartUpStatus==SUCCESS)
* f; z( v- d1 V& T$ d5 e3 f  b) m{
+ _( |4 P0 W; `" m//设置HCLK(AHB时钟)=SYSCLK
+ T  S4 X+ X$ q) W' ?* y1 y  G0 TRCC_HCLKConfig(RCC_SYSCLK_Div1);
8 s. V) J2 Z5 }  ~) W//PCLK1(APB1) = HCLK/2- y. n( `6 R' i
RCC_PCLK1Config(RCC_HCLK_Div2);
  d2 O4 R3 i* Y1 c+ ?3 O//PCLK2(APB2) = HCLK
1 S8 v& v8 P( _6 m( l. ~! L/ X! Z% J: BRCC_PCLK2Config(RCC_HCLK_Div1);
) z7 z# `+ S8 W2 v4 k$ m/ O$ O$ U//FLASH时序控制& t7 i! {0 Y! w  {8 p. H  q4 M6 ^
//推荐值:SYSCLK = 0~24MHz   Latency=06 V  a% t/ w8 g- |( }
//        SYSCLK = 24~48MHz  Latency=1
# a6 f' u+ x4 C: |& ~9 k- Q//        SYSCLK = 48~72MHz  Latency=2
% |' @( H& ^  R8 z8 bFLASH_SetLatency(FLASH_Latency_2);
8 J9 v7 w! r+ |//开启FLASH预取指功能; G' X# u1 x% m' M
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);* _9 K. p- \7 p1 Z' k
//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
" \; a) p  h, p- n, L6 sRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
7 T9 i7 L6 L5 p3 F# v# Y1 ^; ^7 w//启动PLL
* `  ~. J% h% GRCC_PLLCmd(ENABLE);9 G7 ~( r6 c' ]  G4 ^1 K* y
//等待PLL稳定( _4 o# m4 h2 Q4 T3 A9 w; ~( |, Z
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
. n6 U  X0 H  d+ {2 e//系统时钟SYSCLK来自PLL输出
/ \/ h6 g( H/ O8 k* o& x( y0 MRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);! t( h% P) W$ H+ M
//切换时钟后等待系统时钟稳定9 `3 R8 M9 ^3 k: w
while(RCC_GetSYSCLKSource()!=0x08);" g7 d" i: q( Y! T( v3 t7 O, @
/*
- V' n$ A/ a+ s' }% k+ s) X        //设置系统SYSCLK时钟为HSE输入* ]+ A5 Q6 {0 J6 Q5 U
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
4 |# E; l& `" B4 ~        //等待时钟切换成功
7 d0 S6 K0 M3 [. |2 N( T" Z% x5 n% u        while(RCC_GetSYSCLKSource() != 0x04);" h$ Q$ `3 m  I* W& M
        */
( \! q( T7 @. q4 g8 v4 V8 G2 x}
" q! W" S1 |. W% {- E//下面是给各模块开启时钟  N9 V3 a8 i! M6 |6 c) @7 J
//启动GPIO+ J. _5 s9 }0 i* }& Q
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
6 p8 X6 z" w. r! J" H, Z  |" lRCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\! G, J0 @# Z% b# M! }' q
ENABLE);
2 p8 {! u3 t8 E. c4 Q//启动AFIO6 J5 N) ~% U8 \' ]  h/ l
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
+ W) [$ }* w# X, K( x6 C+ ~3 m4 X//启动USART17 o# x* l$ V/ G# g3 {: d: T
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
1 \2 o7 l& Y) c  t) \* K//启动DMA时钟4 ]/ f0 Z  f% B' E! |0 A0 _
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);, }$ t2 v% H6 _$ ~4 O+ `
}
! s9 u, H3 i5 H9 q3 s' d2 [/*******************************************************************************
& [& u7 T) y6 L4 h* E* Function Name  : GPIO_Configuration
6 p5 |3 B8 h6 X5 e+ a* Description    : GPIO设置4 Y. l( {- [7 ?
* Input          : None
- R& `' Z5 ]) c2 H, w/ X  V6 t* Output         : None6 K- Y) N0 D: s/ ?! t% a6 `
* Return         : None
0 w# j5 C! y4 p2 P, q*******************************************************************************/5 j* P5 n  ?, |3 Y( T
void GPIO_Configuration(void)1 j% ]( A$ C. p- {
{5 M8 E9 V% f8 }. P! A
GPIO_InitTypeDef GPIO_InitStructure;  O0 I+ r  @8 j+ F- Y  Z* u- ?# T
//PC口4567脚设置GPIO输出,推挽 2M
1 m6 e) @/ T9 V+ X( i3 kGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;- Z3 U1 C0 V' J& c6 B1 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;7 ?) F9 `2 g9 R9 |# y. s
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
' u7 f: I* }% Y7 Z- hGPIO_Init(GPIOC, &GPIO_InitStructure);7 s* A! i# t5 P4 c1 l* {
//KEY2 KEY3 JOYKEY
2 B- q# Y5 Y6 V/ [1 }//位于PD口的3 4 11-15脚,使能设置为输入! @0 [+ w) ?& N8 o) c; R
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\
/ i! _' ?$ {9 cGPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;3 Q5 T3 z# Q% h+ z1 [" n& W6 l* \
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;# H& w5 @6 H: y2 T! @5 i2 X1 K
GPIO_Init(GPIOD, &GPIO_InitStructure);% c3 `! n( H( H1 d3 W3 e
//USART1_TX
6 S4 ?4 P" e, n/ QGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
0 ^/ N8 I% L4 s4 P" B, tGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: i$ \6 x0 {) C, D' T9 B
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
, F7 o" E. U- vGPIO_Init(GPIOA, &GPIO_InitStructure);; w0 J' ]# T; Q1 x! [1 [' W: K% D/ K) ?
//USART1_RX
8 x; b0 m3 v9 K/ K. j6 PGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;# G* c& U! C1 c$ c: J
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/ H7 z" F. ^, i# }9 I" O! {
GPIO_Init(GPIOA, &GPIO_InitStructure);
# M4 d, ~9 i, X) @9 }}. a5 f8 b0 p2 U7 F
/*******************************************************************************
* k5 t# h1 B4 [0 q$ n0 Y, ^$ o) ^* Function Name  : NVIC_Configuration+ C* b$ c4 w# W
* Description    : NVIC设置* F3 g  h) n0 _* W; G0 y; Z2 Q5 z/ w
* Input          : None
5 u5 T( L$ }+ O* Output         : None; v) J  g& M2 }
* Return         : None
/ k3 o# a% `( I2 f( Y% a*******************************************************************************/
9 q: d, d+ P+ f. S' g$ o7 @void NVIC_Configuration(void)7 N: ~, R+ `$ O' |9 N2 g/ L6 D' I
{6 }5 z" L6 b; H
NVIC_InitTypeDef NVIC_InitStructure;9 P9 u2 R- g( a6 S/ \  S& C9 J
#ifdef  VECT_TAB_RAM
! N1 f/ }) B9 q& C7 e: L# ]// Set the Vector Table base location at 0x20000000
  R5 Z! V, O6 \4 ^/ S) LNVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);- ~" j  _0 l* L/ w& H. o# G9 E
#else  /* VECT_TAB_FLASH  */
6 ]+ e% X% ~7 i9 Z2 S* F& S  e+ H5 V: F// Set the Vector Table base location at 0x08000000) d* s/ F; _* H  u6 u" O2 U
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
4 O; V2 h" j7 b4 Z#endif
$ C5 A& l: d* |. j! U//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
3 \: Z) ?3 Y# e8 @NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
' j, i" }3 @* }' s9 p//串口接收中断打开   9 [' C9 n, ]  M3 ]) }8 W
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
6 ^- A- H6 k% |9 kNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
6 ?  l5 W1 A6 l% }NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
1 D: d% c+ M1 NNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;) \+ L* @1 T0 K. i9 [) G
NVIC_Init(&NVIC_InitStructure);. W+ v0 e; w. Q* g
}+ N% n7 m4 w2 J- ~) c, Z
/*******************************************************************************
2 M" W" D9 z& A1 G( e) m* Function Name  : USART1_Configuration
1 m! I# K; Q4 K8 D5 Z8 T2 _1 m# K5 b0 y* Description    : NUSART1设置
5 O" x3 r- g3 E' p* Input          : None/ E* Q; R8 V. g$ d! v/ k( t
* Output         : None2 B/ C9 A" T" g8 |" B
* Return         : None& |) n; @8 r6 \, M
*******************************************************************************/
! _& l# `: d/ }8 u% ?void USART1_Configuration(void)
+ j8 r: U3 Y9 P  a" w& c2 I/ b{6 [. z6 D% J+ b1 T
USART_InitTypeDef USART_InitStructure;3 X, ~% L+ }- E1 x! p
USART_InitStructure.USART_BaudRate = 9600;
) g, u; D; [, I6 O: hUSART_InitStructure.USART_WordLength = USART_WordLength_8b;! V' `7 {4 W. w) r0 v
USART_InitStructure.USART_StopBits = USART_StopBits_1;
" F6 \9 @- H  c% Q- ]; I4 i4 GUSART_InitStructure.USART_Parity = USART_Parity_No;; s4 m: @4 m  L1 e2 j# r
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;& B$ R% W' O; u, y& k0 N- o* w
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;2 x- S4 g5 Z5 T7 r# M: \7 h" F
USART_Init(USART1, &USART_InitStructure);+ P8 f6 z! C$ V' g$ X4 l
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
% o8 m$ Z9 `5 c7 d2 |USART_Cmd(USART1, ENABLE);- J- o- s7 m$ U0 b
}0 e5 W; U- S3 t( `& y$ s
void DMA_Configuration(void)
$ P+ a: p& Y% I{8 x0 P* S! [* k: n  g% H3 d
DMA_InitTypeDef DMA_InitStructure;
3 n* y2 p7 h! M4 _0 a% W5 V+ |//DMA设置:4 d/ E/ ^- ^$ a+ k0 {
//设置DMA源:内存地址&串口数据寄存器地址
9 X5 X$ z+ p) d% R/ Q//方向:内存-->外设  x" j2 o: E' b' t* m/ ^7 f2 I
//每次传输位:8bit
3 d9 o- H6 _, M" j  W9 O) C//传输大小DMA_BufferSize=SENDBUFF_SIZE/ ~# F" u! P1 F+ O. q) c" v
//地址自增模式:外设地址不增,内存地址自增19 p0 T2 [, @3 s0 b6 `2 ^9 w
//DMA模式:一次传输,非循环4 k( _; H& O- `- z
//优先级:中; f! a( t; H  g3 Q
DMA_DeInit(DMA1_Channel4);3 R/ f" i$ p2 E/ q! F
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
0 }/ r, |$ o2 ^0 ~4 EDMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;- q; ~9 W5 H; }& ]. m8 [* ]3 H+ W
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
; E! a3 u6 B- x# H* y6 LDMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
1 q0 U( |- |- H% s+ ^* c- D: I% SDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
. X2 s& l- f5 gDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
) h( ^1 a( A6 |+ ]* D0 pDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;; u) q7 p. e- P( }
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;2 N; {% @% i3 Y% i
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
9 O4 H9 R: k; R* hDMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  X) f' E# w+ F1 X# z* W! bDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
6 y9 C/ B$ p  k1 H  m4 _- K" FDMA_Init(DMA1_Channel4, &DMA_InitStructure);
4 m3 V' U# ]3 D+ r5 Q& e}
4 G- k5 c$ T2 B6 j# V) m& ^$ X
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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