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

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

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************
6 [2 f9 C4 f" a& I; O0 {* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()+ c( l8 B: m7 `! p  z) }
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输. J/ J" I& ~! l  _
* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,: Y6 i# k6 a: [. e, n( Y
* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART) g4 b( L0 z7 q
* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
* P+ K  C. f% b" D* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止
* b* w' ~& l( a* 串口依然发送,表明DMA传输是一个独立的过程。; N% P' k) }6 t
* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
5 K/ @, t% E! W- n' f* J5 {  l* 作者:jjldc(九九), ^. r3 E3 [" _. x( n
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
: G4 L) p/ C' B, `6 \+ d*******************************************************************************/" x% f/ c# U1 f1 o5 d; I( `& K. w0 r
/* Includes ------------------------------------------------------------------*/6 O6 B  p; {) N
#include "stm32f10x_lib.h"
8 k  |+ ]8 F8 u4 d#include "stdio.h"" R% ]( @) b/ T: j$ j# _6 o
/* Private typedef -----------------------------------------------------------*/' t% r7 S- a8 x3 H% V3 Q
/* Private define ------------------------------------------------------------*/
- o$ n+ C9 n. w8 b: e#define USART1_DR_Base  0x40013804
! l6 {0 z% R' d0 R4 ^% f/* Private macro -------------------------------------------------------------*/! N. ~2 d" ]! s$ A0 H
/* Private variables ---------------------------------------------------------*/  @2 h/ ^7 B5 |8 X, g3 x# f
#define SENDBUFF_SIZE   10240* N+ f9 b- Z4 U' u
vu8 SendBuff[SENDBUFF_SIZE];$ i0 l7 |, A: s6 e! E( S; M
vu8 RecvBuff[10];
$ ]* u0 i3 G: r8 Z$ _, Vvu8 recv_ptr;
) p/ k# j( q/ Z! D$ i9 `" H/* Private function prototypes -----------------------------------------------*/. p/ s! Z9 W5 h  U
void RCC_Configuration(void);; }  z, Y0 M2 z& _/ J& W
void GPIO_Configuration(void);# f3 n6 D$ g) `% w( e$ A
void NVIC_Configuration(void);4 h7 M' h' a- b& m. O9 c
void DMA_Configuration(void);
) F1 s; B; ], q7 C+ m9 ivoid USART1_Configuration(void);4 ~1 G9 _" S0 I- Y4 V! w4 I
int fputc(int ch, FILE *f);
! |# O8 a! u2 d1 b! F$ Qvoid Delay(void);
! O- e4 ]6 [0 W1 E5 f1 Z/* Private functions ---------------------------------------------------------*/, `; N) h" H& ~' G* g4 ^
/*******************************************************************************; t- @8 F  O6 e: e3 F! U
* Function Name  : main; J9 i# E: Z) B4 W
* Description    : Main program.
- [8 a  p7 I: v$ p; n. w* Input          : None; f8 M8 C4 @( e3 C& J! _% |
* Output         : None7 ^/ f& V0 `; ]6 K7 o* I
* Return         : None. K% L: q) `* C3 a' w
*******************************************************************************/
1 N; Q, n) [4 b6 [int main(void)( Q) }6 V& {+ S. U4 }, m/ E
{
8 E8 e! o, M; h6 i( ru16 i;; ~1 I: O/ g4 O) N' O
#ifdef DEBUG% t7 c0 J4 N& e1 N
debug();! D% e0 b( S0 H$ F
#endif
8 N* e: n7 Q" |* [* wrecv_ptr = 0;
: G5 u. E( R0 O, C% ARCC_Configuration();
4 b. b/ v% I$ JGPIO_Configuration();# u& J( s* t, K+ W4 c. K# d# e2 D, `
NVIC_Configuration();
3 I' b  u: m" X6 s: {' YDMA_Configuration();
- E& e" h) j. KUSART1_Configuration();' `( Y: t. L( ]) }* s  S& R) b
printf("\r\nSystem Start...\r\n");% J& y6 |0 ]- w7 x1 ]5 L
printf("Initialling SendBuff... \r\n");
! g3 \6 v1 H. ]% p- Efor(i=0;i<SENDBUFF_SIZE;i++)
- o6 G+ v; t1 X+ u$ ?" k$ C$ R{8 w  Y9 ~2 _8 U8 w! Z
SendBuff = i&0xff;$ N( Y; y: a8 n7 A. r: e
}9 G  ]* d  y+ |: D! o% _
printf("Initial success!\r\nWaiting for transmission...\r\n");
9 p: g4 y  B1 j2 @5 V' t  M//发送去数据已经准备好,按下按键即开始传输$ a8 Z4 m+ i+ x1 m1 m: ~  C
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));; R; b0 P9 d1 d, \2 U
printf("Start DMA transmission!\r\n");9 c1 n4 d6 [- C+ j! {
//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作/ {* R% [% a9 {2 B, p
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
  N0 X6 ?# |+ q//开始一次DMA传输!
( b+ \/ j/ Y! \DMA_Cmd(DMA1_Channel4, ENABLE);  w( ~2 A) L: }& b! W& i9 x
//等待DMA传输完成,此时我们来做另外一些事,点灯2 @5 C) p& l7 D( Z
//实际应用中,传输数据期间,可以执行另外的任务
6 U- a. Z' T3 |2 J/ d' u& B) O7 t" Cwhile(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
5 h! Z1 N3 I! H1 F7 |  S{
* X; i; `9 c  O( o# JLED_1_REV;      //LED翻转
% |$ L4 k% K. f( B) [8 X* tDelay();        //浪费时间
- \: E5 C. X5 m6 j% K}- f8 ?( P) {2 W' f. m% @
//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭! V" m, I/ d6 s' c' @2 x
//下面的语句被注释
; n7 f% k0 [  y6 L//DMA_Cmd(DMA1_Channel4, DISABLE);6 {( C" Q. e$ T% Z) t- }
printf("\r\nDMA transmission successful!\r\n");. s( F9 ^" w# W$ c$ `# F* [( I
/* Infinite loop */
7 F4 e# v+ [" x  F8 b. G+ ]3 dwhile (1)* H$ B; L0 X# D. r8 h8 g
{4 t1 ^. l' y' D7 p" U  w9 z* t
}8 n+ H$ `9 M8 G: G8 g, `  I* m# E
}
' `* [/ n$ ~2 @; A; O/*******************************************************************************& k5 M- e1 E( N0 z
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)/ q; d& G, ], f" y1 z" |; x" m* u
* Description    : 串口发一个字节
. t: P0 u. x9 Q* d1 {: \* Input          : int ch, FILE *f' _/ x* g' t4 W& [& n$ W6 u1 g
* Output         :
$ q% u8 \* t5 S* m  a- o, `; v* Return         : int ch5 }2 L; [% \7 U* v: x8 V
* 这个是使用printf的关键
/ _1 ^7 P0 z. O! b( ]7 z*******************************************************************************/
0 \- R+ z4 b8 p3 ^8 F! iint fputc(int ch, FILE *f)
- M3 w6 l! ^! ~* R+ o  N; D& \( n0 t{4 [$ h$ g/ }$ k4 V% ^; Y( V2 H& M
//USART_SendData(USART1, (u8) ch);& a! r7 ~& `* E2 `, X1 |
USART1->DR = (u8) ch;
* v, @4 m, _9 U6 f$ X/* Loop until the end of transmission */9 d2 }- Q# F& {& V) T
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)! K4 ]/ E: c2 ?3 r9 K
{
) e" b, _; i# G3 y! K5 H! K}3 N' {! s: g+ R& j. D$ S/ k
return ch;, D; z, G4 [, j/ {  o1 A, I" ?: _
}# N* A* |9 a# s. \1 j+ K, F
/*******************************************************************************# B$ u# ]# C! o: r! s9 T
* Function Name  : Delay
7 U3 P! l) P6 u6 r3 I& l3 u* Description    : 延时函数/ ]1 o/ Y  _4 \# d# v; y2 O& T
* Input          : None
; O7 |) }9 ^5 W& O% q3 g; x* Output         : None  d, b5 C+ n1 ]; ?$ c& `
* Return         : None2 u6 ^  \# j+ c" A( l: }3 t! @9 ^
*******************************************************************************/2 Z" K; S' ?8 p- {
void Delay(void)
1 C/ f8 }) O  J4 ^& C( l! ?: Q{$ |8 x9 z' }( q
u32 i;9 O: Q$ k2 _0 q
for(i=0;i<0xF0000;i++);
6 y) j" r* U) H6 c1 P; Jreturn;
; V3 m8 F! A" i4 p$ V}( C7 G/ d. J; Q
/*******************************************************************************, w/ Y( p% H. S5 m* u
* Function Name  : RCC_Configuration: M- j0 b( i  k2 D# ?* u9 B* c
* Description    : 系统时钟设置
- ~1 i6 W9 n4 K: ]8 ~6 J# t* Input          : None
5 x5 ^* o4 r4 C7 c! t& H3 ~0 Z( Q* Output         : None
9 n( j8 r+ u8 c& N" c+ _- a& Y, W; C* Return         : None: r5 m% a8 {+ [1 k" _* F
*******************************************************************************/2 d/ O; f3 `3 x5 m2 a0 c1 m
void RCC_Configuration(void)3 w4 I1 A8 M$ V- s4 J
{
+ G/ E7 w$ l- h$ R7 C' j' r) X! m, xErrorStatus HSEStartUpStatus;
  d, L" `; Q( Z* C. L//使能外部晶振' G1 a# b: Z  I5 b9 N- w/ Q- M5 N2 {( u
RCC_HSEConfig(RCC_HSE_ON);
8 u) N" j! q) Y( F//等待外部晶振稳定
7 z& o- `  L  R5 o5 S4 v* GHSEStartUpStatus = RCC_WaitForHSEStartUp();& L' t3 f1 {: s) D2 U
//如果外部晶振启动成功,则进行下一步操作
7 @2 t7 f- A0 k& X7 X0 dif(HSEStartUpStatus==SUCCESS); h- T" R8 P  W  X+ ^8 E% m# h
{# U" i( T& a; M* p, V
//设置HCLK(AHB时钟)=SYSCLK
" L. }, x. T; P+ HRCC_HCLKConfig(RCC_SYSCLK_Div1);2 L6 Z) ^3 ]2 I8 ^
//PCLK1(APB1) = HCLK/29 X' K9 p& D& F1 h) Z* r
RCC_PCLK1Config(RCC_HCLK_Div2);3 w6 p9 U4 J, K# ^1 _
//PCLK2(APB2) = HCLK7 W9 O# N* O. n
RCC_PCLK2Config(RCC_HCLK_Div1);
  l6 @- {4 [2 M4 K1 {9 ?- K' c1 B$ D//FLASH时序控制
9 L/ q  V2 c/ `//推荐值:SYSCLK = 0~24MHz   Latency=0
. F( t! j) g! x% d//        SYSCLK = 24~48MHz  Latency=1$ @' |0 [$ B6 R! a/ f/ Q
//        SYSCLK = 48~72MHz  Latency=26 Q6 C) Z1 z. o/ p0 y2 h
FLASH_SetLatency(FLASH_Latency_2);. p* i, _, ^, ^# I3 r# \& x2 w$ B
//开启FLASH预取指功能
) Q4 q  _# V( C& P5 fFLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
, Z, J* a! |% g6 u5 B- a$ m//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz, Z& N( q1 {. A0 G. S" E: c3 o
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
" b% i# f( c* q0 z//启动PLL
$ l3 s* s% e; B/ q6 Q4 VRCC_PLLCmd(ENABLE);, f9 x; P6 j5 X
//等待PLL稳定/ H$ c8 k" T# N9 p8 Y7 h+ L
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
& D/ \9 n5 O" `; X& ]9 m//系统时钟SYSCLK来自PLL输出
; T- e4 l& ^  m5 u3 z/ W5 V' n! A4 ERCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);% @8 h0 v# L. W: N
//切换时钟后等待系统时钟稳定8 |+ Y# C+ S+ o5 G' a/ Z- B+ c/ |
while(RCC_GetSYSCLKSource()!=0x08);
1 Y: B+ b, J/ t* m5 p1 B/*
2 \- X1 H3 [! m; @$ i3 p' N        //设置系统SYSCLK时钟为HSE输入$ v. k" P$ ?7 u0 }
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
: v! Z$ R, F4 K/ T" Y        //等待时钟切换成功4 {( d6 ?1 g4 E, c7 V
        while(RCC_GetSYSCLKSource() != 0x04);( L% n8 u7 I: f" W
        */
6 y4 x* v6 L; x" C, S5 n& }}  k7 W9 R) n7 d1 r/ |: {7 G
//下面是给各模块开启时钟
* X$ @2 b& ?% ~6 a: U/ E//启动GPIO
! a8 ^! a9 }- u+ LRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
: k* l, h7 S8 gRCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\, ?" X# J; y2 D& n$ c) O
ENABLE);3 o6 k/ d+ t8 q- ^
//启动AFIO
3 i. q  _0 @- ]! D* E& }7 O, M) IRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
' z, I( G7 u1 ^* V) b! G//启动USART1
/ D/ }6 W# G" l3 \& CRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
! A! t: j" e5 w//启动DMA时钟
, E+ z; H+ V, z# kRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
" j) ^; T3 U' ^6 q8 Y1 ]( e1 o}/ q% C0 `% u# v5 m
/*******************************************************************************# ^: Q: L* a) P( p4 E5 B  H
* Function Name  : GPIO_Configuration* |+ _; j# R) C- ]+ q7 G
* Description    : GPIO设置
# K# q: _6 n( o9 Y- h- r' d# _* Input          : None, U. }5 W/ h, j- ^& _, \
* Output         : None
0 `* X, ~+ R% _7 h# _. g* Return         : None; {: _4 U& [5 P/ G6 _: U' u
*******************************************************************************/
0 q7 r. d9 I2 g( l6 a9 Avoid GPIO_Configuration(void)
* N  ~. H8 D% E5 O' k8 B+ ~{
) n" w6 n* v6 vGPIO_InitTypeDef GPIO_InitStructure;
4 u' h) f2 Q$ @//PC口4567脚设置GPIO输出,推挽 2M
  g7 J7 ?1 f9 qGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
0 w  [- C4 L$ N# R4 s* Z; bGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;8 \; J; e3 M8 ]/ Y" s
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;/ g# ?4 [2 m' p
GPIO_Init(GPIOC, &GPIO_InitStructure);
' Q$ {+ U6 i9 u$ ], Q0 v//KEY2 KEY3 JOYKEY/ \8 e1 d' X( `: ^2 y3 J2 r0 t3 P! L1 R
//位于PD口的3 4 11-15脚,使能设置为输入) F, D6 [& C0 x# _% |5 g
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\" @( `& `. }9 g0 J; I) l
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
0 ^8 ]# s1 m7 h5 e8 {GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
8 `' {* R* m. t; C. p6 hGPIO_Init(GPIOD, &GPIO_InitStructure);; `! v* r6 F) p0 W1 w' E
//USART1_TX
6 [/ m) B/ D$ s6 r# ?6 g+ uGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;9 k2 N  Z/ z: P9 l1 I6 c8 I( P  D: o0 S
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" ^# f0 p5 a' h  v+ z# xGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
8 [2 N. L# U1 D/ bGPIO_Init(GPIOA, &GPIO_InitStructure);
; |. k0 _( d& {0 l1 _//USART1_RX
# p, k4 {3 W' J( g9 N, \' Q6 \GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;% a0 c$ g: t& a2 ?0 N9 o
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
! Y1 Q5 ?2 @, P" p5 PGPIO_Init(GPIOA, &GPIO_InitStructure);1 r* Z0 {5 ?1 f) A) B: Y, J! T$ e9 {
}
- j/ M: i6 f$ R/*******************************************************************************
) S# ]; }: G9 x+ A" L' ^- U! q) t* Function Name  : NVIC_Configuration$ I! J  Y" j$ y
* Description    : NVIC设置  f$ H3 J. k" T+ H9 `
* Input          : None
. L: c' M3 P# G& ?* Output         : None, V! N. W, F/ P( e3 K
* Return         : None+ S- P9 X1 U" c3 F$ Q
*******************************************************************************/
7 ~4 I- `/ g) q5 ^& evoid NVIC_Configuration(void)
- k' v; f6 f$ W0 N{2 R8 ]4 _4 U; u+ f7 M3 u( f
NVIC_InitTypeDef NVIC_InitStructure;  z3 a4 x, R) M! r; b/ E  ]" W- y
#ifdef  VECT_TAB_RAM4 m2 B8 D8 F9 @
// Set the Vector Table base location at 0x20000000/ d2 z7 [8 h. w/ W4 _0 ~" @: j
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
* S) ?7 ^' s2 H5 |& p5 e#else  /* VECT_TAB_FLASH  */* G9 [  W7 G+ ~1 k9 z6 p6 w6 m
// Set the Vector Table base location at 0x08000000! x6 y& ]3 l& S) m0 m4 T
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
4 o$ V0 X% N+ S* M$ b#endif! E% y; K$ {: \/ r7 C$ S
//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
  q. z6 P1 s. F2 c6 z2 GNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);2 s( N+ J% i/ L) W! b
//串口接收中断打开   3 F" W9 a6 l; i5 V; H$ @' O# R
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;' l: t- a3 |7 g7 H
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
+ e$ r) t6 K- h; B0 a1 BNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;4 p& E2 M3 [9 _; M
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;' e6 k4 z- k% ^: J( y+ g
NVIC_Init(&NVIC_InitStructure);! }+ a5 M5 }! f0 e6 L- T
}0 k/ L" @. |/ n( V+ n% L  ~/ I. p
/*******************************************************************************: K' X  B! }/ T( Z
* Function Name  : USART1_Configuration
' k5 _6 C1 ]9 e0 R5 x; O8 U* Description    : NUSART1设置4 R6 R9 E3 u0 g: i
* Input          : None& T6 c6 c/ H9 g1 f) i: E& X
* Output         : None
" R7 K& R6 l9 X1 [: V2 v6 I2 p$ f/ w* Return         : None
) v, Z) Z' d9 j) S4 i*******************************************************************************/( [0 z4 V" w) [6 j2 _
void USART1_Configuration(void)
+ L2 F9 P& b- g& {6 B7 ]{4 H) G# K+ M+ t& {" M
USART_InitTypeDef USART_InitStructure;5 D: c* Q) ]9 O) _6 ^4 x2 M- H
USART_InitStructure.USART_BaudRate = 9600;  d- k( n" _$ f
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
7 W8 f& @4 i* Z2 L6 X" e3 WUSART_InitStructure.USART_StopBits = USART_StopBits_1;4 ]$ k' y4 a& @1 v, Y
USART_InitStructure.USART_Parity = USART_Parity_No;9 Y1 h1 W: v8 A# t
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
' B4 n7 K( n. x  r( r- sUSART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;6 g! m  P  A) A3 {! n, ?
USART_Init(USART1, &USART_InitStructure);" d  D5 x) v9 U$ N/ d% T
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
% o! M! `( A1 {0 n+ DUSART_Cmd(USART1, ENABLE);
" B" x0 g! ^  P/ j' L2 t}4 p$ }7 Y" l8 c5 @
void DMA_Configuration(void)7 M% J( A1 _( \" N; z
{) s/ n3 M+ ~) e8 S! O" J) j7 z
DMA_InitTypeDef DMA_InitStructure;, `$ I. U% v8 b7 Y& d, B, z
//DMA设置:) D7 [+ l; ^0 B' K9 a, E4 C
//设置DMA源:内存地址&串口数据寄存器地址
& g8 ~; H7 d2 \, o" J1 ~//方向:内存-->外设
- S* n/ @* @4 W//每次传输位:8bit' `1 Y) i6 ]" v( j
//传输大小DMA_BufferSize=SENDBUFF_SIZE
. v! Z) B% R5 B# ]# `9 _9 B//地址自增模式:外设地址不增,内存地址自增16 ]' U3 \1 C4 D" P
//DMA模式:一次传输,非循环. i( y$ S6 f8 r" `! u, i) h
//优先级:中
/ t9 P5 V. x4 E9 T" c/ y) o5 b. c7 RDMA_DeInit(DMA1_Channel4);1 l2 @5 ^( g: T2 m
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
1 H- N% P& {5 k& ?DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
. r2 L  Q( [! ]DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;/ h) j0 L, c& j/ x
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
) J- ]6 i% C" S- m: V' vDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
0 {* y! p' z- FDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
# ~' f/ M* A- @$ [7 W$ ODMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;& l% Q7 y/ C( p2 q+ [
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;+ C% p0 ]' F1 G: v( W/ q% Q. s
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
( h, U+ b7 @" H5 qDMA_InitStructure.DMA_Priority = DMA_Priority_Medium;, G* z2 R) i. I; D, ^& }3 I
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;( t1 |$ w+ x1 T4 f
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
5 ~% Q2 ]( F. G/ p* G! a$ c; H. x}
3 l* l7 b. W8 V. a1 X
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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