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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************
! a# D9 ?2 v) \* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()
  e5 O8 c" _  t* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输4 C( `/ b& A8 W8 b3 u6 B4 ~4 {( w* W
* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
* G5 u& \9 r( j) A) M% Q! K* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
! n; X' @1 o1 N3 B* A8 j. T0 x( i7 Z* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
  k3 b* e4 q% F" Y/ h* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止3 b( U' \% }8 |# H
* 串口依然发送,表明DMA传输是一个独立的过程。6 ]+ E; V2 _- {# ~$ N
* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
$ y- ]1 j* [+ y* 作者:jjldc(九九)
$ V' j% c4 x  C! K  u* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT69 B/ D' V8 ], e4 R" c1 K0 Z' H# @
*******************************************************************************/! G' W( V& y: v/ E9 ?- O2 x8 ?4 q
/* Includes ------------------------------------------------------------------*/
8 a5 N8 J& h, x; I2 p#include "stm32f10x_lib.h"2 E% \' E3 U+ W5 }% j% m
#include "stdio.h"
! b5 F0 S/ Y. s% u1 f/* Private typedef -----------------------------------------------------------*/
: J% s. o! u; |1 [/* Private define ------------------------------------------------------------*/
* M0 z, Z% N! o! f9 E9 T#define USART1_DR_Base  0x40013804
9 K+ l$ _, Y5 V' O4 a) k/* Private macro -------------------------------------------------------------*/& X1 j$ M3 ^7 \# {7 T$ A2 s
/* Private variables ---------------------------------------------------------*/
" F% f. }1 w4 c; w  u& n#define SENDBUFF_SIZE   10240- Z4 Y0 {8 H8 ^8 M  }% O# l
vu8 SendBuff[SENDBUFF_SIZE];
4 O! t! F3 ^) C# R( ?vu8 RecvBuff[10];1 z9 G; }. d  Z* B& `
vu8 recv_ptr;$ g& c# P* R2 q" }
/* Private function prototypes -----------------------------------------------*/
$ F! G) u/ A; Hvoid RCC_Configuration(void);
# m- q" F0 I! `6 hvoid GPIO_Configuration(void);+ N1 w! e- `/ H! Z: l
void NVIC_Configuration(void);# b( [0 `% H3 Y$ U
void DMA_Configuration(void);
: _- c4 Q% ~7 ^8 X  ^# Nvoid USART1_Configuration(void);
8 S4 p% N" e1 s9 P9 Gint fputc(int ch, FILE *f);+ x9 k1 R4 \2 r& h
void Delay(void);1 _4 j+ O- I3 Z6 k: W
/* Private functions ---------------------------------------------------------*/
: }$ k+ R. H  K8 L  y/*******************************************************************************
- O! s& P2 i2 x4 D8 I+ I! |- G* Function Name  : main/ v; s: E' \4 V# h2 N" D+ y' V
* Description    : Main program.
0 }8 f$ k+ J1 z3 L; X: P* Input          : None' P  y: V- ]) F# {2 `
* Output         : None- h: k+ Y8 _# t/ }& o3 e& {
* Return         : None! ^$ N4 }! J% B$ O6 t, y& U  {
*******************************************************************************/1 \: V8 u3 F! O1 ^8 W. t3 I: P
int main(void)- M1 Q% x# b! i+ h
{! a' N; e- A% `. U; _9 ?& G
u16 i;0 F6 F& H7 x) g7 O2 k* I9 N
#ifdef DEBUG
6 B1 H9 ?% {" J$ ]debug();* k7 R4 Z/ k1 V$ a
#endif
, [0 p3 E; _; n3 E+ ~recv_ptr = 0;& `! ~- i2 K1 k) L* }+ o) `! C
RCC_Configuration();; \9 m8 F. e1 w  I
GPIO_Configuration();! P4 y& ^* W6 T3 p) J& e
NVIC_Configuration();
7 {* {* L* E2 j' s2 z! ]8 ~8 EDMA_Configuration();
8 x8 d( z3 _  V/ G  A- c( LUSART1_Configuration();
) x, i/ p$ O8 C0 N$ c- E4 F7 Kprintf("\r\nSystem Start...\r\n");
0 J6 C( `. U$ qprintf("Initialling SendBuff... \r\n");
. v/ k3 \$ g* mfor(i=0;i<SENDBUFF_SIZE;i++); U  v: T9 u- c/ |4 |% ]1 ]# e: @
{
9 i$ l, u4 o- k/ nSendBuff = i&0xff;; Y; i& E) Q" u" {( t6 t& o
}8 N  V: O, Q# E1 k' {1 f- y8 y* k$ K
printf("Initial success!\r\nWaiting for transmission...\r\n");: I3 A  Y& \  B& |8 O6 e
//发送去数据已经准备好,按下按键即开始传输* F1 o7 _) E4 b: A, D9 W  B
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
( x3 G5 m5 v9 N. [printf("Start DMA transmission!\r\n");
- u7 j$ J9 ]1 f0 _3 {9 H//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
" G6 l4 [" m. gUSART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);$ ~* m7 d% p6 ~! O
//开始一次DMA传输!2 t8 A; v8 j) e7 H* l0 ?
DMA_Cmd(DMA1_Channel4, ENABLE);) }9 {1 T# l5 q6 P
//等待DMA传输完成,此时我们来做另外一些事,点灯$ d, K9 u8 o6 V0 f
//实际应用中,传输数据期间,可以执行另外的任务* |' d1 Y+ [, H+ K
while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
: }! Z8 o5 E0 ~" U0 ]{; [8 T& d& R  Z2 P* I; S7 L3 Q
LED_1_REV;      //LED翻转
- f9 [2 c. `  |. J6 FDelay();        //浪费时间& @" w8 ]' f8 \* Q" ~9 s& A3 d
}# P* Y5 P$ N& H/ Z8 ^5 P
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭8 Y4 M! F' `7 u. ]% }) a8 _
//下面的语句被注释7 e+ P! H1 L/ g- S8 b/ v
//DMA_Cmd(DMA1_Channel4, DISABLE);
% h( C  B. D+ \- K5 H( U  a. k& nprintf("\r\nDMA transmission successful!\r\n");3 _" P( v9 @5 j; t
/* Infinite loop */2 p: z# T& v- R$ A: n9 c$ T
while (1)2 I- a* f1 @7 @
{; E$ y6 k+ [" k2 A# v
}; B! ?2 B7 Y* T
}. c! N+ r, D- Z: V
/*******************************************************************************2 j' M& `+ a+ @+ Q- t0 a
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)+ c: f  b2 |4 n$ p
* Description    : 串口发一个字节
: @9 B% P1 u% U- Q  _# Q6 e* Input          : int ch, FILE *f1 J2 x- f# E' A9 j! U
* Output         :6 P5 [6 t2 B8 L% i+ o1 \  w
* Return         : int ch
9 T5 Q5 C; w6 I# ?( \  f; [* 这个是使用printf的关键- z2 D  |0 k" T0 T2 T% ^
*******************************************************************************/
) N+ x4 R" r+ hint fputc(int ch, FILE *f), ~: |9 ^5 O4 G& L, }
{$ X( \* I7 w) _7 _: T1 m% X
//USART_SendData(USART1, (u8) ch);2 h( Q3 R2 F- x, v: V8 f: o! J$ ?3 G
USART1->DR = (u8) ch;) p; c! C( j7 t. A4 \" U& g- E
/* Loop until the end of transmission */
# d" K0 q3 N: @" Ewhile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)0 @+ t3 `4 w# S; B  `* \3 y: ]
{
, |- ^/ D. s# U. D}
5 {/ e4 a9 F" Z, J5 @2 m% P7 A5 freturn ch;0 H2 G, Y. R8 R$ o6 c( h5 o- \
}/ M$ l" y$ z' M8 @8 Y& Q. V  h
/*******************************************************************************0 w8 k% g: ~; e, t' r9 p$ r7 O
* Function Name  : Delay9 E; W. R2 ?. x2 t- e$ E4 P, z+ R( P
* Description    : 延时函数
. H. v3 o) L. U/ {9 d' ]* Input          : None
* o  z3 n$ v) q5 F/ _! p* Output         : None$ ]. C' j: v% D
* Return         : None' b4 V9 c1 ~* G/ R- B7 H8 x% |
*******************************************************************************/& x  l, D/ ?- [5 r$ H5 X; G
void Delay(void)
. |. \9 f: m' K6 W9 P{
9 h3 u- L9 n# L2 c. ru32 i;
+ R! J* z4 ?7 \% o& _for(i=0;i<0xF0000;i++);
# R7 g) O. D. W# P- a( {return;
. ^7 a5 }6 }" b, o}
) p# ]# Z2 i) d1 K* W/*******************************************************************************  e( |: T1 V4 ^$ i
* Function Name  : RCC_Configuration
2 [% A3 j3 e$ R" L' T8 A- T6 w* Description    : 系统时钟设置
/ y: A9 d+ q: q6 d; q* r* Input          : None
1 w& u4 x9 E3 J4 Z/ @$ X* Output         : None
0 g# F, v- W( @" A0 L( q* Return         : None
6 Z' u2 U, R8 d1 _' m& j$ S( k*******************************************************************************/0 S( c: Z$ l7 ?6 k' f: ^4 @7 r
void RCC_Configuration(void)
! ?0 h$ l0 p- Q5 X) |; u% u$ }{
2 H# T: E. E$ e8 y; YErrorStatus HSEStartUpStatus;
) v' R; [! R4 ?' {4 K//使能外部晶振. D4 x. H7 S1 v: s& T
RCC_HSEConfig(RCC_HSE_ON);& D3 U% o, a, O0 k/ v  h
//等待外部晶振稳定; b' g, v+ k6 s7 q
HSEStartUpStatus = RCC_WaitForHSEStartUp();+ F1 j3 u, f9 z, I# k% T
//如果外部晶振启动成功,则进行下一步操作8 U/ L0 W5 M0 z$ E# d
if(HSEStartUpStatus==SUCCESS)+ w" d$ b" @: t4 Y, j  v! {
{
6 x: \: I$ K* q8 Q1 t. m( m: b! i$ I//设置HCLK(AHB时钟)=SYSCLK+ [: x& m" x6 L- B$ d& M4 D
RCC_HCLKConfig(RCC_SYSCLK_Div1);% G4 x) c% n3 S+ U! p- y
//PCLK1(APB1) = HCLK/2' o+ K4 O2 i( U, o$ r* Y) t
RCC_PCLK1Config(RCC_HCLK_Div2);
7 E4 b; F4 o7 n. A3 d//PCLK2(APB2) = HCLK
; y# j) u) N' w0 qRCC_PCLK2Config(RCC_HCLK_Div1);
5 ?$ B4 M+ e% U* ^6 {- i" k  z//FLASH时序控制5 I. i3 q0 }& D- @+ h
//推荐值:SYSCLK = 0~24MHz   Latency=02 c' F+ B% b: u, C# f
//        SYSCLK = 24~48MHz  Latency=1" n, q# J, b& `3 `# y0 ^& I
//        SYSCLK = 48~72MHz  Latency=22 h' q4 m( T) S& b6 E& {
FLASH_SetLatency(FLASH_Latency_2);- M5 B6 q1 w) J
//开启FLASH预取指功能9 r' |+ Z7 t% b2 _- y9 N
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
) c5 c5 k8 o) t, r9 E8 \3 _2 [' C//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
/ F9 s% M: k* X$ I2 ORCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
9 c1 i' Y/ r( Y1 A//启动PLL
, Q" Z( B# |6 a( P3 W& ^RCC_PLLCmd(ENABLE);
; f- K, U( {6 P. O* A" L, Q8 D% s//等待PLL稳定* y0 p3 d: M/ @- l# m6 S
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);- |# }) ~) @* L" j/ R' Q2 x4 C- E* g
//系统时钟SYSCLK来自PLL输出* D, J. X0 _1 k+ z4 r! g8 K9 `( r
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
9 G' L1 e! Z) J  A& i//切换时钟后等待系统时钟稳定* y8 G# q# h6 _$ _- Q; S! e
while(RCC_GetSYSCLKSource()!=0x08);4 U  a, [+ z1 a2 ~6 [' R
/*( ?. U+ F3 U5 {4 C2 a  x& _. E
        //设置系统SYSCLK时钟为HSE输入
. d" x6 ~, t( {        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
4 g: T2 Z4 Y4 K) O( v4 d6 e2 ^        //等待时钟切换成功
; d1 p" f# z7 m. S        while(RCC_GetSYSCLKSource() != 0x04);
9 ]: I) ?7 y' g. R# I; V2 _7 [        *// [, c. A2 h, W
}0 P9 _: g) \2 b* Q3 b
//下面是给各模块开启时钟
; H; T- }' f( b8 ?/ S% ]" A+ D/ i//启动GPIO9 @: Z) K: R! ~
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \. _6 i9 y2 q7 l% h7 K
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\1 u; y' z# f, {/ I5 ^
ENABLE);$ `1 j% u2 f- ?' z( H  x  b# }
//启动AFIO! t- I5 C  g7 k5 t
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);' W5 H6 M/ A% u2 a- S8 a
//启动USART1; ^# W+ {* f/ K* J2 W$ i/ W  O2 Y
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);7 {8 M3 w3 H( c9 g: s2 O( k, v
//启动DMA时钟
# c1 v8 L+ n/ r; _1 k. m* \! CRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);* D9 S! _5 a2 b! W' i5 Y
}6 G! i, ?, N& \: {* Y% y
/*******************************************************************************5 B& x% t) }) f, _  w' D+ a; [4 P
* Function Name  : GPIO_Configuration
3 ]6 H# p: e0 B. R8 y5 n- q: y: V* Description    : GPIO设置# D& }' m$ ^- ^1 b4 N! Z$ q. z
* Input          : None
  [9 B9 m3 _/ z, _* q2 m8 R* Output         : None
; b, m5 E% T9 s% r! H. a7 W4 d* Return         : None
8 j5 T+ m5 r0 K, E) V: U, u*******************************************************************************/
! N9 u; b* |  T: kvoid GPIO_Configuration(void)
7 D6 @: O; n5 R8 U5 t{
0 d- M7 f3 ~8 wGPIO_InitTypeDef GPIO_InitStructure;
! ?3 t/ n- p+ x$ C//PC口4567脚设置GPIO输出,推挽 2M0 e: o  t- n1 U7 _
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
/ D4 w: G/ }8 b  Q4 _7 UGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;2 s1 s, Y7 M5 R+ [6 Q5 J
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;, C7 A1 O/ h0 C* f
GPIO_Init(GPIOC, &GPIO_InitStructure);6 v' n- a  Y# Z1 g) B
//KEY2 KEY3 JOYKEY: s: G0 a9 j3 u
//位于PD口的3 4 11-15脚,使能设置为输入
% S" P# u, ]6 X6 _3 Z- QGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\
$ g$ I9 A* C+ RGPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
/ c2 {: x6 M7 Q9 \& d; [* yGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
& b1 h6 n9 n. K" P9 Z( _: |% B/ ^GPIO_Init(GPIOD, &GPIO_InitStructure);% O/ P5 V9 R% [) v
//USART1_TX! o0 L& W2 W9 o) k8 o+ X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
: Z% G, I' l9 S& b7 ~% P6 |7 pGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4 O" T2 k- [, ]$ {' j( zGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;0 l4 \7 y6 Q2 H# ^( o6 x6 L
GPIO_Init(GPIOA, &GPIO_InitStructure);
$ R3 A: ~$ v. Z6 \/ B1 C) |% ?//USART1_RX% T5 {$ T) H! ]* j7 o  z/ p* }$ F
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;% s( t* D$ I; c& ~
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;6 [$ n8 |: g" A# h# D6 @1 o! c$ C2 _
GPIO_Init(GPIOA, &GPIO_InitStructure);2 l' X( o) Y: Y0 x2 ^! x
}' Y7 Q# ^8 j, }7 k. N
/*******************************************************************************
# N! y# D$ c9 N4 Q3 X& r3 |* Function Name  : NVIC_Configuration* Y; j% P; D) [! x
* Description    : NVIC设置
* E% b6 Y  A! v" l' j0 Q3 {! H* Input          : None- }+ H6 {: H  ]4 E* ?  `
* Output         : None, p1 ?. ?1 C# q6 T* |9 F
* Return         : None
8 C+ K! R5 v. E*******************************************************************************// Y! K" J& U0 A+ D
void NVIC_Configuration(void)
2 a0 ]5 F- Y( o, L9 Z{7 k- |$ C% h( O6 F0 B
NVIC_InitTypeDef NVIC_InitStructure;
( a7 y( H) `9 S6 m#ifdef  VECT_TAB_RAM
' a: {! P% z- J1 x! N! ]" ]/ C) G// Set the Vector Table base location at 0x200000004 x& |% |1 e+ _0 y$ Y% R# O& b( g7 {
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);4 ]7 t, q  L% c; ^1 R8 Q+ i: `+ j
#else  /* VECT_TAB_FLASH  */
, v0 N9 p' D% v1 a// Set the Vector Table base location at 0x08000000
" J* k: p' \' Z, q: C# qNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);1 w# q( T2 c" I  u2 t
#endif. f3 w  k3 k0 a" I3 i3 V. E
//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
4 S8 E" v0 R. m1 G# d. ]# e/ q& TNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);$ Y1 E( e! m1 Q$ j) q) J
//串口接收中断打开   
" w8 y# W. w+ M0 S7 y- S% B5 [, `5 ENVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;0 F4 c5 J4 O; I5 ^/ m1 t
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
, g$ Q+ D% C' ~3 L! W3 j- VNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
% ^- u  e4 ^2 z: C" J5 xNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
; m$ L8 p/ J- q. Q0 E5 hNVIC_Init(&NVIC_InitStructure);, r  r2 d7 Q. d" c9 Y
}
. M! O3 N" Q8 Q5 L  s/*******************************************************************************
5 [9 ~' ?7 @; r3 {6 X* Function Name  : USART1_Configuration; |1 P0 Z9 F( _; M9 B4 v: _, |
* Description    : NUSART1设置
7 |& G8 z* f: p7 q* Input          : None1 C( Q* ?9 E* F8 v0 M/ X
* Output         : None, y; m- y7 j" U8 a0 J5 Z- b
* Return         : None
$ p" F! |& y) I$ `' V7 o" P; ?, c  e- u*******************************************************************************/  C, F8 e( n7 J$ g  F
void USART1_Configuration(void); ?" H9 ?2 G' V$ t
{
. P" m5 z0 H) P3 _- y! wUSART_InitTypeDef USART_InitStructure;
, u: z! U. [0 h; |7 {, GUSART_InitStructure.USART_BaudRate = 9600;
6 x! v8 e) x% m1 u# m& ?* Q) a& GUSART_InitStructure.USART_WordLength = USART_WordLength_8b;) h3 v0 J/ _+ t& g& ?3 s3 `$ l$ g
USART_InitStructure.USART_StopBits = USART_StopBits_1;
# {$ t4 t$ C' \& r2 lUSART_InitStructure.USART_Parity = USART_Parity_No;
$ Z- {6 i7 @2 T( b" _& ?( FUSART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
1 i8 s0 O% x7 J5 V& H$ MUSART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;5 d$ F* k7 ~; k0 z% u9 M
USART_Init(USART1, &USART_InitStructure);5 O. J( R& d% g/ @9 E
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);3 b2 @5 v' X$ T# F, K# A
USART_Cmd(USART1, ENABLE);
- |# `: M, j, u; m# @* V}5 Y5 W; D2 S% K% [; e
void DMA_Configuration(void)
$ ^3 W" W* |5 C1 Y  V{
& D. P1 K* |& M% C) Q3 l( pDMA_InitTypeDef DMA_InitStructure;* I+ b, p/ Q- ^+ z- N+ ]9 C9 o
//DMA设置:
9 S# G" E. t5 b( l//设置DMA源:内存地址&串口数据寄存器地址7 d) a" v7 x; @. h7 h: S0 I0 l" {
//方向:内存-->外设
) c! b$ K' p. w7 w0 I: d//每次传输位:8bit
& c# e( c0 G2 ~% E! d5 U//传输大小DMA_BufferSize=SENDBUFF_SIZE
' q, Y& B" C: u6 a//地址自增模式:外设地址不增,内存地址自增1
. T3 u# i- l) Q3 Z* K//DMA模式:一次传输,非循环
$ b- \: U0 T' C9 F9 V: m  m% u1 K//优先级:中; h* m5 o) w6 D+ m$ Z
DMA_DeInit(DMA1_Channel4);+ V- N, d* U) U( K
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;1 p: n. O/ t4 Z5 `3 F
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;1 n1 g( l7 `! S: e( [
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
* X4 [5 G! M: D/ u, C2 j; b% X+ YDMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;, Q) \# ^+ l3 R& a2 f; i
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
7 Y1 }6 A+ d, l1 d0 B: wDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
% D, A- C3 C9 S8 E" G$ ?2 z: ]8 fDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;$ k1 Y# ^. J2 Z* ?/ E5 I' @& m  W  P
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;! I* J2 t% L* d) h! x4 K! Z) Y
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
) ]5 l$ ~5 U- Z) |8 |: H6 KDMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
8 U) H2 g/ [- s7 D* N2 S6 Q4 oDMA_InitStructure.DMA_M2M = DMA_M2M_Disable;4 p1 I0 F! }/ K- T" R
DMA_Init(DMA1_Channel4, &DMA_InitStructure);: I0 @7 E% V  _, I+ b3 z7 V
}+ J, s5 W2 s, s; |3 u
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版