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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************
; d0 Y; }9 `. A* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()
% v5 J6 {  e# g0 @* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输- W  f5 f% _. X. e( J  E8 p, C
* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,7 ~, G! T: K  m. U3 O
* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
2 N. ~6 E6 a+ G, [; X( O+ R* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可" G6 a; S- b6 `/ [. a. u( h- S5 `
* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止
4 `, B3 Z7 |. ?% Y9 l3 B. R* 串口依然发送,表明DMA传输是一个独立的过程。
/ {& U6 n2 x; }" X6 d# a$ Q/ q* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
5 z* e" k5 I& e8 s8 |* 作者:jjldc(九九)
" h0 I$ F( T% M$ @, Z, s4 u3 l* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT64 t$ _! l) Q6 m8 G) K7 d& r
*******************************************************************************/0 _: A& \9 @. _; x
/* Includes ------------------------------------------------------------------*/
. T6 [1 O0 p* t- n  k#include "stm32f10x_lib.h"* J7 ]* H9 x" e- Y% u
#include "stdio.h"/ s3 A9 K* I' J. k( _& {, ?- G  _2 Y) ^
/* Private typedef -----------------------------------------------------------*/
; {; N0 s, Z& b( R. V0 {7 {- s/* Private define ------------------------------------------------------------*/
- @' P* }7 q7 }4 N* x#define USART1_DR_Base  0x40013804. W% e8 ]; v$ J! r% T" C
/* Private macro -------------------------------------------------------------*/" J1 c9 W# I8 A. S! l
/* Private variables ---------------------------------------------------------*/& P5 `" N/ ^) u' j
#define SENDBUFF_SIZE   10240
5 W1 f! F/ Z5 f/ n' a. F7 |vu8 SendBuff[SENDBUFF_SIZE];
$ B" l: v7 o1 {3 c4 m& X1 t0 Bvu8 RecvBuff[10];
* |7 G1 X. k. Qvu8 recv_ptr;
4 a. h. Z8 x# ]9 K( V/* Private function prototypes -----------------------------------------------*/
1 E' v5 P7 I5 y# M- \void RCC_Configuration(void);
* W! i5 R) E- U" z; mvoid GPIO_Configuration(void);, H, S) _, s% C6 d( v: ?4 q
void NVIC_Configuration(void);6 H- A& z- E- ^/ P( i  p6 L2 ?  p
void DMA_Configuration(void);9 X  B. `* F% m5 `9 @$ F. e3 _, E
void USART1_Configuration(void);
8 m5 E# U/ P" B& T, R3 F+ h0 l* Oint fputc(int ch, FILE *f);( e' t6 ]0 c0 s/ N6 ^# D
void Delay(void);/ ~- e! m9 H4 B* V) X
/* Private functions ---------------------------------------------------------*/
/ K/ ^; y* Z; R/*******************************************************************************; r7 p! Y% p/ c. M/ f, s1 {" }
* Function Name  : main
6 j5 `3 V% ?8 f- o* Description    : Main program.
' f! o) V# ^$ ^+ D* Input          : None
4 D, g* U5 ?) [% l; E+ f- c0 X* Output         : None- S( N3 m9 ?2 p9 t7 K, [( V
* Return         : None  g% D1 x, h4 n! v& O
*******************************************************************************/
( y6 L' L! Q9 x5 G; f# _3 p" zint main(void)
; d4 z3 E2 Z5 b  ?! H, z4 L" I{
& I% c1 J. [+ c9 M$ U4 t" \u16 i;
5 \7 ]: n2 ^4 @7 a#ifdef DEBUG
% T; U8 l* s+ Q* y. G* A0 Q& Ydebug();
1 S% L8 V' f9 E3 m1 D8 I#endif
$ X* t0 T( n% G. d1 C; h: jrecv_ptr = 0;
, d0 w, @+ v3 u2 [, Y7 f5 }RCC_Configuration();
1 ~2 [/ g+ Y. ^0 C# Y; q9 oGPIO_Configuration();3 C1 r" W- U5 r( k
NVIC_Configuration();
$ D; ~8 k# G6 U$ T, oDMA_Configuration();
! v; O. N/ P+ w) GUSART1_Configuration();
' e0 V8 s! I. `# Y- nprintf("\r\nSystem Start...\r\n");4 Z! ^3 d1 d( _% X
printf("Initialling SendBuff... \r\n");
& L& T; U/ j& H7 ]7 ufor(i=0;i<SENDBUFF_SIZE;i++), M( p, G& ^6 N- }, q& G9 Y
{
6 y5 L7 U. d2 W5 y6 fSendBuff = i&0xff;
+ \: k' w3 T" }8 ~% U" B) n, C}
2 G) a# k( C9 P8 b8 Rprintf("Initial success!\r\nWaiting for transmission...\r\n");( ^* r. |" |4 N8 C
//发送去数据已经准备好,按下按键即开始传输
! }2 O1 u+ c, j0 {3 nwhile(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));  x, w8 L3 p' c( M$ D1 }4 ?
printf("Start DMA transmission!\r\n");! Z2 N1 ^) y; X  }. h9 _$ @
//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作7 W! O2 I# Z0 p. Q/ j
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
8 j: G- g) l+ e8 f1 s2 P//开始一次DMA传输!# F. D3 S/ n- f7 g" j
DMA_Cmd(DMA1_Channel4, ENABLE);4 h6 d" h: C4 z6 I/ K' I
//等待DMA传输完成,此时我们来做另外一些事,点灯
# R  g3 m5 T" c. P//实际应用中,传输数据期间,可以执行另外的任务- j) f0 \0 h3 T7 a. i
while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
' Q, a4 _0 f* U# h$ A4 d{: L& s0 p$ W0 q( K& M. Q) q
LED_1_REV;      //LED翻转
, o& w- }0 d- q  r* ^Delay();        //浪费时间
. A( Y) J. b; S+ b. C}$ a2 }2 K: {( L5 e* S! }0 B1 q
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭
2 z% i7 `4 }0 ~//下面的语句被注释& \& ^, l1 X1 M1 P
//DMA_Cmd(DMA1_Channel4, DISABLE);7 y/ p. K; K; W- R# y1 z( |+ T8 h
printf("\r\nDMA transmission successful!\r\n");
% r7 x' O2 {8 v: p0 `5 U% r+ C/* Infinite loop */
# A+ g/ Z) t$ y( J0 o! T& Pwhile (1)5 K: [+ A9 ^) ^! f; {6 J
{
; x+ B8 N% k2 N}
% w& ~% j' \6 b8 f}
& H7 q2 N' f2 W# O/*******************************************************************************
) C3 k) O# ?9 A0 h* q- ?0 V3 ^* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)
0 x1 S$ |  w) x! o) U3 o0 k* Description    : 串口发一个字节6 T, P: f. P$ q
* Input          : int ch, FILE *f5 p  ~0 z- N: O9 U
* Output         :* C$ G2 H: y! P
* Return         : int ch
6 n( }8 F5 C3 S: v  _/ s: @* 这个是使用printf的关键: W0 w( ?( }5 m* f) }6 R  W
*******************************************************************************/
8 D8 [7 M# @+ eint fputc(int ch, FILE *f)
/ c: W% K0 v6 w2 ?; F: e) z{
% p5 h4 K* f7 Q  I  u0 U9 O3 i* {//USART_SendData(USART1, (u8) ch);
" Y+ h2 f- |! x" E+ y4 p; C- ~USART1->DR = (u8) ch;
( c" G. z, l. f: [  P) I/* Loop until the end of transmission */) V9 m  u" `3 }1 K
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
( c0 c/ {8 ^2 ^& j{7 p: j- C/ C4 ~; j
}
& ^" j/ j6 z, ]. ]/ Wreturn ch;
( D6 ^. U$ t$ C% I  O9 h}
& j/ h, K( u) |! z2 o' l) D/*******************************************************************************
; t9 T: v* g5 |  W5 ~5 V$ L* Function Name  : Delay' a2 h. {8 w) K( S4 M5 m
* Description    : 延时函数
' Y- M. ?* O) e# I, R, k* Input          : None$ j  h! g5 w4 s, M" `
* Output         : None
/ \. X) z5 J7 F6 Y5 E9 P* Return         : None3 W; [" ?% i, |$ V' D( }5 B  A
*******************************************************************************/* g6 y- T- ^2 R
void Delay(void)
, y) p0 t: U3 }' G+ s) C{
& J: B* E7 }6 {+ C& cu32 i;9 v, p2 K% M2 G
for(i=0;i<0xF0000;i++);4 v( O) x" }  t1 X" B) ~4 [
return;# p5 O0 F; x# F$ H- f0 S+ R' w% U
}! l% u" J4 }, F  F
/*******************************************************************************, t" Y$ l% ?' e$ o
* Function Name  : RCC_Configuration3 ]% o# H9 y% _. L
* Description    : 系统时钟设置; r0 O3 E* [$ ]! S2 l5 h
* Input          : None
1 q/ k5 y/ T6 l/ m; I* R* Output         : None
7 K& o! G; K+ m$ z" L. n# I* Return         : None
$ c+ B* {! i3 [# q- m, C6 h$ I: C6 I/ o*******************************************************************************/
" A: t; F: z* D; c3 v5 q/ m9 O# b3 Cvoid RCC_Configuration(void)/ p5 Z( p, E) |: C0 E& \
{
% i4 x8 j$ O" r, V- z8 FErrorStatus HSEStartUpStatus;, m- c0 L9 E1 `6 h$ }
//使能外部晶振
( v& {, w4 u/ |8 C) eRCC_HSEConfig(RCC_HSE_ON);1 U' r' ^% a2 E
//等待外部晶振稳定
! f2 k6 I6 x* m" V# V9 VHSEStartUpStatus = RCC_WaitForHSEStartUp();* h: K% A, y/ ^( L- b$ g
//如果外部晶振启动成功,则进行下一步操作
# `0 k2 J( q$ P4 R% n) ]if(HSEStartUpStatus==SUCCESS)
$ w! b. H0 @' i8 g: I( Q- `, O) Q{: x! |: x6 F& M% w
//设置HCLK(AHB时钟)=SYSCLK
& K$ j* {3 c4 T! F& MRCC_HCLKConfig(RCC_SYSCLK_Div1);$ R3 B" ~! B% D2 \% O6 ^
//PCLK1(APB1) = HCLK/23 Z0 _; K9 Z/ f0 U! d
RCC_PCLK1Config(RCC_HCLK_Div2);. M6 @7 X- {; e5 O/ N8 k$ t7 n7 S
//PCLK2(APB2) = HCLK* |- B  ?) R0 h) w
RCC_PCLK2Config(RCC_HCLK_Div1);: w, z8 r1 v& u4 z# v
//FLASH时序控制0 ?0 j5 x, i" u8 `% M. }
//推荐值:SYSCLK = 0~24MHz   Latency=0
  \% r& m; K# Y: S//        SYSCLK = 24~48MHz  Latency=1
& ?0 L6 d: U& q! h( t% e% |  y5 _//        SYSCLK = 48~72MHz  Latency=2
5 P; k& a6 X! c# n3 [$ BFLASH_SetLatency(FLASH_Latency_2);9 f9 o# I2 M: j9 z- B' H" ?+ u
//开启FLASH预取指功能, b( @) G1 x& U( j- q* [7 T
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
3 T: `3 C! d) r  D+ K//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
- G; n$ b* H: g8 J( p! {3 qRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
, h' S) m9 u, R4 C2 |//启动PLL1 @2 K( d4 E& {( }% l8 I3 j
RCC_PLLCmd(ENABLE);
- [: |# l/ b! g0 n- t1 B//等待PLL稳定
4 O0 j, n, k+ Hwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
* X1 R- Z. d* {, ?/ M7 q//系统时钟SYSCLK来自PLL输出
/ _* v& v$ j2 o3 B5 {1 T( g8 p# X  SRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
6 A( F, j  W( h( E//切换时钟后等待系统时钟稳定$ i9 W% ~5 a. C
while(RCC_GetSYSCLKSource()!=0x08);8 v5 D5 g/ `' y
/*# x1 E) G% Q# r" v
        //设置系统SYSCLK时钟为HSE输入
, \6 |. x, s6 Y7 {        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
" p  C/ K9 ?6 b$ _& |& i        //等待时钟切换成功
) c$ q# T5 E" a6 s' |. I        while(RCC_GetSYSCLKSource() != 0x04);
5 m6 d7 h) g. L; w' ^        */
1 i; K+ J; i- |+ x% I4 K! ~  s}) t3 E( b$ U/ T) }. v% d0 Y
//下面是给各模块开启时钟
" v( t, F# M- n( N% N//启动GPIO
" `; V2 b* Z0 ~RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \9 i- x4 u) x' T/ B6 `
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
- Y" r" g/ ^" X% rENABLE);
: l, q5 \0 h( \7 ~//启动AFIO
( A4 o3 G. M' f+ g) |: W, ^RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
8 R- h8 Z( s' D/ X/ R//启动USART1
$ }4 g- q) U3 r1 QRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
6 G, k0 ^# w1 b& @//启动DMA时钟
, c' \0 y7 {4 o  b8 a! ?3 `RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/ t' N6 F0 j3 }: `$ m
}
* k. }/ }' P/ \/*******************************************************************************
$ Q3 ?: `# @9 ]* s- Y* Function Name  : GPIO_Configuration) w0 `6 B. T4 n1 V
* Description    : GPIO设置
7 M1 x/ c- E1 m* Input          : None
& ^) D" B+ |: @1 {" `* Output         : None
: }' N. [$ q/ _5 |3 H; O! W+ {* Return         : None# l; z' E4 D3 b! P" g  N* X
*******************************************************************************/
. ?* h9 B4 e( D) Q+ mvoid GPIO_Configuration(void)
, R7 q0 X: s6 `3 Q{
6 b& @( V, f6 u( i4 x5 nGPIO_InitTypeDef GPIO_InitStructure;
: P) x9 i2 ?7 e# M- n8 M1 z4 G//PC口4567脚设置GPIO输出,推挽 2M
& r4 B5 M) n8 w) i  Q3 k7 rGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
* Z, P8 V% }  G) QGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
3 h% L: M' C# Z2 r) b' _GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;5 H% r- Z0 I" k8 Z
GPIO_Init(GPIOC, &GPIO_InitStructure);5 x/ I8 a: @# A
//KEY2 KEY3 JOYKEY
2 j& I  p7 D. g//位于PD口的3 4 11-15脚,使能设置为输入$ T; r8 u! k' A: H" Y3 O4 H4 o
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\
2 A7 P; c* E# r' q4 |& o8 WGPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;# O+ q8 }1 g8 L" u0 H2 J+ ~" x/ W1 U& {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;8 Q7 G2 |/ I2 h0 P
GPIO_Init(GPIOD, &GPIO_InitStructure);
. b: R( f4 R/ R2 W7 P5 @//USART1_TX
+ u. F6 Q' E; lGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
& O3 K9 t- J! k/ jGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& ?& L8 G. ~% ^5 \6 ~/ ~& |+ ]( qGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;( I, v$ A  b- A7 c
GPIO_Init(GPIOA, &GPIO_InitStructure);7 J' e) N$ N! E
//USART1_RX( v" _, u& Z2 i1 c
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;+ X* x; ^3 F# O! `2 ^. C1 N$ `
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  v6 q9 O# l; ?8 [
GPIO_Init(GPIOA, &GPIO_InitStructure);
" c1 J2 ]& U4 y% w1 c, x}
* U; c4 }% s; \' s4 K# R/*******************************************************************************
) r3 H$ V: o9 c+ `7 Z* Function Name  : NVIC_Configuration
$ a0 C& d1 T3 X, I3 u* Description    : NVIC设置
5 |) o! c1 D# `" S5 @* Input          : None; J/ ~7 y1 P; O. O3 a; \
* Output         : None
5 Q0 [5 A  g4 ]/ k( M. p8 Q" q  [* Return         : None- }+ M# N; Q, N9 `! X: u9 U9 w! V
*******************************************************************************/' y( K" A) s1 X7 {. H) o9 P' R
void NVIC_Configuration(void). s) n. Y( \7 {- Y3 R
{
0 d: c( M1 h+ h# \+ N( P3 {NVIC_InitTypeDef NVIC_InitStructure;
8 }1 ~8 `  i$ _" L6 R' p& A#ifdef  VECT_TAB_RAM
' O+ r( G. C9 u% ]// Set the Vector Table base location at 0x20000000& u" `9 G6 n6 J  J
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
' F1 N6 M- z/ e9 E0 F& }#else  /* VECT_TAB_FLASH  */
& n5 Q+ P. R# _// Set the Vector Table base location at 0x08000000
* i$ Z0 s+ M. aNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);4 W+ K) |) Z9 L) f# N
#endif
2 `! [- H1 Z, W, {9 {5 t$ D# H! J//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
- i4 U7 o9 `2 z' \$ Q) KNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  F9 z3 c" I: p$ L+ c* s3 j- T0 a
//串口接收中断打开   
: e( z* b6 \; k0 M+ d4 U  NNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
& A6 K" Z" {: hNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
( u, l  ~3 q" H+ _+ VNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
( |; M& n" o0 B" O1 pNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
9 H3 @* }  \# h( {" w* MNVIC_Init(&NVIC_InitStructure);
. E  `! r! W- T2 J0 @, `9 A}
4 V/ ~; d; ~& s/*******************************************************************************0 t) S6 j" g& C" M( F
* Function Name  : USART1_Configuration
( H' k& w; p# K) B! E; h- j5 W; c/ e* Description    : NUSART1设置
9 K7 [/ V; k$ l: ?, u: E- M' S+ D/ H* Input          : None) r' Y" j1 z) j' ~8 Q
* Output         : None
2 S# v$ |* Q! I+ w5 K* Return         : None
" X; s" p+ z3 }3 C6 |( i$ ?*******************************************************************************/
' \; B6 x  `7 \. g5 J% t1 W& P2 R( _2 Avoid USART1_Configuration(void)
% o) t" Q# x* \{
$ q7 U# E# G1 s' t7 kUSART_InitTypeDef USART_InitStructure;' {) a+ ?9 i  L# [" [4 z
USART_InitStructure.USART_BaudRate = 9600;' Q9 H6 g0 |0 D
USART_InitStructure.USART_WordLength = USART_WordLength_8b;/ z; ~* r% c5 W  ?
USART_InitStructure.USART_StopBits = USART_StopBits_1;
2 Y. B! {: k# y4 p# OUSART_InitStructure.USART_Parity = USART_Parity_No;
& n7 K$ C" y+ M. l0 N0 ?USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
4 v! e/ }% {5 @' e* K( |USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;2 k8 ?+ Q2 [& x* D
USART_Init(USART1, &USART_InitStructure);
1 |3 r/ `  I+ MUSART_ITConfig(USART1, USART_IT_RXNE, ENABLE);& |& P1 C2 ^* d2 D5 H' g
USART_Cmd(USART1, ENABLE);
* {& x# X  f' j( y+ B/ Q}: b' a( V% ^, c1 _" h% l$ e( X) K
void DMA_Configuration(void); Z- H8 A& F% `$ U( w3 w
{
* g: o2 V- u4 W0 a( @DMA_InitTypeDef DMA_InitStructure;
' O. h# ]+ p; s# N- E, T//DMA设置:
1 \: @. T3 ]" a8 {0 N//设置DMA源:内存地址&串口数据寄存器地址
+ y/ ?2 k4 J& _% H//方向:内存-->外设
' F! o4 z& M$ [//每次传输位:8bit
* D; A; X- T; x//传输大小DMA_BufferSize=SENDBUFF_SIZE* X) `) l0 ]2 k. l/ m
//地址自增模式:外设地址不增,内存地址自增1
9 l$ r1 C5 [( _3 {  ~5 ?//DMA模式:一次传输,非循环
5 h9 |& ]: E6 i' l5 h//优先级:中+ d& D  o3 I/ h3 ~5 Y
DMA_DeInit(DMA1_Channel4);" M9 O( B! x/ q! }4 q8 Y6 R* ~
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
+ ^, ^; G0 D1 R& O; m4 \, q* `9 a: |- `DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;1 }, b2 r, j) T  o
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;' T" |) G/ c! t' }+ s
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;5 P& x! h* g' R+ ]' i! N- W. Y
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;0 U3 b0 E8 ^; P7 d. Q
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
* \, j# ~2 H0 `- T9 b- XDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  `4 D5 N' b& L
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
$ N3 E' Q/ F2 i" G9 A+ RDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
" N) |0 r" d- p: B$ W; i) n4 QDMA_InitStructure.DMA_Priority = DMA_Priority_Medium;% ^, H& G" |) I; S
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;1 \( h% \- ?- a
DMA_Init(DMA1_Channel4, &DMA_InitStructure);) c* c; t  O# k7 Q7 s1 B
}9 S$ @- `" U8 }" P
收藏 评论0 发布时间:2022-1-18 19:42

举报

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