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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************
- |( A' f- ?7 j* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()( V/ }- \- N9 i5 T5 D; J
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输9 z- W% j6 D; I+ F$ L5 @- Z
* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
8 k* r, F3 ?' ?2 q* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
/ W/ c6 D/ z. @$ Z* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
  v7 E) \4 p# D  j1 j; o; B* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止
( C, [0 e/ n2 h/ A. a$ S5 F* 串口依然发送,表明DMA传输是一个独立的过程。
' J& g, V6 V8 T9 a* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
1 P; W9 w/ ?' c" f/ G- o6 c5 b* 作者:jjldc(九九)
! t5 e& F, t" t6 X) T5 H" }* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6" N: l, I( z% c  d5 F6 U
*******************************************************************************/* B2 ?# d3 h7 _! w
/* Includes ------------------------------------------------------------------*/
3 d: G0 O! u2 l) j* f2 B#include "stm32f10x_lib.h"
2 A& u  ~$ ^8 ^/ X#include "stdio.h"
" I8 N5 E+ u+ \$ i. j/* Private typedef -----------------------------------------------------------*/) r3 W4 Z9 E4 J# r3 D
/* Private define ------------------------------------------------------------*/0 J  W+ }, ?' r; t/ a9 \- c
#define USART1_DR_Base  0x40013804! I3 E3 H1 e8 V
/* Private macro -------------------------------------------------------------*/2 l# V2 ?' }& h. X. P
/* Private variables ---------------------------------------------------------*/
) ?' e6 ?1 Q/ G3 s# L# m$ {#define SENDBUFF_SIZE   10240
7 O# z7 [( e+ L" y7 Hvu8 SendBuff[SENDBUFF_SIZE];
) z; o; {/ Z+ ^6 _/ W& f) g; jvu8 RecvBuff[10];$ _& y: l) I- R# u
vu8 recv_ptr;* }3 y% s* i2 x" d+ c& i' q1 k
/* Private function prototypes -----------------------------------------------*/, A! N  V* u+ q+ Z9 d( k1 i* ]: b
void RCC_Configuration(void);
& U  V5 k$ @# evoid GPIO_Configuration(void);0 k$ i1 `/ i7 L) p4 f# ]; _5 v
void NVIC_Configuration(void);3 C) B! `  h6 L/ U( X; ^' v
void DMA_Configuration(void);
6 J0 {3 B# h2 `" }6 Rvoid USART1_Configuration(void);
9 U. I! ]5 F" s$ M; \/ Wint fputc(int ch, FILE *f);
- ~8 V  h: L+ m/ c2 yvoid Delay(void);
& n7 o1 n- G7 M% j/* Private functions ---------------------------------------------------------*/
8 x& Y7 R) o  }2 v5 W) ^/*******************************************************************************
; D; y% M5 ]3 U# i+ X" |* Function Name  : main+ }4 A( W* b: g4 b: _+ D+ O
* Description    : Main program.0 Y+ e6 e) n9 [& A6 [; \
* Input          : None( D8 g! ]3 ^# ]! D- q
* Output         : None; C9 E7 ^4 d  G3 A0 _- ?# v$ s
* Return         : None( T4 a, _7 g( Q% {9 o) M! v- f
*******************************************************************************/" ?7 {! v* K& Q% g2 p' x
int main(void)
  t* F1 L0 Z8 e4 s; _( {$ l{
0 }( @5 N- ~  Z, B1 h  ?% eu16 i;
) H8 \4 m, j) @& `: S% B#ifdef DEBUG- {1 d; p, p5 _- o" Q) t
debug();
+ {& N2 |1 b+ [, E7 I#endif
% N" R4 x) n0 ?% E- \recv_ptr = 0;3 x4 r( l% i* h+ g( m; J" @
RCC_Configuration();
/ F: F5 l4 t0 U7 B9 TGPIO_Configuration();
& a% e, l/ o  r2 t! y2 oNVIC_Configuration();0 h. Q3 n' S# D2 h
DMA_Configuration();% H5 [: }/ W" v; B
USART1_Configuration();
: q% f% q* N  @" bprintf("\r\nSystem Start...\r\n");
4 \. x0 K4 Y5 [printf("Initialling SendBuff... \r\n");/ c& c+ x  G1 \" }( `- A
for(i=0;i<SENDBUFF_SIZE;i++)& @$ r9 E& |+ K! a* z5 |
{, x& _7 P5 ]: i! {: [, Z( f% j
SendBuff = i&0xff;% J4 u. c* n0 e! [2 L
}
  m5 @- B* d3 G5 Vprintf("Initial success!\r\nWaiting for transmission...\r\n");
) o$ Z, A) N; ~6 R1 Y  E' Z6 D//发送去数据已经准备好,按下按键即开始传输
" S+ E# Z% v' G6 ~( t8 F& Ywhile(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
5 c' ^$ M0 O# i5 A1 O3 t- _printf("Start DMA transmission!\r\n");
1 s8 l! Z# b4 J+ Y2 e//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作4 t9 k( a' `% A% f) ]2 O& U
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
5 I# D" K: R1 p; J  M- ~, f//开始一次DMA传输!
) m6 Y/ k; L3 Z- F2 l, _: |$ zDMA_Cmd(DMA1_Channel4, ENABLE);
* b# i! o+ u  V2 c2 X" w//等待DMA传输完成,此时我们来做另外一些事,点灯9 K9 }4 J; }0 E9 F
//实际应用中,传输数据期间,可以执行另外的任务
- R3 p' a: ]5 W0 uwhile(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)* t- D, x1 I4 ~5 Z- m
{" g! J2 U2 r8 @, B4 a9 L# g
LED_1_REV;      //LED翻转9 U8 v4 @3 C. o, ^' q
Delay();        //浪费时间
0 A$ L  \& F: b) l9 {}6 S+ r2 i0 x; K6 }* b! {2 d
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭" |6 z% X) H) x: T1 @
//下面的语句被注释' l5 F9 H5 ~. ]
//DMA_Cmd(DMA1_Channel4, DISABLE);
; N7 M( m7 M, q- }printf("\r\nDMA transmission successful!\r\n");* o9 W! B' S4 x+ W; H9 x0 G* N' F8 {2 ]
/* Infinite loop */
1 Y- {7 d5 N- P8 t) Q& r, wwhile (1)
% [- p7 \- j: F{
$ {, A2 F: D2 ?0 G, h: S, ?* j}
2 Z+ V' ?4 v8 j, p: U* t& c: S}% u: J6 x5 L) N7 o
/*******************************************************************************4 M6 H, u+ ^7 L7 }4 C0 e
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)( A* q$ e4 v& c
* Description    : 串口发一个字节
, \7 x" V( V6 W* Input          : int ch, FILE *f0 T% c& I; F- l1 f2 i7 s, J% O
* Output         :  S- P" _4 C1 f$ I
* Return         : int ch9 R5 R# e5 K5 h' ~- t2 N3 w
* 这个是使用printf的关键
- Y) U* e. I9 A6 x& I% ?  e*******************************************************************************/
1 j: I$ C- x- \int fputc(int ch, FILE *f)1 K8 _! t8 M+ `& I1 K6 l* u
{
5 N6 u$ N- }' U( y//USART_SendData(USART1, (u8) ch);
& b$ V) J6 R) ^9 u8 j& I  tUSART1->DR = (u8) ch;
+ U9 a0 v# R- R" U/* Loop until the end of transmission */
; o+ ]4 a0 L0 U! y0 Jwhile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)/ b& u- J" ]' S( k  d* a
{
, U% t* w* k0 Q- @0 ?9 m}
7 @# f/ o. }$ w0 R5 K' breturn ch;
, d4 v4 c1 }1 M1 _}
0 T5 U3 q# ^2 v- K2 \/*******************************************************************************
. o- X/ w- E- f2 q" e7 _+ E* Function Name  : Delay
: y$ Y( u/ E/ o$ x$ f0 F* Description    : 延时函数
& z0 m9 b; n2 D5 W8 v' `0 |1 {* Input          : None
  x7 I3 V$ O6 U# v; z( j* Output         : None2 ^( B" p8 T" C0 k; p' R  W
* Return         : None8 @9 h2 S( ~# X; ~* l0 X/ k0 G- G
*******************************************************************************/
! x4 a4 v5 m0 W# t# T' Svoid Delay(void). @$ f" a& j+ B! h
{
$ q* k- ^: c6 o2 I# R7 l8 ~u32 i;
1 A/ @# g. ~/ f3 i; o2 w5 S" ~( Zfor(i=0;i<0xF0000;i++);
; b+ H/ y2 D$ d- b( Rreturn;# c, p  ^# j) c. S# l. O. |; G& t2 C
}: ^' }1 ?) M6 o1 d. K* [  `
/*******************************************************************************
+ S9 B. p+ R% r* Function Name  : RCC_Configuration  I9 l) A6 h4 B, K
* Description    : 系统时钟设置
9 U9 ^: W+ I  U- W( _' x+ {" W& x. G2 s* Input          : None9 f5 g" t8 ~1 I+ l8 C: \. r
* Output         : None" R. {: N! G) Y' f
* Return         : None
3 f  V8 w# ?! Z2 A" D# z5 v; E*******************************************************************************/- S, K* g5 D  f) l
void RCC_Configuration(void)
! t3 r+ ^8 h: I; ^% P{
  W$ Q/ U# i9 H% a4 A: [% m( `( `ErrorStatus HSEStartUpStatus;
5 t0 x; l* A& K: I; X//使能外部晶振) e6 T. t. p. A0 i9 v
RCC_HSEConfig(RCC_HSE_ON);0 C, H! t3 n: j* s# t* s6 i4 L
//等待外部晶振稳定
( p2 J+ h  t; h; `/ xHSEStartUpStatus = RCC_WaitForHSEStartUp();- ~' P. E, I! X& u
//如果外部晶振启动成功,则进行下一步操作/ v0 }+ k8 E9 }. F" a
if(HSEStartUpStatus==SUCCESS)
: o0 Q5 X9 {: [, X5 u2 }0 u$ K{* {( z* G4 z) O6 s# G% \
//设置HCLK(AHB时钟)=SYSCLK/ w2 T" I; k% P/ y; g
RCC_HCLKConfig(RCC_SYSCLK_Div1);3 ~4 ^9 f) n! o* v/ T- T
//PCLK1(APB1) = HCLK/28 E3 c& z2 ?. G' U
RCC_PCLK1Config(RCC_HCLK_Div2);/ @3 ^6 Z; |  n/ M1 X3 G. o+ [& \* _
//PCLK2(APB2) = HCLK# i! n8 v. C  A) O4 p) B2 c; {
RCC_PCLK2Config(RCC_HCLK_Div1);
( _: ~; F- @6 [4 l! ~5 r//FLASH时序控制
7 Q* w1 ~  ^' p: q//推荐值:SYSCLK = 0~24MHz   Latency=0' t* `: t# E6 B" T3 \
//        SYSCLK = 24~48MHz  Latency=1
+ g7 K1 z4 t/ E7 M# U$ C//        SYSCLK = 48~72MHz  Latency=20 |0 a" P' _6 i( p8 u, Z$ T
FLASH_SetLatency(FLASH_Latency_2);
/ w) }! z6 W, S* t$ r4 c//开启FLASH预取指功能
& R- R, P9 F3 N& mFLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
4 E; `; S: j4 S//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
& H+ E6 d. P4 O' u6 S- ]; YRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
" p( Q' N/ ^* }' t# w//启动PLL
% U+ U$ m8 R. F7 [: GRCC_PLLCmd(ENABLE);
# G4 l1 A0 S4 H& b//等待PLL稳定& t0 S3 X- |0 l7 x" a! K
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);$ ^* T2 G' f# }$ y) L6 ~' X
//系统时钟SYSCLK来自PLL输出3 F5 r+ G, g; D2 m
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
1 @7 ~4 e2 C0 l% C//切换时钟后等待系统时钟稳定
* ]$ O8 m# Y  D1 N9 ]. @8 Ewhile(RCC_GetSYSCLKSource()!=0x08);
! P  b8 Z. t+ Q/*9 @, \( X  ^) s  V+ w% t, N6 h( G# M- P
        //设置系统SYSCLK时钟为HSE输入. y6 a4 f3 ?( F  E2 l
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
4 ]5 \! |) L5 ^$ n/ B        //等待时钟切换成功3 d+ C  F0 Q$ p# u9 ]
        while(RCC_GetSYSCLKSource() != 0x04);
  d* G. n( a5 P3 }9 N( W        */3 X$ E) |* F# R4 A( ]) y5 T
}1 y( ^7 R2 \3 w. w0 w6 C" a
//下面是给各模块开启时钟/ I+ W+ t' ?8 Q5 a
//启动GPIO7 m7 H0 k+ c  ~3 l
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
* ]6 L$ `+ k$ E; S& URCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
- s. [! b7 L# H( N0 fENABLE);
6 }4 x# B+ b; y& U4 r3 ~# X  _3 l//启动AFIO/ l0 [' M. L3 z
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);1 n3 S- a3 o" _( l2 V" F* }# A
//启动USART1, Q" q4 v1 W7 o; W! O* _0 p- t/ O
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
$ Z8 Y! \3 ]+ \5 }- d//启动DMA时钟: `% i! Z- S( {0 x
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
2 f6 G& t9 @) Q; }% J}+ G& S6 m/ X1 u  e% |* D) L: s
/*******************************************************************************
( ]  ~# k/ i! O2 o* Function Name  : GPIO_Configuration% _2 F1 r* p$ F$ p; S& q+ q. F
* Description    : GPIO设置' I4 l1 r/ v$ w2 z) L
* Input          : None, L$ }& N3 h( R. t+ N3 [% Q3 |
* Output         : None# `% C4 i/ Y& T6 v0 u. [2 @5 A
* Return         : None
8 r) n- F2 N, |( n! c$ Y" |*******************************************************************************/
( p6 @4 _  E* z; ovoid GPIO_Configuration(void)' x2 @, M. K' l" p) p
{
) A8 @' q; Z6 `GPIO_InitTypeDef GPIO_InitStructure;* J7 R+ x+ Z% Z8 Z
//PC口4567脚设置GPIO输出,推挽 2M/ y! G: s1 u, l3 k' _
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
1 M/ @0 \/ H' F9 i! ~GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;4 w2 \) Z" [, ^! P6 l/ N. ]
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
' D% ]8 X  g$ a) r/ i+ gGPIO_Init(GPIOC, &GPIO_InitStructure);
5 O8 M5 l- {2 G- ?' O: W2 j1 ~4 O//KEY2 KEY3 JOYKEY
$ p" g9 H7 k2 `//位于PD口的3 4 11-15脚,使能设置为输入
" o( K4 h- C) i9 eGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\
" G3 e! u' U. V, t: KGPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;- N; {) t( U: e& z2 p& Y. |6 f. q
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;% u0 j5 B: v7 m3 @  v
GPIO_Init(GPIOD, &GPIO_InitStructure);# z2 Y. @+ p) I$ E! D- c6 N
//USART1_TX" x. d( G0 k; R6 n) b. R* U' n
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;& h. W8 A* N* J$ J: n/ i
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
3 P0 g! N5 k/ I) G) zGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;* H* V9 `6 \1 @: \# A
GPIO_Init(GPIOA, &GPIO_InitStructure);
5 O1 c  G. K$ P  L, J* {/ N//USART1_RX
- [9 X8 j1 {7 \4 }GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+ w5 W& e9 K  _: y, e4 `. ^5 NGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;0 ~/ \  s0 q: S5 b, M9 u, W2 K
GPIO_Init(GPIOA, &GPIO_InitStructure);
7 N& ~6 ^) j% W4 q! m! L}
' E/ i' _  D- T) e/*******************************************************************************& g7 ?8 N0 _* T1 u3 k4 x" X" n
* Function Name  : NVIC_Configuration
- }, [& `0 D" w2 L1 b* Description    : NVIC设置
- v# {* q$ Z  P$ R% R* Input          : None0 c: e& H5 S; x6 }+ k- H
* Output         : None+ h2 j) F9 Z& l6 W0 Q2 C0 k/ s! x0 ^
* Return         : None! |  B* b6 v( O, z
*******************************************************************************/
* W7 |* K6 S( v. ]+ Vvoid NVIC_Configuration(void)
3 T6 T) T$ p  u% `{
+ b8 Z. Z1 x( @NVIC_InitTypeDef NVIC_InitStructure;
# I* N: M/ i5 k' \4 G' W#ifdef  VECT_TAB_RAM
1 r: D# Q7 R; m% e// Set the Vector Table base location at 0x20000000$ d* o) y, H. \- ?! T9 ^' B- y2 }
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);. a3 ^+ ~* K% ~
#else  /* VECT_TAB_FLASH  */
( `/ N3 [6 y6 g" J! d// Set the Vector Table base location at 0x08000000
& e6 |/ l& @3 U% x1 m% qNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);$ z, X: i% j7 ^$ ]1 j. B6 V+ @, n
#endif
6 f5 W1 T; q! H: B  @: [# q4 h//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
7 i/ H3 W5 S  A8 R4 _4 }NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
* t- C- o0 Q* h//串口接收中断打开   
3 k$ H$ M. B! }" @! }( Y, oNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;2 |' X6 v/ B. T$ ]- D% B1 D
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;( k4 ?+ }2 ?( S9 O3 b3 s1 C
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;- j; Y: a) S7 T0 F7 v7 _
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5 e3 r7 Z% o3 Q& tNVIC_Init(&NVIC_InitStructure);% ?# k8 P  s0 X2 B1 Y+ n. N- ^
}
7 }! @& Z0 t6 W( H" m' W/*******************************************************************************/ }' |, Z8 d/ v) M% r+ j* L
* Function Name  : USART1_Configuration" c* X1 M) J% ?! M
* Description    : NUSART1设置
' R. o! J& b, l4 G5 n; b* Input          : None6 z' h! Q5 C" k& K& c6 {
* Output         : None3 C: z9 S3 i2 u7 f- [3 I
* Return         : None
# V. F6 P+ v1 k* G0 e* a( W*******************************************************************************/
: Z+ s9 J: N. Z2 i9 h  ]& Fvoid USART1_Configuration(void)
% W: B* V2 |/ d5 Z7 V- P  z4 U3 e{; H: u- e3 p  @! F
USART_InitTypeDef USART_InitStructure;8 U, u% N. U0 j% }: s& \
USART_InitStructure.USART_BaudRate = 9600;& T1 c8 G; x7 G, O; i
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
; \5 |3 D  a$ ?0 W7 U$ F- TUSART_InitStructure.USART_StopBits = USART_StopBits_1;1 t9 a/ H0 \) U/ r) W2 z
USART_InitStructure.USART_Parity = USART_Parity_No;
% g, R1 ^2 @( z5 UUSART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;0 J/ o& V$ k6 n# J$ w
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
. F8 W2 r# i8 ^USART_Init(USART1, &USART_InitStructure);
9 P* ?5 ]& V3 v# M% h$ PUSART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
( z4 C' X: L. U8 ?2 K  v, ^( u1 DUSART_Cmd(USART1, ENABLE);
0 u1 r$ P# Q) h& {8 c}
8 h: G6 Y$ {& v0 ?9 I: hvoid DMA_Configuration(void)
7 D" s4 ]6 }+ y  V+ @{
0 d3 ]1 h6 J* X2 j' VDMA_InitTypeDef DMA_InitStructure;6 g$ n- R# Q& V5 N( k* X4 R2 }) H
//DMA设置:
1 q6 \6 v& ~* M2 c//设置DMA源:内存地址&串口数据寄存器地址) N& _5 L+ m) l% o
//方向:内存-->外设6 e$ [5 X$ a6 t
//每次传输位:8bit$ c+ a6 R6 I$ f! n) c) g
//传输大小DMA_BufferSize=SENDBUFF_SIZE
9 |2 s% T) k, Y1 k# U//地址自增模式:外设地址不增,内存地址自增13 g6 j- I& ?+ Q% ^- \+ s) j
//DMA模式:一次传输,非循环! q4 y$ e2 U* m) U: j) _
//优先级:中
. Q8 [/ O% ^& j$ r( X1 uDMA_DeInit(DMA1_Channel4);
2 `+ e9 R/ A1 A: SDMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
3 ]. N9 u0 g2 F. P$ X# \DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;9 I5 \# \* H& E7 Z& X- j- P
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;. f0 b2 w1 N! [/ W- E  ^
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
& H8 z1 d5 T5 `5 r7 PDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/ o6 p! K" f! g( [. \
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
6 N0 O: w9 C* C. d8 e, o2 s  Z9 s4 qDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
. f7 r# L# z  HDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
! L- J9 t  l$ ]' m" BDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
+ Z( e9 E% @7 N0 [1 ^+ EDMA_InitStructure.DMA_Priority = DMA_Priority_Medium;- Y- W$ F/ d  d7 Y1 ~6 n
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;1 ~! \/ V6 a' Y8 W5 G; \+ d5 E& f
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/ r# `% \1 ]% P7 v3 o0 h$ J}0 b3 Y; m, I7 Z5 u# \$ D
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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